强制WebView链接启动Safari?

时间:2010-03-28 09:41:09

标签: iphone ios uiwebview mobile-safari

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

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

感谢。

5 个答案:

答案 0 :(得分: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; 
}

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

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

答案 1 :(得分:20)

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

仅限于 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;
}

答案 2 :(得分:12)

我自己没试过,但我认为你可以实现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的类的实例。

答案 3 :(得分:1)

这是我们解决它的方法,将其添加到您的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;
}

答案 4 :(得分:1)

Brad Larson答案的快速版本:

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
    }
}