强制WebView链接启动Safari?

tba*_*cos 41 iphone mobile-safari uiwebview ios

我有一个嵌入在我的iPhone应用程序中的UIWebView.我希望能够将该webview中的某些链接打开到完整的Mobile Safari应用程序中(即不是我的嵌入式版本).

是否有一种简单的方法来构建我的一些href来强制执行此操作,而不是在我的嵌入式webview中打开每个链接?

谢谢.

Bra*_*son 61

为了扩展Randy所说的内容,我在我的应用程序中使用这个来在外部Safari或Mail应用程序中打开每个http://,https://和mailto:// URL:

-(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; 
}
Run Code Online (Sandbox Code Playgroud)

正如Randy所说,你需要在你设置为UIWebView的委托的任何类中实现它.要只有选择的URL启动Safari,您可以将他们的方案从http://更改为safari://或类似的东西,并且只将这些URL发送到系统(在用http://替换自定义URL方案之后) .

我在我的内部帮助文档中执行此操作,该文档是在UIWebView中显示的HTML,因此在我的应用程序中嵌入了通用Web浏览器时,我不会在审阅过程中遇到问题.


小智 20

好,我知道了.也许它不是完美的解决方案,但你可以这样做:

只在你的WebViewController.m:

将该行添加webView.delegate = self;到该viewDidLoad过程:

- (void)viewDidLoad {
    webView.delegate = self;
    .... your code ....
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像上面描述的那样在 Controller.m文件后面的布尔结果函数中添加:

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


Ran*_*mon 12

我自己没试过,但我认为你可以实现UIWebViewDelegate方法

webView:shouldStartLoadWithRequest:navigationType 
Run Code Online (Sandbox Code Playgroud)

只要单击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;
}
Run Code Online (Sandbox Code Playgroud)

不要忘记您需要将UIWebView委托属性设置为实现UIWebViewDelegate的类的实例.