2

我正在尝试从 Javascript 调用 Objective-C 方法。我没有使用任何库,例如phonegap,我也成功调用了Objective-C方法,但为此我每次在调用之前创建一个iframe,然后只shouldStartLoadWithRequest调用委托我只是按照以下链接:

UIWebView 的秘密

UIWebView JavaScript 到 Objective-C 的通信

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

4

1 回答 1

0

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

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

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

使用 iframe 来加速 Javascript 是正确的,但您还需要采取其他技巧来获得最佳性能。它们因浏览器而异,因此如果您想要获得最佳性能,您的 Javascript 必须在不同平台之间至少有一点不同。这是一篇关于如何在 iOS 上获得良好性能的好文章:

来自 CocoaControls 的 iOS Hybrid App 入门

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

为此,您必须在每个将侦听本地连接的本机包装器中包含一个 WebSocket 服务器库。然后,您的 Javascript 将包含一个 WebSocket 客户端库,用于将消息传递给本机代码。可以进行两种方式的通信。您的 JS 在不同平台上或多或少是相同的。

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

LinkdIn 的混合应用日记

如果您选择(2)祝您好运,请分享您的结果。

于 2013-01-07T22:18:02.297 回答