61

最近、UIWebView が ITMS リンクで窒息していることがわかりました。具体的には、アプリの UIWebView から、このようなサイトに移動して[App Store で利用可能] リンクをクリックすると、UIWebView は「Error Domain=WebKitErrorDomain Code=101 The URL can't be示した。」

少しグーグルで調べた後、アプリ リンクのリクエストをキャッチし、iOS で処理する必要があることに気付きました。スキームが の「itms」で始まるかどうかを確認することから始めましたが-webView:shouldStartLoadWithRequest:navigationType:、システムが処理できる他の種類のアプリ リンクがある可能性があることに気付きました。だから私は代わりにこれを思いついた:

- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error {
    // Give iOS a chance to open it.
    NSURL *url = [NSURL URLWithString:[error.userInfo objectForKey:@"NSErrorFailingURLStringKey"]];
    if ([error.domain isEqual:@"WebKitErrorDomain"]
        && error.code == 101
        && [[UIApplication sharedApplication]canOpenURL:url])
    {
        [[UIApplication sharedApplication]openURL:url];
        return;
    }

    // Normal error handling…
}

これについて 2 つの質問があります。

  1. これは正気ですか?具体的には、エラー ドメインとエラー コードをチェックし、userInfo から URL 文字列を取得しています。そのようなものは残っている可能性がありますか?
  2. これは上記のリンクのアプリ ストア リンクでは機能しますが、自分のアプリに戻ると、「フレームの読み込みが中断されました」というエラーで失敗した後続のリクエストがあったようです。どうすればそれを取り除くことができますか? からのリクエストをOSに処理させると発生しない-webView:shouldStartLoadWithRequest:navigationType:ので、ちょっと面倒です。

そのような要求をどのように処理しますか?

4

3 に答える 3

93

これが私が思いついたものです。ではwebView:shouldStartLoadWithRequest:navigationType:、次のように、可能な非 http および非 https 要求を処理するよう OS に要求します。

- (BOOL)webView:(UIWebView *)wv shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    // Determine if we want the system to handle it.
    NSURL *url = request.URL;
    if (![url.scheme isEqual:@"http"] && ![url.scheme isEqual:@"https"]) {
        if ([[UIApplication sharedApplication]canOpenURL:url]) {
            [[UIApplication sharedApplication]openURL:url];
            return NO;
        }
    }
    return YES;
}

これは、血まみれの「Frame Load Interrupted」エラーを除いて、非常にうまく機能します。false を返すwebView:shouldStartLoadWithRequest:navigationType:と、Web ビューはリクエストをロードしないため、処理するエラーはないと考えていました。しかし、NO上記に戻っても、まだ「Frame Load Interrupted」エラーが発生します。何故ですか?

とにかく、私はそれが無視できると仮定しています-webView:didFailLoadWithError::

- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error {
    // Ignore NSURLErrorDomain error -999.
    if (error.code == NSURLErrorCancelled) return;

    // Ignore "Fame Load Interrupted" errors. Seen after app store links.
    if (error.code == 102 && [error.domain isEqual:@"WebKitErrorDomain"]) return;

    // Normal error handling…
}

mailto:また、iTunes の URLや、アプリのリンクも正しく機能するようになりました。

于 2010-12-14T18:13:14.480 に答える
8

Theory のコードから始めて、"itms" スキームの URL を調べます (このメソッドは、リダイレクトのために複数回呼び出される可能性があります)。「itms」スキームが表示されたら、webView の読み込みを停止し、Safari で URL を開きます。私のWebViewはたまたまNavigationControllerにあるので、Safariを開いた後にそこから飛び出します(点滅が少なくなります)。

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request 
  navigationType:(UIWebViewNavigationType)navigationType 
{
    if ([[[request URL] scheme] isEqualToString:@"itms-apps"]) {
        [webView stopLoading];
        [[UIApplication sharedApplication] openURL:[request URL]];
        [self.navigationController popViewControllerAnimated:YES];
        return NO;
    } else {
        return YES;
    }
}
于 2011-08-08T18:31:40.030 に答える
-2

itms: リンクを処理するためにアプリを登録すると役に立ちますか?

http://inchoo.net/iphone-development/launching-application-via-url-scheme/

スキームで開始してもhttpitmsリダイレクトが発生する可能性があります。アプリがそのスキームを処理するように登録されていない場合、リダイレクトが失敗する可能性があります。

于 2010-11-28T23:14:06.860 に答える