派发事件时,发生 JavaScript 异常
wjiuxing opened this issue · 12 comments
我用的最新的 AjaxHook 代码(参照 #30 Ajax hook 与 NSURLProtocol)。
派发事件操作如下:
NSString *event = @"com.wjx.setting.xxx";
NSDictionary *userInfo = @{
@"action": event,
@"data": @YES
};
[_jsBridgeEngine dispatchEvent:event data:userInfo];
在 KKJSBridgeMessageDispatcher.m
202 行产生日志,为了看到更多信息,我修改了一下本地代码直接输出 error 替代 error.localizedDescription,
NSLog(@"KKJSBridge Error: evaluate JavaScript error %@, %@", error, messageJson);
日志如下:
KKJSBridge Error: evaluate JavaScript error Error Domain=WKErrorDomain Code=4 "发生 JavaScript 异常" UserInfo={WKJavaScriptExceptionLineNumber=0, WKJavaScriptExceptionMessage=TypeError: undefined is not an object, WKJavaScriptExceptionColumnNumber=0, NSLocalizedDescription=发生 JavaScript 异常}, {
data = {
action = "com.wjx.setting.xxx";
data = 0;
};
eventName = "com.wjx.setting.xxx";
messageType = event;
}
你是在初始化的时候调用的?
是的,发现 _jsBridgeEngine.isBridgeReady 是 NO,除了延迟一下,还有更好的办法吗?
你可以监听 _jsBridgeEngine.isBridgeReady 这个值
可以,感觉还不如延迟一下方便。。。
加个 ready 的 callback block 咋样?
嗯,这个也可以
我需要一个通知所有 webView 的事件,所以,我通过 [[KKWebViewPool sharedInstance] valueForKey:@"enqueueWebViews"]
来给每一个 webView 派发事件:
NSDictionary<NSString *, NSSet< __kindof KKWebView *> *> *dequeueWebViews = [[KKWebViewPool sharedInstance] valueForKey:@"dequeueWebViews"];
[dequeueWebViews enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSSet<__kindof KKWebView *> * _Nonnull webViews, BOOL * _Nonnull stop) {
[webViews enumerateObjectsUsingBlock:^(__kindof KKWebView * _Nonnull webView, BOOL * _Nonnull stop) {
if (!webView.hidden && webView.engine.isBridgeReady) {
[webView.engine dispatchEvent:notificationName data:data];
}
}];
}];
派发事件时,又遇见个异常问题
KKJSBridge dispatch event (null).com.wjx.sdk.setting.focusChanged: {
"followStatus" : 1,
"followPid" : "6463673832007184418",
"channel" : "profile",
"pid" : "6463673832007184418",
"myFollowStatus" : 1
}
我在 KKJSBridgeJSExecutor
打印了一下 javaScriptString:
window.KKJSBridge._handleMessageFromNative('{\"data\":{\"followStatus\":1,\"followPid\":\"6463673832007184418\",\"channel\":\"profile\",\"pid\":\"6463673832007184418\",\"myFollowStatus\":1},\"eventName\":\"com.wjx.sdk.setting.focusChanged\",\"messageType\":\"event\"}')
在第27行 -evaluateJavaScript:completionHandler:
回调中返回 Error 如下:
Error Domain=WKErrorDomain Code=4 "发生 JavaScript 异常" UserInfo={WKJavaScriptExceptionLineNumber=2, WKJavaScriptExceptionMessage=SyntaxError: JSON Parse error: Unexpected identifier "undefined", WKJavaScriptExceptionColumnNumber=14262, WKJavaScriptExceptionSourceURL=https://127.0.0.1:55433/sdk.wjx.com/js/common.bundle.min.js?d=20200716150243, NSLocalizedDescription=发生 JavaScript 异常}
你可以在 safari debug 看看,为什么会产生这个 json 解析错误。
window.KKJSBridge._handleMessageFromNative
另外,你想要对所有 webview 都派发事件,可以在每个 webviewcontroller 里监听通知,然后针对当前 webview 派发事件
查到了,H5 那边要字符串自己解析成 object,我也要转一次字符串,蛋疼。。。
什么意思?
你目前的解析代码是什么样的?
1.1.5-beta10 已经支持 bridge ready 回调了