shouldStartLoadWithRequest委托用于目标c方法调用

时间:2012-12-26 13:34:14

标签: objective-c javascript-events hybrid

我试图从javascript调用一个客观的c方法我没有使用任何库,如phonegap,我也成功调用了目标c方法,但为此我每次在调用之前创建一个iframe然后oly shouldStartLoadWithRequest委托被调用我只是按照以下链接

UIWebView Secrets

UIWebView JavaScript to Objective-C communication

但是如何在不调用webview委托shouldStartLoadWithRequest的情况下进行Objective-C方法调用

1 个答案:

答案 0 :(得分:0)

首先,这是一个非常大的问题。我现在正在开发一个相当大的混合解决方案,重要的是要了解混合应用程序的本机部分如何在所有目标平台上运行,然后才能使js在所有平台上通用。

shouldStartLoadWithRequest方法依赖于使用自定义URL从网页与本机代码进行通信。单击链接,例如hybrid:// showMenu将尝试打开webview中的链接,并且委托将在shouldStartLoadWithRequest中拦截此调用。此时,您将识别出呼叫并执行您想要的任何操作,例如显示菜单并告诉webview停止加载。

在BlackBerry(至少在v10之前)和Android(很可能是Windows Phone)上都有相同的功能。 PhoneGap正在跨平台使用这种技术。所有这些函数都能够捕获hybrid:// showMenu调用。它们都以不同的方式运行,您必须自己进行研究以获取代码,但我可以确认在不同的本机shell中使用相同的Javascript是绝对可能的。

使用iframe来加速Javascript是正确的,但是为了获得最佳性能,还需要做其他一些技巧。它们对于每个浏览器都有所不同,因此如果您希望获得最佳性能,您的Javascript必须至少在不同平台上有所不同。这是一篇关于如何在iOS上获得良好性能的好文章:

iOS Hybrid App primer from CocoaControls

现在,如果您仍然希望避免使用URL和webview委托来在JS和本机代码之间进行通信,那么您可以使用更复杂的使用WebSockets的路径。

为此,您必须在每个本机包装器中包含一个WebSocket服务器库,以便侦听本地连接。然后你的Javascript将包含一个WebSocket客户端库,它将用于将消息传递给本机代码。双向通信是可能的。您的JS在各个平台上或多或少都相同。

我自己没有实现这种方法,因为它对于我需要的东西来说太过分了,但是LinkdIn的混合应用程序正在使用它。更多信息:

LinkdIn's Hybrid App diary

如果你选择(2)祝你好运,请分享你的成绩。