iOS push 通知からブラウザ起動させる際に注意すること

push 通知からダイレクトにブラウザを起動させたとき、アプリが10秒くらい固まった後にようやくブラウザが起動する問題が起こりました。どうやら、Application Delegate の didReceiveRemoteNotification(※) や didFinishLaunchingWithOptions で [UIApplication openUrl] を呼ぶとアプリが固まってしまうそう。。

※ iOS8 からは didReceiveRemoteNotification ではなく以下に変更されてます。

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)notification

対応方法としては GCD(Grand Central Dispatch)を使って openUrl を呼び出すことで解決できます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[[UIApplication sharedApplication] openURL:url]];
});

GCD は iOS におけるマルチスレッドの手法の一つです。処理したいタスクを Block で渡すことで逐次実行します。dispatch_async を使うことでタスクの処理を非同期で実行してくれます。同期処理させたい場合は dispatch_sync。

なぜ固まるのか原因が定かではないですが、これによってスムーズにブラウザを起動させることができます。

 

※ Qiita へも投稿しました。

Objective-C - push 通知からブラウザ起動させる際に注意すること - Qiita