关于如何从JS在UIWebView中运行到托管obj-c应用程序进行通信的建议

Suggestions for how to communicate from JS running in a UIWebView to the hosting obj-c app?

本文关键字:应用程序 obj-c 通信 JS 于如何 UIWebView 运行      更新时间:2023-09-26

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

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

谢谢

我总是使用一种方法,让应用程序"导航"到一个特殊的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也非常合适。

如果有一个标准或标准的方法来做这件事,我显然错过了。

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

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

回调最好像MVDS提到的那样通过Url:

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

我刚刚创建了一个库,它将主要使用mvds和Ondrej描述的方法为您提供这种通信。包括双向通信,jQuery事件风格,可选的JSON有效负载和多个监听器。查看链接:https://github.com/tcoulter/jockeyjs

也许通过改变url哈希?