ios wkwebview与js交互

oc调用js的方法

直接调用即可,如果是做一些页面刷新的操作,最好在主线程操作,避免引起额外的问题。

        NSString *jsCode = [NSString stringWithFormat: @"shareAuth(%@)",status];
        [weakSelf.contentWebView evaluateJavaScript:(NSString *)jsString completionHandler:^(id response, NSError * error){
            
         }];

js调用OC方法

1注入js方法

    WKUserScript * userScript =
    [[WKUserScript alloc] initWithSource:(NSString *)injectSource
                           injectionTime:WKUserScriptInjectionTimeAtDocumentStart
                        forMainFrameOnly:(BOOL)NO];
    [self.contentWebView.configuration.userContentController addUserScript:userScript];

注入的代码需要和web开发人员提前商量好,要调用哪个类的哪个方法,比如web想调用MeetNativeToJsObject对象的openMeetMessageList方法,可以这么写js方法:

NSString * jsFormat = [NSString stringWithFormat:
                           @"var MeetNativeToJsObject={};"//定义调用方法的对象
                    @"MeetNativeToJsObject.openMeetMessageList=function(){"
                           @"window.webkit.messageHandlers.message.postMessage('{\"action\":\"openMeetMessageList\"}');"
                           @"};"
                          ];
如果需要接收web传给自己的参数,可以在方法括号内添加参数进行接收,比如:
@"MeetNativeToJsObject.openMeetMessageList=function(meetID){"
       @"var varMeetID = (meetID==undefined)?\"null\":meetID;"
        @"var strParameter = '{\"action\":\"openMeetMessageList\",\"parameter\":' + varMeetID + '}';"
      @"window.webkit.messageHandlers.message.postMessage(strParameter);"  
@"};"

2,设置接收方法的对象

[self.contentWebView.configuration.userContentController
     addScriptMessageHandler:(id)scriptHandler name:@"message"];

scriptHandler为遵守WKScriptMessageHandler协议的一个对象。
3,web调用该方法

MeetNativeToJsObject.openMeetMessageList = function() {
 window.webkit.messageHandlers.message.postMessage('{"action":"openMeetMessageList"}');
};
可以先创建MeetNativeToJsObject类型的对象,命名为:native,然后调用方法:native.openMeetMessageList();

4,在scriptHandler类中实现接收方法调用的代理方法

- (void)userContentController:(WKUserContentController *)userContentController
      didReceiveScriptMessage:(WKScriptMessage *)message{
      NSLog(@"name:%@ body:%@", message.name, message.body);
}

这里message.name为注入接收对象的name,message.body为传递的信息,比如像我上面注入的方法:"action":"openMeetMessageList"。

注意事项:1,需要等web页面加载完成后,再调用js的方法,不然调用方法时有时会失败;
2,最好在主线程对方法进行调用,不然有时会出现调用失败的情况。

你可能感兴趣的:(ios wkwebview与js交互)