美文网首页iOS表格绘制
#iOS笔记#使用WKWebview与iOS交互避免踩坑

#iOS笔记#使用WKWebview与iOS交互避免踩坑

作者: MAXcrazs | 来源:发表于2020-02-19 16:39 被阅读0次

    1WKWebview的使用

    1.1导入<WebKit/WebLit>

    @property(nonatomic,strong) WKWebView *contentWebView;

    1.2configuration

    WKWebViewConfiguration * config = [[WKWebViewConfiguration alloc] init];    

    WKPreferences* prefierences = [[WKPreferencesalloc]init];

    prefierences.javaScriptCanOpenWindowsAutomatically = YES;    

     prefierences.javaScriptEnabled=YES;        //可以相应web的JS

    config.preferences= prefierences;

    self.contentWebView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];

    2存在的坑

    2.1 缓存问题

    前端在更改了页面之后,由于缓存,导致请求的页面没有更新。可能会出现代码没有问题,逻辑也没问题,但就是无法进行交互的情况。暴力的方式就是,直接在模拟器上删除APP,然后重新运行。

    2.2页面无法跳转

    实现WKNavigationDelegate协议

    - (void)webView:(WKWebView*)webViewdecidePolicyForNavigationAction:(WKNavigationAction*)navigationActiondecisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler {    decisionHandler(WKNavigationActionPolicyAllow);

    //allow或者cancel

    }

    2.3JS调用原生

    2.3.1添加对js方法的监听

    [self.contentWebView.configuration.userContentController addScriptMessageHandler:self name:@"{{function_name}}"];

    // 移除方法  [self.contentWebView.configuration.userContentController removeScriptMessageHandlerForName:@"{{function_name}}"];

    2.3.2前端页面的代码

    window.webkit.messageHandlers.{{function_name}}.postMessage("")

    postMessage("")表示传递了一个空字符串作为参数。如果iOS不需要参数,也请传一个空字符串或者NULL,如果写成postMessage(),会导致iOS无法监听到这个方法

    2.3.3iOS处理JS的“请求”

    #pragma mark - WKScriptMessageHandler

    - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{

    if ([message.name isEqualToString:@"{{function_name}}"]) {

            NSString*idStr = message.body;   //传过来的参数,

     }elseif(){

    }

    2.3.4iOS调用JS方法

    NSString*jsFunction = [NSStringstringWithFormat:@"{{other_function}}('%@')",jsonStr];

    [self.contentWebViewevaluateJavaScript: jsFcuntion completionHandler:^(id_Nullabledata,NSError*_Nullableerror) {

        }];

    {{other_function}}表示你想调用的web里面的js方法,jsonStr代表传过去的值,是一个字符串,其他类型的参数不确定是否能调用,最终合成一个string 让iOS去处理

     注意:{{function_name}} ,{{other_function}} 应该换成和前端约定好的字段,最终的代码不带{{}}

    2.4内存不释放

    [self.contentWebView.configuration.userContentController addScriptMessageHandler:self name:@"xxx"];

    的addScriptMessageHandler:self 可能导致一个循环引用 self->web view->config->userContentController->self,造成self无法正常dealloc,可以调整为在viewwillappear:中添加JS监听,在viewDidDesappear中移除这个监听。

    相关文章

      网友评论

        本文标题:#iOS笔记#使用WKWebview与iOS交互避免踩坑

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