小编典典

iOS JavaScript桥

javascript

我正在开发一个将同时使用UIWebView中的HTML5和本机iOS框架的应用程序。我知道我可以实现JavaScript和Objective-
C之间的通信。是否有任何库可以简化此通信的实现?我知道有几个库可以用HTML5和javascript创建本机iOS应用程序(例如AppMobi,PhoneGap),但是我不确定是否有一个库可以帮助创建使用JavaScript繁重的本机iOS应用程序。我需要:

  1. 从Objective-C执行JS方法
  2. 从JS执行Objective-C方法
  3. 监听来自Objective-C的本地JS事件(例如DOM ready事件)

阅读 594

收藏
2020-05-01

共1个答案

小编典典

有一些库,但是我没有在大型项目中使用任何库,因此您可能想尝试一下:

但是,我认为这很简单,您可以自己尝试一下。当我需要这样做时,我个人就是这样做的。您可能还会创建一个适合您需求的简单库。

1.从Objective-C执行JS方法

这实际上只是一行代码。

NSString *returnvalue = [webView stringByEvaluatingJavaScriptFromString:@"your javascript code string here"];

有关官方UIWebView文档的更多详细信息。

2.从JS执行Objective-C方法

不幸的是,这稍微复杂一点,因为Mac OSX上不存在相同的windowScriptObject属性(和类),因此两者之间无法完全通信。

但是,您可以轻松地从javascript自定义网址进行调用,例如:

window.location = yourscheme://callfunction/parameter1/parameter2?parameter3=value

并从Objective-C拦截它:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
   NSURL *URL = [request URL]; 
   if ([[URL scheme] isEqualToString:@"yourscheme"]) {
       // parse the rest of the URL object and execute functions
   } 
}

这虽然没有达到应有的效果(或使用windowScriptObject),但它可以工作。

3.收听来自Objective-C的本地JS事件(例如DOM ready事件)

从上面的解释中,您可以看到,如果要执行此操作,则必须创建一些JavaScript代码,将其附加到要监视的事件上,然后调用正确的window.location调用然后将其拦截。

同样,它不是很干净,但是可以工作。

2020-05-01