【问题标题】:Access the JavaScriptCore engine of a UIWebView访问 UIWebView 的 JavaScriptCore 引擎
【发布时间】:2013-11-08 23:04:18
【问题描述】:

我刚刚在 iOS7 中发现了一个可用的新框架:JavaScriptCore。

看起来很棒,但我如何访问 UIWebView 的运行时/上下文?

【问题讨论】:

    标签: ios objective-c uiwebview javascriptcore


    【解决方案1】:

    对此没有官方机制。但是我知道有两种方法可以获得JSContext。我可能不会在运输应用中使用任何一种。

    1. 使用 KVC 访问内部 UIWebView 属性。在这篇博文中有详细解释:http://blog.impathic.com/post/64171814244/true-javascript-uiwebview-integration-in-ios7
    JSContext *ctx = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    1. 通过类别将魔法方法添加到NSObject。更详细的解释,在这里:https://github.com/TomSwift/UIWebView-TS_JavaScriptContext
    @implementation NSObject (magic)
    - (void) webView: (id) unused didCreateJavaScriptContext: (JSContext*) ctx forFrame: (id) frame
    {
        // ...
    }
    @end
    

    【讨论】:

    • 优秀。容易出错但仍然很好。我不明白为什么 Apple 没有揭露这一点。
    • 看起来很有趣!希望它很快就会出现在公共 API 中。在那之前,我会尝试你的解决方案:)
    • 你在 GitHub 上的代码看起来很有趣,但没有许可证——你有机会澄清一下许可证吗?
    【解决方案2】:

    您可能想查看开发者网站 (https://developer.apple.com/wwdc/videos/) 上的 WWDC 2013 会议视频,特别是“将 JavaScript 集成到本机应用程序”中引用描述“向@引入新的 Objective-C API 987654322@。iOS 开发人员现在可以将脚本集成到他们的应用程序中,而无需捆绑自定义语言解释器。此 API 建立在 Mac 上现有的 JavaScriptCore 的 C API 之上,使使用 JavaScript 进行编程更容易,更不容易出错。” 有一节介绍如何将其与WebView 一起使用,例如使用:-webView:didCreateJavaScriptContext:forFrame:

    【讨论】:

    • 这看起来只适用于 Mac OS X。
    【解决方案3】:

    JavaScriptCore 的存在使开发人员可以从 Objective-C 中使用 JavaScript 运行时。我知道访问 UIWebView 运行时的唯一方法是通过 stringByEvaluatingJavaScriptFromString: 方法,这显然不是很灵活。

    【讨论】:

      猜你喜欢
      • 2016-10-13
      • 2012-08-08
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多