【问题标题】:Passing data to a webview in ios 8在 ios 8 中将数据传递给 webview
【发布时间】:2014-09-16 11:59:19
【问题描述】:

我有一个在 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 我总是收到 about:blank

我知道 UIWebView 在 ios 8 中发生了变化,但我想保持与早期版本的兼容性。 你知道是否有可能在 ios 8 中做到这一点?最好的方法是什么?

非常感谢!

【问题讨论】:

标签: javascript objective-c uiwebview ios8


【解决方案1】:

我也遇到了这个问题。据我所知,在 iOS 8 的 UIWebViewDelegate 中更改 window.location.href 似乎不再触发 webView:shouldStartLoadWithRequest:navigationType:

我发现了这种替代方法:http://blog.techno-barje.fr//post/2010/10/06/UIWebView-secrets-part3-How-to-properly-call-ObjectiveC-from-Javascript/

本质上,您应该创建一个 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 的旧视图控制器。

【讨论】:

  • 这对我也有用。一定要修正原代码作者的拼写错误,并在第 2 行末尾添加关闭 ) 以关闭 setAttribute 方法。
  • 感谢@CliftonLabrum,已修复错字
  • 我和你一样对 IFRAME 使用完全相同的程序,但在委托中没有收到任何通知。任何的想法?当网站第一次加载时shouldStartLoadWithRequest 被调用。
  • 以防万一有人想向目标 c 函数发送参数,不要使用 : 分隔它们,并调用类似 js-frame:myObjectiveCFunction#parameter 的东西。我收到 about:blank 因为我使用的是 :parameter
【解决方案2】:

我使用了 SeanR 方法,这很有效。

无论如何,您应该修复一个小的语法错误,即 frame:myObjectiveCFunction 之后缺少的 )。

【讨论】:

  • 感谢@salvabalza,错字已修复
猜你喜欢
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2020-09-06
  • 2021-09-13
  • 1970-01-01
相关资源
最近更新 更多