web-dev-qa-db-ja.com

Safariを起動するようにWebViewリンクを強制しますか?

私のiPhoneアプリ内にUIWebViewが埋め込まれています。そのWebビュー内の特定のリンクを完全なMobile Safariアプリに開くことができるようにしたい(つまり、私の埋め込みバージョンではない)。

埋め込まれたWebビュー内で開くすべてのリンクの代わりに、これを強制するためにいくつかのhrefを構造化する簡単な方法はありますか?

ありがとう。

41
tbacos

ランディの発言をさらに詳しく説明するために、これをアプリケーションで使用して、すべてのhttp://、https://、およびmailto:// URLを外部のSafariまたはMailアプリケーションで開くようにします。

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 
{
    NSURL *requestURL =[ [ request URL ] retain ]; 
    if ( ( [ [ requestURL scheme ] isEqualToString: @"http" ] || [ [ requestURL scheme ] isEqualToString: @"https" ] || [ [ requestURL scheme ] isEqualToString: @"mailto" ]) 
        && ( navigationType == UIWebViewNavigationTypeLinkClicked ) ) { 
        return ![ [ UIApplication sharedApplication ] openURL: [ requestURL autorelease ] ]; 
    } 
    [ requestURL release ]; 
    return YES; 
}

ランディが言うように、UIWebViewのデリゲートとして設定したクラス内にこれを実装する必要があります。選択したURLのみがSafariを起動するようにするには、それらのスキームをhttp://からsafari://などに変更し、それらのURLのみをシステムに送信します(カスタムURLスキームをhttp://で置き換えた後)。 。

これは、UIWebViewに表示されるHTMLである内部ヘルプドキュメント内で行います。これにより、アプリケーションに汎用のWebブラウザーが埋め込まれているレビュープロセスで問題が発生しなくなります。

60
Brad Larson

はい、分かりました。多分それは完璧な解決策ではないかもしれませんが、あなたはこのようにそれを行うことができます:

あなただけWebViewController.m

webView.delegate = self;viewDidLoadプロシージャに追加します。

- (void)viewDidLoad {
    webView.delegate = self;
    .... your code ....
}

次に、上記のようにController.mファイル内の任意の場所に、ブール結果の関数に従ってファイルを追加できます。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if (navigationType == UIWebViewNavigationTypeLinkClicked) {
        [[UIApplication sharedApplication] openURL:request.URL];
        return false;
    }
    return true;
}
20
aqm

私はこれを自分で試したことはありませんが、UIWebViewDelegateメソッドを実装できると思います

webView:shouldStartLoadWithRequest:navigationType 

これは、UIWebViewのリンクがクリックされるたびに呼び出されます。その方法では、クリックされたリンクがSafariを起動するかどうかを判断し、必要に応じてopenURLを使用する必要があります。

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

    // Check if this was a click event and then some other criteria for determining if you want to launch Safari.
    if (navigationType == UIWebViewNavigationTypeLinkClicked && [Some other criteria]) {
        [[UIApplication sharedApplication] openURL:request.URL];

        // Return false to indicate to the UIWebView to not navigate to the linked target
        return false;
    }

    // Return true so that the UIWebView loads the link target
    return true;
}

UIWebViewデリゲートプロパティを、UIWebViewDelegateを実装するクラスのインスタンスに設定する必要があることを忘れないでください。

12
Randy Simon

これは私たちがそれを解決した方法です、これをViewController.mファイルに追加してください:

    - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    first.delegate = (id)self;
                [first loadRequest:[NSURLRequest requestWithURL:[NSURL     URLWithString:@"http://my.FellowshipNWA.org?publicapp"]]];
}

// Add section below so that external links & PDFs will open in Safari.app
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request     navigationType:(UIWebViewNavigationType)navigationType {
    if (navigationType == UIWebViewNavigationTypeOther) {
        NSString *checkURL = @"http://my.fellowshipnwa.org/?givenowsafari";
        NSString *reqURL = request.URL.absoluteString;
        if ([reqURL isEqualToString:checkURL])
             {
                 [[UIApplication sharedApplication] openURL:request.URL];
            return false;
    }
        else {
            return true;
        }
    }
    return true;
}
1
Dwight Mix

ブラッド・ラーソンの回答の迅速なバージョン:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {

    var url: NSURL = request.URL!
    var isExternalLink: Bool = url.scheme == "http" || url.scheme == "https" || url.scheme == "mailto"
    if (isExternalLink && navigationType == UIWebViewNavigationType.LinkClicked) {
        return !UIApplication.sharedApplication().openURL(request.URL!)
    } else {
        return true
    }
}
1
Carl Sharman