1.監(jiān)聽加載jsbundle異常的處理
模擬情況:合并增量后jsbundle文件出現(xiàn)部分錯(cuò)誤
調(diào)試發(fā)現(xiàn)當(dāng)加載jsbundle出現(xiàn)異常時(shí),RN模塊RCTBatchedBridge.m中如下代碼會(huì)執(zhí)行:
- (void)stopLoadingWithError:(NSError *)error
{
RCTAssertMainThread();
if (!self.isValid || !self.loading) {
return;
}
_loading = NO;
[[NSNotificationCenter defaultCenter] postNotificationName:RCTJavaScriptDidFailToLoadNotification
object:_parentBridge
userInfo:@{@"bridge": self, @"error": error}];
RCTFatal(error);
}
因此native模塊加入監(jiān)聽處理RCTJavaScriptDidFailToLoadNotification通知的方法即可:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backToPreVersion) name:RCTJavaScriptDidFailToLoadNotification object:nil];
- (BOOL)backToPreVersion
{
// rollback
}
2.存在加載jsbundle正常,但是RN代碼執(zhí)行就Crash的問題的處理方案(參考安卓的處理)
模擬情況:如果RN代碼存在Crash bug
定位代碼Crash時(shí)代碼會(huì)執(zhí)行到RCTAssert.m中如下語句:
void RCTFatal(NSError *error)
{
_RCTLogNativeInternal(RCTLogLevelFatal, NULL, 0, @"%@", [error localizedDescription]);
RCTFatalHandler fatalHandler = RCTGetFatalHandler();
if (fatalHandler) {
fatalHandler(error);
} else {
#if DEBUG
@try {
#endif
NSString *name = [NSString stringWithFormat:@"%@: %@", RCTFatalExceptionName, [error localizedDescription]];
NSString *message = RCTFormatError([error localizedDescription], error.userInfo[RCTJSStackTraceKey], 75);
[NSException raise:name format:@"%@", message];
#if DEBUG
} @catch (NSException *e) {
}
#endif
}
}
測試DEBUG模式下RN拋出異常后被catch,不會(huì)導(dǎo)致Crash,因此為保證RELEASE版本下程序不會(huì)Crash,依舊能更新增量包,因?yàn)榭梢詫?if DEBUG的選項(xiàng)去掉,不讓程序Crash。