BAD_ACCESS

おもにiOS、ときどき変な電子工作、ガジェット話。

URLスキームによるアプリの起動とAppDelegate内の処理について

バグを直していて改めて確認することがあったのでメモ。
iOSのバージョンによって違いがあるかもしれないが、後ほど調べてみる。

調査ケース

(1) アプリがバックグラウンドで生きている状態。
(2) アプリがバックグラウンドで完全に死んでいる状態。

調査するメソッド

(A)- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
(B)- (void)applicationDidFinishLaunching:(UIApplication *)application
(C)- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

アプリの条件

(i)アプリがマルチタスクに対応していない。
(ii)アプリがマルチタスクに対応している。

(i)アプリがマルチタスクに対応していない。

この場合、原則(c)のhandleOpenURL:は呼ばれない(バックグラウンドに存在する場合のみにコールされる仕様)

(ii)アプリがマルチタスクに対応している。

(B)と(C)のメソッドで記述されている場合。handleOpenURL:が呼ばれることで別アプリからの操作を受け付ける。
(A)と(C)のメソッドで記述されている場合。調査ケース「アプリのバックグラウンドでの状態」によって呼び出され方が変わってくるようだ。

(1) アプリがバックグラウンドで生きている状態。

アプリがバックグラウンドで生きているならば、わざわざ(A)のメソッドは呼ばずにそのまま(C)handleOpenURL:を呼ぶことで対応している。

(2)アプリがバックグラウンドで完全に死んでいる状態。

アプリが完全に死んでいる場合。一度(A)のメソッドが呼ばれた挙句、(C)handleOpenURL:が呼ばれる。

あらゆる条件によって呼ばれるメソッドが変わってくるようだ。よほど変な書き方をしてなければ迷うことが無さそうだが想定している動きと違うなと思ったら上記の条件を見なおしてみるといいかも。