我们的应用程序中有一项要求,我们必须在网络/本地边界之间进行通信 - 在UIWebView
中运行的JavaScript与应用程序中的ObjectiveC之间进行通信。
Web组件通过pagebus(订阅和发布机制)进行内部通信,并且要求本机组件也应该足够能够订阅这些事件并收听它们。
我们都知道从ObjectiveC拨打UIWebView
的唯一正式方法是通过stringByEvaluatingJavaScriptFromString
。从JavaScript调用的典型方法是设置window.location以在shouldStartLoadWithRequest:
委托上触发UIWebView
回调。但这对处理页面总线事件没有用。
Apple在iOS7中为我们提供了一个公共JavaScriptCore框架(WebKit的一部分),而JavaScriptCore提供了简单的机制来代理ObjectiveC和JavaScript“上下文”之间的对象和方法。
不幸的是,为了利用这个框架来实现我们的目标,我们需要webview的JSContext对象,但是没有实现它的机制。有一个堆栈溢出链接,我们发现有两种方法可以实现这一点(两者都没有记录)。
方法1:通过KVC获取JSContext
JSContext *ctx = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
方法2:
通过WebKit的-didCreateJavaScriptContext
委托回调获取JSContext。
请在下面找到参考链接 Why use JavaScriptCore in iOS7 if it can't access a UIWebView's runtime? 问题是我们可以在我们的应用程序中使用这些方法中的任何一种,这样我们的应用程序就不会在App Store中被拒绝 或者是否有任何其他机制来实现我们听取pagebus事件的目标?
答案 0 :(得分:0)
我认为苹果不会拒绝您的应用。我在我的应用程序中使用kvc从uiwebview获取jscontext并通过了应用程序审核。