当前位置: 首页 > 面试题库 >

iOS JavaScript桥

卞云瀚
2023-03-14
问题内容

我正在开发一个将同时使用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事件)

问题答案:

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

  • WebViewJavascriptBridge:https : //github.com/marcuswestin/WebViewJavascriptBridge
  • GAJavaScript:https://github.com/newyankeecodeshop/GAJavaScript

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

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调用然后将其拦截。

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



 类似资料:
  • 问题内容: 我必须创建一个可自动执行Outlook和Word的应用程序,并且想使用Java来完成该任务。(唯一允许的替代方法是VB6,所以…) 经过Google的快速调查后,我发现了几个库,但不确定使用哪个库: J-Interop SWT 雅各布 COM4J jacoZoom … 我不知道如何比较这些库并做出明智的决定。看来COM4J有点过时了,JACOB泄漏了内存(据说),而jacoZoom是商

  • 问题内容: 我一直在使用Java applet,它是一个 仅使用鼠标即可编写的applet 。就我而言,我尝试将其合并到我的 webiste项目中,如下所示: 当用户单击页面上的任何输入元素(文本框/文本区域)时,此 JAVA小程序将加载到网页本身上。在 下面显示的JAVA小程序的屏幕快照中,用户指向指向的字母,并且相应的文本被写入小程序的文本框中。 现在,我想做的是将文本从applet的Text

  • 问题内容: 我在Fedora Linux 17中以调试模式连接HTC Wildfire A3333时遇到问题。Adb说: 我的udev规则(适用于Samsung的第一条规则适用,适用于HTC的第二条规则则无效): 对于三星设备,一切正常: 问题答案: 造成此问题的原因与系统权限有关(感谢@IsaacCisneros的建议)。无论如何,HTCWildfire(也许还有其他)从系统中需要的东西比三星设

  • 问题内容: 我目前正在观察一个第三方库(即restfb)正在使用java.util.logging,即使我的logback.xml中没有配置SLF4J控制台附加程序,我也看到这些日志最终出现在STDOUT中。我的类路径中还有jul- slf4j 桥。安装网桥时,jul-to- slf4j网桥是否仅登录到由logback配置的附加程序,还是也登录到stdout? 问题答案: 您需要致电。您还需要在j

  • 问题内容: 从Java 8开始,JDBC-ODBC Bridge将不再包含在JDK中。 是否有其他解决方案连接JDBC-ODBC Bridge? 问题答案: 我们仍然可以在Java 8中使用JDBC-ODBC Bridge,只需遵循以下简单方法即可: 下载JDK 7或JRE 7。 转到JRE \ lib文件夹并找到rt.jar 解压缩(如果已安装WinRAR或7zip),也可以将其重命名为rt.z

  • 问题内容: 我正在将一个应用程序从Objective-C移植到Swift,我需要使用以下方法: 原来的逻辑看起来像这样(几个网站似乎对此表示同意): 借助免费的桥接功能,效果很好。但是,“快速空间”中不存在ARC,并且类型系统已更改。 如何将流转换为 然后在调用之后将它们转换回子类? 问题答案: 我可以使用它,这是我的代码:确保在某处保留连接类的引用:-)

  • 问题内容: 考虑私有C函数,该函数返回当前设备屏幕的快照: 我可以将其放在桥接标头中,然后在Swift中访问它,如下所示: MyApp-Bridging-Header.h MyClass.swift 有没有一种方法可以在不使用桥接头的情况下在纯Swift中访问? 最初的想法是在上创建扩展,但是该扩展希望我在扩展中声明函数的主体: 无论如何,这种实现都是有缺陷的,因为上没有方法。 在纯Swift中是

  • 问题内容: 我正在尝试使用GoogleidentityToolkit库来处理登录问题。我启用use_frameworks!在我的Pod文件中,但是找不到模块GITkit。我试图弄清楚发生了什么。据我所知,如果您使用“ use_frameworks”,则不需要创建任何桥接头文件,因为cocoapods将库向下编译为一个模块,因此以后您可以照常将其导入* .swift文件中。 在Swift中使用Goo