WKWebView與JS交互遇到的問題

錯誤信息

Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo={WKJavaScriptExceptionLineNumber=1, WKJavaScriptExceptionMessage=SyntaxError: Unexpected EOF, WKJavaScriptExceptionSourceURL=http://192.168.31.116:3000/getCustomPage?page=appweb, NSLocalizedDescription=A JavaScript exception occurred, WKJavaScriptExceptionColumnNumber=0

js調用OC方法時,我在執(zhí)行這段代碼后報上面的錯誤(method 是js代碼)
[self.wkWebView evaluateJavaScript:method completionHandler:^(id _Nullable response, NSError * _Nullable error) {
            
            SLog(@"%@ %@",response,error);
        }];
造成這個錯誤的原因以及解決方案:
  • 1:你的js代碼書寫錯誤,我的js代碼中含有空格和換行符導致這個錯誤的產生.
  • 2:當你執(zhí)行- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler這個方法的時候一定要確認整個webView已經加載完成,所以這個方法應該寫在webView的這個代理方法里面- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation;

最后附上示例代碼

設置webView

  WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    config.preferences.minimumFontSize = 14;
    
    self.wkWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, SScreenW, self.view.bounds.size.height) configuration:config];
    self.wkWebView.navigationDelegate = self;
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://192.168.31.116:3000/getCustomPage?page=appweb"]];
    [self.wkWebView loadRequest:request];
    [self.view addSubview:self.wkWebView];
    
    WKUserContentController *userCC = config.userContentController;
    //JS調用OC 添加處理腳本
    
    [userCC addScriptMessageHandler:self name:@"getUserInfo"];
#pragma mark - WKScriptMessageHandler

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    SLog(@"%@",NSStringFromSelector(_cmd));
    SLog(@"%@",message.body);
    SLog(@"%@",message.name);
   //message.body 為js傳過來的參數數組
   //message.name 為js調用oc的方法名
   // getUserInfo 為js調用oc的方法名  [userCC addScriptMessageHandler:self name:@"getUserInfo"];
    if ([message.name isEqualToString:@"getUserInfo"]) {
        NSArray *array = message.body;
        NSString *methodStr = array.firstObject;
        _methodStr = methodStr;
    }
}
#pragma mark - WKNavigationDelegate
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    
    SUserModel *model = [[SUserInfoManager sharedManager] currentUserInfo];
    NSDictionary *dict = @{
                           @"Access_Token":model.Access_Token,
                           @"Avatar":model.Avatar,
                           @"UserName":model.UserName,
                           @"UserId":@(model.UserId),
                           //                               @"Remark":model.Remark,
                           };
// 將字典轉化成JSON字符串
    NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
    NSString *paraStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    // 將JSON字符串轉成無換行無空格字符串
    paraStr = [paraStr noWhiteSpaceString];
    NSString *method = [NSString stringWithFormat:@"%@('%@')",_methodStr,paraStr];
    SLog(@"%@",method);
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.15 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// OC 調用JS方法 method 的js代碼可往下看
        [self.wkWebView evaluateJavaScript:method completionHandler:^(id _Nullable response, NSError * _Nullable error) {
            
            SLog(@"%@ %@",response,error);
        }];
    });
    [SVProgressHUD dismiss];
}

noWhiteSpaceString

- (NSString *)noWhiteSpaceString {
    NSString *newString = self;
  //去除掉首尾的空白字符和換行字符
    newString = [newString stringByReplacingOccurrencesOfString:@"\r" withString:@""];
    newString = [newString stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 
    newString = [newString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];  //去除掉首尾的空白字符和換行字符使用
    newString = [newString stringByReplacingOccurrencesOfString:@" " withString:@""];
//    可以去掉空格,注意此時生成的strUrl是autorelease屬性的,所以不必對strUrl進行release操作!
    return newString;
}

method 的內容
getData('{"Access_Token":"zI1NiIsInR5cCI6IkCJ9.eyJzdWIiOiIzNjkxMDQxMTIiLCJqdGMzhmYmJjNC0xMTIwLTYwNy0yNjcxMzdiYzA4N2IiLCJpYXQiOjE0ODY1NDE5MzgsIk1lbWJlciI6Im5vcm1hbCIsIm5iZiI6MTQ4NjU0MTkzOCwiZXhwIjoxNDg3NzUxNTM4LCJpc3MiOiJhcHAuc2FtZWNpdHkucC5zYW1lY2l0eS5jb20uY24ifQ.ktcVYgZmkmnlxeTPT8r08H8hyrKdGy1vAfZxep6cA","UserId":304112,"Avatar":"http:\/\/ogo87xwp0.bkt.clouddn.com\/member\/avatar\/imgs\/girl.jpg","UserName":"用戶7871383550"}')

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容