zoukankan      html  css  js  c++  java
  • 关于RN热更新-iOS端捕获加载jsbundle异常解决方案

    1.监听加载jsbundle异常的处理

    模拟情况:合并增量后jsbundle文件出现部分错误
    调试发现当加载jsbundle出现异常时,RN模块RCTBatchedBridge.m中如下代码会执行:

    - (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模块加入监听处理RCTJavaScriptDidFailToLoadNotification通知的方法即可:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backToPreVersion) name:RCTJavaScriptDidFailToLoadNotification object:nil];
    
    - (BOOL)backToPreVersion
    {
     // rollback
    }
    

    2.存在加载jsbundle正常,但是RN代码执行就Crash的问题的处理方案(参考安卓的处理)

    模拟情况:如果RN代码存在Crash bug
    定位代码Crash时代码会执行到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,不会导致Crash,因此为保证RELEASE版本下程序不会Crash,依旧能更新增量包,因为可以将#if DEBUG的选项去掉,不让程序Crash。



    作者:Arnold134777
    链接:https://www.jianshu.com/p/3db03c8c4ae7
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/Hakim/p/9848171.html
Copyright © 2011-2022 走看看