强制一个WebView链接启动Safari?

我在我的iPhone应用程序中embedded了一个UIWebView。 我想能够在该webview中的某些链接打开到完整的移动Safari浏览器应用程序(即不是我的embedded式版本)。

有没有一种简单的方法来构build我的一些hrefs来强制这个,而不是我的embedded式webview中的每个链接打开?

谢谢。

为了扩大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; } 

正如兰迪所说,你会想要在你设置为UIWebView的委托的任何类中实现这个。 只有select的URL才能启动Safari,您可以将其scheme从http://更改为safari://或类似方式,并且只将这些URL踢出系统(在用http://replace自定义URLscheme之后) 。

我在我的内部帮助文档(这是在UIWebView中显示HTML)中执行此操作,以便在应用程序中embedded通用Web浏览器时不会遇到审阅过程中的问题。

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

只有在你的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; } 

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

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

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