技術開発日記

技術やら日々思ったことを綴ってます。

アプリ起動時のUIApplication#openURLの動作

Xcode5でビルドしたアプリをiOS7の端末で起動させると初回起動になぜかUIApplication#openURLが正常にブラウザを起動してくれない現象が発生。
正確にはアプリが起動して10秒ぐらい何も表示されない状態が続く。

ちなみにiOS6、Xcode4だと問題なし。
今のところ、以下のメソッド内で openURL を呼び出した時のみ上記問題が発生する。
・didFinishLaunchingWithOptions
・viewDidLoad
・viewWillAppear


原因はバグなのかAppleとしてもう(広告の計測のために)アプリ起動時にブラウザを開かせたくないのかわからないけど、とりあえず対応策としては非同期の別スレッドでUIApplication#openURLを呼ぶ出す形で対応。

+ (void)openURL:(NSURL *)url {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        if ([[UIApplication sharedApplication] canOpenURL:url]) {
            [[UIApplication sharedApplication] openURL:url];
        }
    });
}

ちなみにブラウザ起動でなく、単純に非同期でHTTP通信したい場合は NSOperationQueue を使うとよさそう。

参考:
http://thata.tumblr.com/post/20235526244
http://blog.tarunon.com/2013/09/ios7xcode5uiwebview.html