强制一个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 } }
- 了解convertRect:toView :, convertRect:FromView:,convertPoint:toView:和convertPoint:fromView:方法
- 如何使用iOS 7的NSURLSession及其委托方法系列来接受自签名SSL证书以进行开发?
- 在iOS 7上本地validation应用内收据和捆绑收据的完整解决scheme
- 如何在XCode 4.2.1(SDK5.0)中安装较旧的iOS模拟器
- 静态单元和dynamic原型有什么区别?
- 当我运行pod安装时,我得到`master` repo需要CocoaPods 0.32.1,尝试更新但仍然在0.31
- iOS 9 – “尝试删除并重新加载相同的索引path”
- iOS7 UITextView contentsize.height替代
- Xcode进程启动失败:安全