Ben*_*tte 38
我的答案,这是我在Android WebView的堆栈溢出中找到的答案.但实际上,两个webview都有相同的问题和相同的(脏)修复:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
if ([request.URL.absoluteString hasPrefix:@"newtab:"])
{
// JS-hacked URl is a target=_blank url - manually open the browser.
NSURL *url = [NSURL URLWithString:[request.URL.absoluteString substringFromIndex:7]];
[[UIApplication sharedApplication] openURL:url];
return true;
}
return true;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
// JS Injection hack to solve the target="_blank" issue and open a real browser in such case.
NSString *JSInjection = @"javascript: var allLinks = document.getElementsByTagName('a'); if (allLinks) {var i;for (i=0; i<allLinks.length; i++) {var link = allLinks[i];var target = link.getAttribute('target'); if (target && target == '_blank') {link.setAttribute('target','_self');link.href = 'newtab:'+link.href;}}}";
[webView stringByEvaluatingJavaScriptFromString:JSInjection];
}
Run Code Online (Sandbox Code Playgroud)
这解决了在safari中打开的target ="_ blank"问题,并且在webview中保持打开标准链接.
wedo解决方案的问题在于,所有链接都将在Safari中打开。
两种解决方案:
1-当target =“ _ blank”时,JavaScript回调到Objective-C
为了解决您的问题,您需要在所有链接上添加一些javascript,检查它们是否具有_blank属性,然后从JavaScript调用Objective-C代码并运行:
[[UIApplication sharedApplication] openURL:myUrl];
Run Code Online (Sandbox Code Playgroud)
我个人不喜欢这种解决方案,因为它包含很多代码,回调,复杂性以及一些棘手的问题……
2-检查url参数
如果可以访问HTML代码(在两种解决方案中都需要访问HTML),建议您删除target =“ _ blank”并添加参数?openInSafari = true
在UIWebViewDelegate中添加以下代码:
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if (navigationType == UIWebViewNavigationTypeLinkClicked) {
NSURL *url = [request URL];
NSDictionary *param = [url queryParameters];
NSString *openIsSafari = [param objectForKey:@"openInSafari"];
if ( openIsSafari!= nil && ([openIsSafari isEqualToString:@"true"] || [openIsSafari isEqualToString:@"1"])){
[[UIApplication sharedApplication] openURL:url];
return NO;
}
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
此解决方案的一个好点(不好?)是,如果链接x级别更深,仍然可以打开指向Safari浏览器的链接
<a href="http://www.google.com?openInSafari=true">Google in Safari</a>
Run Code Online (Sandbox Code Playgroud)
始终在URL中添加协议(http,https ...)
| 归档时间: |
|
| 查看次数: |
25022 次 |
| 最近记录: |