【问题标题】:Suggestions for how to communicate from JS running in a UIWebView to the hosting obj-c app?关于如何从 UIWebView 中运行的 JS 与托管 obj-c 应用程序进行通信的建议?
【发布时间】:2011-04-05 22:55:55
【问题描述】:

我计划有一个带有 uiwebview 的 shell iphone 应用程序,我的大部分应用程序通过 uiwebview 中的 javascript 运行。

现在我知道使用 stringByEvaluatingJavaScriptFromString 从 obj-c 环境到 javascript 环境进行通信很容易,但是有没有推荐的从 javascript 环境到 obj-c 世界的通信方式?

谢谢

【问题讨论】:

    标签: javascript iphone objective-c uiwebview


    【解决方案1】:

    我总是使用应用“导航”到特殊 URL 的方法:

    window.location = "myapp://somemessage/someargument";
    

    应用程序在以下函数中捕捉到这一点的地方:

    -(BOOL)webView:(UIWebView *)webView
                    shouldStartLoadWithRequest:(NSURLRequest *)request
                    navigationType:(UIWebViewNavigationType)navigationType
    {
        NSURL *url = [request URL];
        if ( [[url scheme] isEqualToString:@"myapp"] )
        {
            [self handleJSEvent:url];
            return NO;
        }
        return YES;
    }
    

    此外,根据您的需要,您可以使用某种事件队列,使用JSON.stringify(events) 获取该队列,以响应使用上述方法发送到应用程序的消息。对于从app到js的通信,JSON也很适合。

    如果有一个标准或标准的方法可以做到这一点,我显然错过了。

    【讨论】:

    • 根据我的谷歌搜索,我认为您已经描述了常见的“标准”,如果您愿意的话。太好了!
    • 不客气。除了我的直觉告诉我,这种方法也很可靠。
    • 非常感谢。很高兴知道这也是可靠的,这很重要。
    【解决方案2】:

    在 UIWebView 里面有一个很好的调用 javascript 的方法:

    [webView stringByEvaluatingJavaScriptFromString:@"yourJSFunction('some_data');"];
    

    回调最好按照 MVDS 所述通过 Url 完成:

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    

    【讨论】:

      【解决方案3】:

      我刚刚创建了一个库,它主要使用 mvds 和 Ondrej 描述的方法为您提供便利。包括双向通信、jQuery 事件样式,以及带有多个侦听器的可选 JSON 有效负载。看看吧:https://github.com/tcoulter/jockeyjs

      【讨论】:

        【解决方案4】:

        也许通过更改 url 哈希?

        【讨论】:

        • 你的意思是 blah.com/something.html#HASH 吗?我注意到这种方法,这是否涉及捕获 shouldStartLoadWithRequest 事件?
        猜你喜欢
        • 2012-05-06
        • 2019-01-06
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 2020-06-21
        • 1970-01-01
        相关资源
        最近更新 更多