美文网首页
iOS与js互调

iOS与js互调

作者: dequal | 来源:发表于2018-09-13 11:48 被阅读0次

项目中经常遇到App与h5互相调用的情形,这里分享一下经验(此处iOS用到的是WKWebView).

1.iOS调js

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *methodName;
    NSString *paraStr;
    [self.webView evaluateJavaScript:[NSString stringWithFormat:@"%@('%@')",methodName,paraStr] completionHandler:^(id _Nullable data, NSError * _Nullable error) {
        NSLog(@"");
    }];
    
    //webView设置
    WKUserContentController *controller = [[WKUserContentController alloc] init];
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    configuration.userContentController = controller;
    self.webView = [[WKWebView alloc]initWithFrame:self.view.bounds configuration:configuration];
    
    //注册 JS交互事件 (注意注册一定要写在viewDidLoad里面,写在viewDidAppear等方法里面在低版本调起本地相册时会出现问题)
    [self.webView.configuration.userContentController addScriptMessageHandler:self name:@"MKAPPWebViewRecommendJavascriptBridge"];
}
- (void)dealloc {
    //销毁写在dealloc
    [self.webView.configuration.userContentController removeAllUserScripts];
}
注意:

weiView执行JS代码时,总是没有效果,可是方法名与参数都没有错,代码如下:

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@('%@')", methodName, paraStr]];

其中字符串paraStr格式如下:

         {
            "serverId" : "1110",
            "roleId" : "1001",
            "roleVip" : "A",
            "appUId" : "100702140113",
            "roleName" : "王者荣耀",
            "roleLevel" : "A",
            "serverName" : "腾讯游戏"
          }

字符串为啥是这种怪格式呢?请继续往下看。。。
这个paraStr就是一个标准的Json串,实现方法如下:

+ (NSString*)getJsonWith:(NSDictionary*)dic {
    NSString *json = nil;
    if ([NSJSONSerialization isValidJSONObject:dic]) {
        NSError *error;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error];
        if(!error) {
            json =[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
        }else {
            NSLog(@"JSON parse error: %@", error);
        }
    }else {
        NSLog(@"Not a valid JSON object: %@", dic);
    }
    
    return json;
   }

之所以json串是那种怪格式,是因为[NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error];中的options是NSJSONWritingPrettyPrinted,苹果官网资料是这样说的“为了使打印出来的json串格式标准一些,添加了一些空格符号”。

发现之所以js代码不执行,是因为json串格式的问题,后来我将options改为 0,现在再来看一看json串的样子吧: {"serverId":"1110","roleId":"1001","roleVip":"A","appUId":"100702140113","roleName":"王者荣耀","roleLevel":"A","serverName":"腾讯游戏"}。 现在,才有一个字符串的样子嘛!此时我的js执行效果也可以看到了!

2.js调iOS

附带一种js调用iOS的方法:

    /**
     js调iOS的方法
     
     @param APPWebViewJSBridge 协议名 : iOS这边监听到的为message.name
     @param APPPara            参数   : iOS这边监听到的为message.body
     */
    //    window.webkit.messageHandlers.APPWebViewJSBridge.postMessage('APPPara');

相关文章

  • JS与OC交互

    iOS js oc相互调用(JavaScriptCore) iOS js oc相互调用(JavaScriptCor...

  • iOS与JS(二):MessageHandler(OC&

    参考:iOS下JS与OC互相调用(三)--MessageHandler iOS与JS的相互调用除了URL拦截(iO...

  • 菜鸟教程——iOS与JS交互相互调用

    iOS的系统框架JavaScriptCore可以实现JS与OC互相通讯,本文就简单说下iOS与JS交互相互调用...

  • iOS与js互调

    项目中经常遇到App与h5互相调用的情形,这里分享一下经验(此处iOS用到的是WKWebView). 1.iOS调...

  • IOS与JS互调

    web调用oc代码 1.引入#import 2...

  • iOSUIWebView与js的交互

    最近在iOS项目中需要使用到oc与js之间的相互调用,而且要求是实现方式必须与Android中的相同,方便js中统...

  • iOS与Safari联调

    iOS开发中,难免遇到与JS互调的情形,运用xcode只能看OC部分的代码,无法查看或者调试js端代码。此时Saf...

  • iOS与js的互调

    1.在iOS中调用HTML index.html 2.ios调用HTML2 3.在HTML中调用OCindex.h...

  • iOS OC与JS互调

    本文介绍的是WKWebView与JS之前的互调 WKWebView的基本设置,如下: JS的alert、confi...

  • 资料大放送

    个人认为比较详细易懂的文章 1. WKWebView ---简单实用,包含iOS与js方法相互调用 2. 取消...

网友评论

      本文标题:iOS与js互调

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