關(guān)于RN熱更新-iOS端捕獲加載jsbundle異常解決方案

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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,432評(píng)論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,969評(píng)論 19 139
  • 作者:兔子是怎么蹦的 我覺得這個(gè)馬拉松這一塊,第一點(diǎn)就是考驗(yàn)?zāi)愕哪托裕掖蜃执蜻@么久就覺得,脖子和肩膀都有點(diǎn)疼了,...
    寫作馬拉松閱讀 528評(píng)論 0 0
  • 早上7點(diǎn),水一杯 8點(diǎn)30,海鮮菇炒蛋250g,牛奶半杯兌咖啡 午餐12點(diǎn),米飯小盒子沒吃完,蘿卜湯,雞丁,炒山藥...
    青出雨藍(lán)閱讀 223評(píng)論 0 0
  • 文/陳子歡 看到青海湖藍(lán)天碧水油菜開了花 我就想我們?nèi)ツ抢镌烊税?看到呼倫貝爾白云飄飄駿馬奔騰 我就想我們?nèi)ツ抢镌?..
    冷小姐的理想國閱讀 362評(píng)論 0 3