美文网首页
iOS与JS交互的方法

iOS与JS交互的方法

作者: 梦想不是遥不可及的 | 来源:发表于2023-05-22 18:01 被阅读0次

1.拦截url(适用于UIWebView和WKWebView)

2.JavaScriptCore(只适用于UIWebView,iOS7+)

3.WKScriptMessageHandler(只适用于WKWebView,iOS8+)

4.WebViewJavascriptBridge(适用于UIWebView和WKWebView,属于第三方框架

1.拦截url(适用于UIWebView和WKWebView)

(1)web调用原生:

和后端同事协定好协议,如jxaction://scan表示启动二维码扫描,jxaction://location表示获取定位。

实现 UIWebView 代理的shouldStartLoadWithRequest:navigationType:方法,在方法中对url进行拦截,如果是步骤 <1> 中定义好的协议则执行对应原生代码,返回false,否则返回true继续加载原url。

-(BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{if([request.URL.absoluteString hasPrefix:@"jxaction://scan"]){//调用原生扫描二维码returnNO;}returnYES;}

(2)原生调用 js

若(1)中扫描二维码结束后,需要把扫描结果返回给web页,直接调用UIWebView的stringByEvaluatingJavaScriptFromString:方法,或者WKWebView的evaluateJavaScript:completionHandler:方法。

[self.webView stringByEvaluatingJavaScriptFromString:@"scanResult('我是扫描结果~')"];

2. JavaScriptCore (uiwebview弃用)

3. WKScriptMessageHandler

现在很多 app 都是支持iOS8+,很多人使用WKWebView代替了UIWebView,但是WKWebView并不支持方法二。此时我们可以使用WKWebView的WKScriptMessageHandler

JS 与 iOS 约定好方法,用作 JS 在调用 iOS 时的方法,如 scan:

iOS 使用 WKUserContentController 的-addScriptMessageHandler:name:方法监听 name 为 scan 的消息;

JS通过window.webkit.messageHandlers. scan.postMessage()的方式对scan 方法发送消息;

iOS在-userContentController:didReceiveScriptMessage:方法中读取 name 为 scan 的消息数据 message.body。

-(void)setupWKWebView{WKWebViewConfiguration*configuration=[[WKWebViewConfiguration alloc]init];configuration.userContentController=[[WKUserContentController alloc]init];[configuration.userContentController addScriptMessageHandler:selfname:@"scan"];WKWebView*webView=[[WKWebView alloc]initWithFrame:self.view.frame configuration:configuration];webView.UIDelegate=self;}

h5:

window.webkit.messageHandlers.scan.postMessage()

实现WKScriptMessageHandler代理方法,当js调用scan方法时,会回调此代理方法:

-(void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message{if([message.name isEqualToString:@"scan"]){//调用原生扫码}}

iOS调用JS方式与方法一中一致,都是通过 WKWebView 的-evaluateJavaScript:completionHandler:方法来实现的。

4. WebViewJavascriptBridge 和 DSBridge

GitHub地址:

DSBridge-IOS

WebViewJavascriptBridge(ios)

可以参考一下这两个三方库的比较:

DSBridge vs WebViewJavascriptBridge

DSBridge是H5页面与Native之间通信的桥梁,它有如下特点:

跨平台;同时支持ios和android。

双向调用;js可以调用native, native可以调用js

不仅支持异步调用,而且页支持同步调用(dsbridge是唯一一个支持同步调用的javascript bridge)

支持进度回调,多次返回(常用于文件下载进度、计时器等)

Android支持腾讯x5内核

三端易用;无论是前端还是android或ios,使用都非常简单,极大的降低集成/学习成本

作者:6ffd6634d577

链接:https://www.jianshu.com/p/fec29596b8e7

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

网友评论

      本文标题:iOS与JS交互的方法

      本文链接:https://www.haomeiwen.com/subject/sfjtedtx.html