42

私は現在、ウェブページを表示するためにブラウザを開く必要があるアプリを開発しています。これを行うには[UIApplication sharedApplication] openURL、URL でメソッドを使用します。

iOS 6 ではこれは完全に機能しますが、iOS 7 ではアプリが 10 秒以上フリーズしてからブラウザが開き、すべて問題ありません。

これは、アドホック プロビジョニングを使用して行われます。インターネット上の誰かが、これは既知の問題であるとコメントしましたが、この問題に関して私が見つけたコメントは 1 つだけでした。

4

11 に答える 11

94

iOS 7 以降、アプリケーション デリゲート didReceiveRemoteNotification: または didFinishLaunchingWithOptions: から -[UIApplication openUrl:] を呼び出したときに同じ問題に気付きました。

GCD を使用して呼び出しを少し遅らせることで解決しました:

// objc
dispatch_async(dispatch_get_main_queue(), ^{
    [[UIApplication sharedApplication] openURL:url];
});

これにより、iOS はアプリケーションの初期化を完了するのに時間がかかり、呼び出しは問題なく実行されます。理由を聞かないでください。

これはうまくいきますか?

この答えはよく見られるので、迅速なバージョンを追加しました:

// swift
dispatch_async(dispatch_get_main_queue()) {
    UIApplication.sharedApplication().openURL(url)
}
于 2013-11-05T14:59:43.800 に答える
6

上記のすべての人からのアドバイスに感謝します。これが、Xamarin.iOS (および Xamarin.Forms) で解決した方法です。このソリューションは、上で議論した内容に触発されたものであり、同じ問題に直面しているが Xamarin を使用している他の人に役立つことを願っています。


[Register("AppDelegate")]
public class AppDelegate
{
     ....

 public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
 {
      // We do some logic to respond to launching app, and return to that app. 
      Task.Delay(500).ContinueWith(_ => {
            this.InvokeOnMainThread( () => {
                UIApplication.SharedApplication.OpenUrl(NSUrl.FromString(openUri));
            });
        });
 }

}

于 2016-03-08T07:52:36.003 に答える
5

非常に簡単なベンチマークを行った後、@lidsinkers メソッドが明らかに最速であることがわかりました。特に の遅延を に置き換えた0.1とき0.001

したがって、これを Swift コードに変換することにしました。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.001 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
            UIApplication.sharedApplication().openURL(url)
        }

完全な方法:

/// An attempt at solving 'openUrl()' freeze problem
func lidsinkerOpenURL(url: NSURL) {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.001 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
            UIApplication.sharedApplication().openURL(url)
        }
    }
于 2016-06-12T14:08:53.683 に答える
4

iOS 9 の場合

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

これは私のために働いたようです

于 2016-03-17T07:44:14.500 に答える
0

OSバージョンチェック付きのSwift 4.1。

DispatchQueue.main.async() {
  if #available(iOS 10.0, *) {
    UIApplication.shared.open(url)
  } else {
    UIApplication.shared.openURL(url)
  }
}
于 2018-07-26T09:28:49.163 に答える