我有一个在uiwebview component中加载网页的应用程序。我需要在uiwebview和web加载之间进行通信,反之亦然。
我的应用程序在早期的ios中运行正常(例如ios 7.x,6.x和5.x)但现在我已经尝试使用ios 8并且它不起作用。我可以将目标c的信息发送到javascript(使用stringByEvaluatingJavaScriptFromString :),但我无法从javascript接收信息。
为此,我使用了与此处相同的内容:ios pass values to native app。我的意思是,我实施:
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"URL: %@", [request URL]);
NSURL *URL = [request URL];
if ([[URL scheme] isEqualToString:@"newprotocol"]) {
// something
return NO;
}
return YES;
}
当我发送:newprotocol:// xxxxx我总是收到:空白
我知道ios 8中的UIWebView发生了变化,但我想保持与早期版本的兼容性。 你知道在ios 8中是否可以这样做吗?这样做的最佳方式是什么?
非常感谢!
答案 0 :(得分:6)
我也有这个问题。据我所知,在iOS 8的UIWebViewDelegate中更改window.location.href
不再触发webView:shouldStartLoadWithRequest:navigationType:
。
基本上,您应该创建一个IFrame并设置其位置以触发委托方法:
var iframe = document.createElement("IFRAME");
iframe.setAttribute("src", "js-frame:myObjectiveCFunction");
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null;
编辑:我仍然看到这个方法的奇怪问题,所以如果你使用它,YMMV。我最终将我的UIWebViews迁移到WKWebViews来解决问题:它比我预期的要少。我有条件地使用带有UIWebViews的旧视图控制器来向后兼容。
答案 1 :(得分:0)
我已经使用了SeanR方法,它正在运作。
无论如何,你应该修复一个小的语法错误,一个错过了):myObjectiveCFunction。