UIWebView可以与应用程序进行交互(通信)吗?

时间:2013-04-13 03:13:10

标签: ios objective-c cocoa-touch

我开始使用UIWebView来显示动态内容,而不是使用UI元素本地执行。是否可以通过简单地点击UIWebView中的链接来触发本机应用程序功能?示例:点击链接然后切换当前视图?

3 个答案:

答案 0 :(得分:23)

是的,这是可能的。在您的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()"];

答案 1 :(得分:9)

是的!当用户按下链接时,您会在Web视图的委托中听到它,然后可以执行任何操作。强大的东西可以通过这种方式完成。

网络视图的委托已发送webView:shouldStartLoadWithRequest:navigationType:。你分析发生了什么,并按你的意愿做出回应。为了防止Web视图尝试关注链接(毕竟可能完全是假的),只需返回NO。

在TidBITS新闻应用程序的这个示例中,我在网页中有一个使用完全构成的play:方案的链接。我在代表中发现并播放:

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

答案 2 :(得分:2)

实施UIWebViewDelegate方法webView:shouldStartLoadWithRequest:navigationType:

根据需要处理navigationType和请求。