美文网首页
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');
    

    相关文章

      网友评论

          本文标题:iOS与js互调

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