【问题标题】:shouldStartLoadWithRequest delegate used for Objective-C method call用于 Objective-C 方法调用的 shouldStartLoadWithRequest 委托
【发布时间】:2012-12-26 13:34:13
【问题描述】:

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

UIWebView Secrets

UIWebView JavaScript to Objective-C communication

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

【问题讨论】:

  • 问题是你的 javascript 和你的应用程序之间的唯一入口是UIWebView,如果你想向你的应用程序发送一些东西,它必须通过 shouldStartLoadWithRequest,这是你的地方使用 iframe 捕捉它。我很确定没有办法解决它
  • 感谢您的评论,但我正在努力使我的 js 在所有平台上通用
  • 嗨伊斯梅尔我完全同意你所说的

标签: javascript objective-c dom-events hybrid


【解决方案1】:

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

shouldStartLoadWithRequest 方法依赖于使用自定义 URL 从网页与本机代码进行通信。点击一个链接,比如 hybrid://showMenu 将尝试在 web 视图中打开链接,并且委托将在 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) 祝你好运,请分享你的结果。

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多