UIWebView能与应用程序交互(沟通)吗?

我去使用UIWebView来显示dynamic内容,而不是本地使用UI元素。 是否有可能触发本地应用程序的function,只需简单地点击UIWebView内的链接? 例如:打一个链接,然后切换当前视图?

是的,这是可能的。 在你的html中,你写了一个JS来加载一个伪造的URL,如

window.location = "request_for_action://anything/that/is/a/valid/url/can/go/here"; 

然后,在你的iOS代码中,将一个委托分配给你的webView,然后在你的委托中处理

 webView:shouldLoadWithRequest:navigationType 

有类似的东西

 if( [request.URL.scheme isEqualToString: @"request_for_action"] ) { // parse your custom URL to extract parameter, use URL parts or query string as you like return NO; // return NO, so webView won't actually try to load this fake request } 

简而言之,您可以通过其他方式,让iOS代码通过使用您的HTML调用一些JS代码

 NSString* returnValue = [self.webView stringByEvaluatingJavaScriptFromString: "someJSFunction()"]; 

是! 当用户按下链接时,您可以在networking视图的代理中听到它,然后可以做任何你想要的。 强大的东西可以这样做。

web视图的委托被发送到webView:shouldStartLoadWithRequest:navigationType: 你可以分析发生了什么事情,并根据需要做出反应 为了防止Web视图试图跟随链接(毕竟这可能是完全假的),只需返回NO。

在这个来自TidBITS新闻应用程序的例子中,我在网页中有一个链接,它使用完全构成的play: scheme。 我发现,在委托和播放:

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)r navigationType:(UIWebViewNavigationType)nt { if ([r.URL.scheme isEqualToString: @"play"]) { [self doPlay:nil]; return NO; } if (nt == UIWebViewNavigationTypeLinkClicked) { [[UIApplication sharedApplication] openURL:r.URL]; return NO; } return YES; } 

实现UIWebViewDelegate方法webView:shouldStartLoadWithRequest:navigationType:

根据需要处理navigationType和请求。