蘋果不接收含UIWebView的ipa上架后,很多APP都在升級WebView組件,最好的方法就是使用react-native-webview這個庫。近期我們公司的APP也對WebView進行了升級,但在升級過程中發(fā)現(xiàn)了一個問題。RN層使用postMessage發(fā)送的消息,H5上監(jiān)聽不到。經(jīng)過多次嘗試和查看源碼后發(fā)現(xiàn)了問題所在。
之前直接使用RN自帶的WebView組件時寫法是這樣的:
// RN發(fā)送消息代碼
this.webView.postMessage(xxxxx)
// H5監(jiān)聽接收代碼
document.addEventListener(xxxxx)
更換為react-native-webview的WebView組件后,相同的代碼,H5就不能接收到消息了。
查看react-native-webview/ios/RNCWebView.m源碼發(fā)現(xiàn)了問題:
-(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來監(jiān)聽。
解決方案:
1、修改H5監(jiān)聽代碼,如果新老版本都在使用時,就兩個監(jiān)聽都加上。
document.addEventListener(xxxxx)
window.addEventListener(xxxxx)
2、不想修改H5代碼時,可以考慮修改react-native-webview/ios/RNCWebView.m源碼,window.dispatchEvent改為document.dispatchEvent,這種修改成本較小,但是以后升級react-native-webview時容易留坑,大家根據(jù)自己實際情況選擇解決方案。