解决react-native-webview使用postMessage后H5不能监听问题

苹果不接收含UIWebView的ipa上架后,很多APP都在升级WebView组件,最好的方法就是使用react-native-webview这个库。近期我们公司的APP也对WebView进行了升级,但在升级过程中发现了一个问题。RN层使用postMessage发送的消息,H5上监听不到。经过多次尝试和查看源码后发现了问题所在。
之前直接使用RN自带的WebView组件时写法是这样的:

// RN发送消息代码
this.webView.postMessage(xxxxx)
// H5监听接收代码
document.addEventListener(xxxxx)

更换为react-native-webview的WebView组件后,相同的代码,H5就不能接收到消息了。
查看react-native-webview/ios/RNCWebView.m源码发现了问题:

-(void)postMessage:(NSString *)message
{
  NSDictionary *eventInitDict = @{@"data": message};
  NSString *source = [NSString
    stringWithFormat:@"window.dispatchEvent(new MessageEvent('message', %@));",
    RCTJSONStringify(eventInitDict, NULL)
  ];
  [self injectJavaScript: source];
}

这里使用的是window.dispatchEvent,所以document.addEventListener是接收到的,要使用window.addEventListener来监听。
解决方案:
1、修改H5监听代码,如果新老版本都在使用时,就两个监听都加上。

document.addEventListener(xxxxx)
window.addEventListener(xxxxx)

2、不想修改H5代码时,可以考虑修改react-native-webview/ios/RNCWebView.m源码,window.dispatchEvent改为document.dispatchEvent,这种修改成本较小,但是以后升级react-native-webview时容易留坑,大家根据自己实际情况选择解决方案。

你可能感兴趣的:(解决react-native-webview使用postMessage后H5不能监听问题)