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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

关于RN热更新-iOS端捕获加载jsbundle异常解决方案的更多相关文章

  1. Unity热更新之C#反射加载程序集

    用C#反射加载程序集的方式可以动态的从assetBundle资源包或其他资源包里加载脚本到工程中,即便是原工程中不存在的脚本. 我这里就用加载本地assetBundle的方式来进行讲解了,加载网络上的 ...

  2. RN热更新

    说白了集成RN业务,就是集成RN离线包,解析并渲染.所以,RN热更新的根本原理就是更换js bundle文件和资源文件,并重新加载,新的内容就完美的展示出来了. 目前市场上出现的3种热更新模式如下:仅 ...

  3. React Native之code-push的热更新(ios android)

    React Native之code-push的热更新(ios android) React Native支持大家用React Native技术开发APP,并打包生成一个APP.在动态更新方面React ...

  4. H5 缓存机制浅析 移动端 Web 加载性能优化

    腾讯Bugly特约作者:贺辉超 1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性.离线存储(也可称为缓存机制)是其中一个非常重要的特性.H5 引入的离线存储, ...

  5. 基于jquery鼠标或者移动端滚动加载数据

    基于jquery鼠标或者移动端滚动加载数据 var stop = true; // 防止重复请求数据 $(window).scroll(function () { totalheight = pars ...

  6. vs中 VMDebugger未能加载导致异常

    ,纠结了许久的一个问题,终于找到了解决 vs中 VMDebugger未能加载导致异常 错误号:80004005 搜了好多,没有一个给出完美的答案.   解决办法:工具->导入和导出设置,重置一下 ...

  7. Python3 tesseract加载chi_sim异常停止工作

    Python3 tesseract加载chi_sim异常停止工作 原因: chi_sim.traineddata 和 tesseract3.0.2 版本不一致: 解决方案: 下载tesseract3. ...

  8. React Native热更新(iOS)-Pushy

    React Native的出现,使的开发iOS代码出现了更便捷的方式.由于RN是使用脚本语言编写的,实现了"解释执行"的方式,而这种执行方式的修改只需替换脚步即可,不需要重新发布程 ...

  9. iOS NSOperation 异步加载图片 封装NSOperation 代理更新

    #import <Foundation/Foundation.h> @class MYOperation; @protocol MYOperationDelecate <NSObje ...

随机推荐

  1. 6410在rvds下编译启动代码报错分析

    contains invalid call from '~PRES8' function to 'REQ8' function main RVDS编译出现contains invalid call f ...

  2. java Web jsp四大作用域和九大内置对象

    JSP中的四大作用域:page.request.session.application 这四大作用域,其实就是其九大内置对象中的四个,为什么说他们也是JSP的四大作用域呢?因为这四个对象都能存储数据, ...

  3. js确定来源页然后跳转

    <script type="text/javascript"> function Navigate() { if(document.referrer == 'http: ...

  4. libevent源码深度剖析十一

    libevent源码深度剖析十一 ——时间管理 张亮 为了支持定时器,Libevent必须和系统时间打交道,这一部分的内容也比较简单,主要涉及到时间的加减辅助函数.时间缓存.时间校正和定时器堆的时间值 ...

  5. 分布式基础学习【二】 —— 分布式计算系统(Map/Reduce)

    二. 分布式计算(Map/Reduce) 分布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件系统,很大程 ...

  6. Java 计算两个日期相差的天数

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  7. jsoup 的简单应用

    导入相关jar包 package jsoup.zr.com.utils; import java.io.IOException; import java.util.List; import org.j ...

  8. spark源码阅读之network(2)

    在上节的解读中发现spark的源码中大量使用netty的buffer部分的api,该节将看到netty核心的一些api,比如channel: 在Netty里,Channel是通讯的载体(网络套接字或组 ...

  9. Windows7下使用sphinx生成开源文档(原)

    作者这里以osgearth文档为例,感觉这种生成文档的方式比较好,生成的html文档是支持搜索的,感谢开源工作者的奉献.赞一个 1. 下载并安装python for windows:https://w ...

  10. 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别(转)

    因CooCox用户数及影响力越来越大,CooCox团队也逐渐提高了对软件及代码协议的重视.在收集整理的过程中,一些归纳好的信息和大家分享一下.首先借用有心人士的一张相当直观清晰的图来划分各种协议:开源 ...