RN版本 0.61.0
Xcdoe版本:13.3.1
Macos: 蒙特利

资料传送门

1.iOS后台运行的相关方案总结
2.iOS 后台挂起的一些坑
3.React Native iOS应用在后台状态下的相关问题
4.iOS App后台保活
5.iOS 后台永久保活,亲测有效
6.QiAppRunInBackground

现状与囧境

RN-iOS端项目启动后, 频繁杀后台.基本上撑不过30s.并且毫无日志可以查看。
于此同时,由于上海疫情原因居家办公。手头仅有安卓手机,并无iOS测试手机(为了重新启用模拟器,把Macos系统升级到最高,Xcode升级到13.3.1,其中酸爽不再细表)。

在这里先说一下,iOS模拟器可以作为测试真机使用,在处理挂起的问题上与真机效果相同,不必担心(当然,这仅是一家之言。。。)

总结与原因

心急的小伙伴看这里就好
总结
1.setTimeout setInterVal代码,是否存在在挂起状态调用的情况,如有请终止,否则30s妥妥的

2.Animated.timing() Animated.loop() 代码调用的时候,是否存在在挂起状态调用的情况,如有请终止,否则30s妥妥的,会出现 rct.timing.gb.task 报错

3.react-native-snap-carousel 组件的使用要注意,autoplay={true}在前台没有问题,如果在后台挂起,同样会造成 rct.timing.gb.task 报错,30s妥妥的。

4@react-native-community/netinfo 网络监听组件的问题 NetInfo.addEventListener()在后台挂起状态下,同样造成了 rct.timing.gb.task 报错,如果有请处理,起码做个前后台判断。我这边移除最省事儿。

5.GIF图片后台挂起无关,GIF图片不会影响

6.目前RN框架的iOS项目,至少在本项目中,不使用无声音频方式,只要解决以上问题,同样可以做到长时间保活,因此,无声音频方案并非必要(可用于配合排查问题)

看到这里本帖可以完结了。愿意看我心酸历程的可以继续看下去…

解决过程分享

一开始遇到该问题,确实毫无头绪,一时间各种猜想冒出来,也不确定处理的方向
是从性能角度出发还是因为代码层面的Bug

看到这种性能消耗,是不是第一时间就的怀疑是不是功耗太大,以至于被系统Kill,一度我也是从这种角度去尝试,奈何路子没走通,浪费了一些时间。
也尝试过移除RN的JSBundle资源,直接跑iOS原生项目,确实可以保活很久。所以一段时间里,在性能层面打转许久。。。

而且,真机以及模拟器如果只是看APP效果,那么连着xcode是一点也看不出被Kill的情况,所以为了确保验证效果准确,务必要将手机与Xcode断开验证
其次,xcode中一开始报错日志都是没有的,压根儿不知道从何下手。

所以,如果你看到这里,我推荐你不管三七二十一,先集成一下手机播放无(有)声音频,这样的好处是,一旦系统杀死了APP,你可以瞬间得知,最重要的好处是(我也是得益于此),有错误日志了!!!

就不详细贴音频的OC代码,其实在这里就有 6.QiAppRunInBackground
这边简单贴一下调用

#pragma mark - keepAlive
- (void)applicationWillEnterForeground:(UIApplication *)application {NSLog(@"%s:应用将进入前台WillEnterForeground", __FUNCTION__);if ([QiAudioPlayer sharedInstance].needRunInBackground) {[[QiAudioPlayer sharedInstance].player pause];}[[UIApplication sharedApplication] endBackgroundTask: self.backgroundTaskIdentifier];
}- (void)applicationDidEnterBackground:(UIApplication *)application {NSLog(@"%s:应用进入后台DidEnterBackground", __FUNCTION__);self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithName:kBgTaskName expirationHandler:^{if ([QiAudioPlayer sharedInstance].needRunInBackground) {[[QiAudioPlayer sharedInstance].player play];}if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid) {[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;}}];
}

音频播放的好处如上所述了,剩下的就是水磨工夫了,每个RN项目各不相同,就用排除法一个个定位即可。
顺便说一下
iOS12、iOS12以上,表现也不相同。
已经明确的是
目前iOS12系统, 基本可保活180s 、 iOS 以上系统,30s左右即被系统kill.
所以不用纠结iOS12系统的问题了。

一些报错与截图

1.<Error Domain=RBSAssertionErrorDomain Code=2 "Assertion's invalidation time is in the past" UserInfo={IgnoreOnReconnect=true, NSLocalizedFailureReason=Assertion's invalidation time is in the past}>
造成该断言失败的原因,经过大量的排查和测试结果,定位在这样一段代码
会发现,这段代码调用,如果APP在前台的时候,那是没什么大问题,一旦进入后台setTimeout由于在RN层面,其实是调用的原生的代码处理,所以导致了iOS挂起后,出现如上断言报错。

2.Background Task 9 ("rct.timing.gb.task"), was created over 30 seconds ago. In applications running in the background, this creates a risk of termination. Remember to call UIApplication.endBackgroundTask(_:) for your task in a timely manner to avoid this.
这里的loop循环就是导致RN层面在后台挂起的元凶。。。。

这里也是,可以看到整理是做了个定时调用,这在APP处于前台没有问题,一旦iOS挂起到后台,那么就会引起30s重启。。。


排查笔记…

(无参考价值,仅供个人回顾查阅)

针对一部分处理, 大体思路还是通过iOS applicationDidEnterBackground
applicationWillEnterForeground
项RN发送消息的方式,让RN端监听状态来切换以上代码的处理
RN-iOS 原生向RN发送消息
不过貌似好像可以通过RN直接获取APP前后台挂起状态的API…

1.setTimeout循环打破
此处将 handler 在挂起时, cleanTimeout 即可

此处,增加状态拦截即可

2.Animated.loop()循环打破 :失败,只好移除
尝试过调用stop方法,但实际测试下来 动画是停止的,但是依然会造成闪退,这个待得空了 继续探索

3.setInterval处理 记得及时clean即可
只要及时 clearInterval 清除即可

4.autoPlay={true} 问题处理,未做兼容,属性设置初始化不可更改,可采用两个组件实例切换的方案做兼容,此处直接改为禁止自动播放

5.NetInfo.fetch() 网络监听代码, 因为不需要. 所以没做兼容,直接此处移除

RN - iOS端后台挂起后30s重启问题处理过程与心得相关推荐

  1. h5 解决ios端输入框失去焦点后页面不回弹或者底部留白问题

    h5 解决ios端输入框失去焦点后页面不回弹或者底部留白问题 参考文章: (1)h5 解决ios端输入框失去焦点后页面不回弹或者底部留白问题 (2)https://www.cnblogs.com/bl ...

  2. 微信公众号关闭iOS端虚拟支付业务;苹果「Apple 登录」存安全漏洞;谷歌推迟发布Android 11 Beta| 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极 ...

  3. IOS 后台挂起程序 当程序到后台后,继续完成Long Running Task 任务

    IOS 后台挂起程序 当程序到后台后,继续完成Long-Running Task 任务 www.douban.com/note/375127- http://lqzit.iteye.com/blog/ ...

  4. 基于iOS 10封装的下载器(支持存储读取、断点续传、后台下载、杀死APP重启后的断点续传等功能)

    原文 资源来自:http://www.cocoachina.com/ios/20170316/18901.html 概要 在决定自己封装一个下载器前,我本以为没有那么复杂,可在实际开发过程中困难重重, ...

  5. iOS 后台挂起的一些坑

    特别说明:   后台状态:当前app如果不是作为屏幕中的第一层,呈现显示给用户,那么此时app就是后台状态. 锁屏(包括:当前应用下锁屏.其他应用下锁屏.桌面锁屏) 用户在使用其他应用app2,当前 ...

  6. 解决微信H5页面软键盘弹起后页面下方留白的问题(iOS端)

    解决微信H5页面软键盘弹起后页面下方留白的问题(iOS端) 参考文章: (1)解决微信H5页面软键盘弹起后页面下方留白的问题(iOS端) (2)https://www.cnblogs.com/zouw ...

  7. iOS App后台保活

    女主宣言 前段时间,笔者和GY哥一起吃饭聊天的时候,GY哥问了笔者一个问题,iOS App 可以后台保活吗?是如何做到后台保活的?当时笔者只想到了可以在后台播放静音的音乐,对于唤醒App,可以考虑使用 ...

  8. 云信小课堂|5分钟快速实现iOS端PK连麦场景

    Vol. 4 2021年开年,音频社交风靡互联网,语音社交再成风口,直播连麦开启社交新赛道.在实时通信技术不断革新的现状下,直播平台需要不断探索新的方式以满足用户日益增长的需求,直播连麦就是在此背景下 ...

  9. IOS端与Java端MD5加密方法

    关于NSString的MD5加密,这不难,在网上可以搜到很多算法,主要是跟后台的统一会出问题,对同一段字符串,ios和java加密后的结果可能不一样.现在贴一下ios端和后台java的代码. java ...

最新文章

  1. JD boto3 flask 上传 demo
  2. js如何判断字符串里面是否含有某个字符串
  3. 实现el-dialog的拖拽,全屏,缩小功能
  4. 通过printf设置Linux终端输出的颜色和显示方式
  5. mysql 10进制转2进制_Oracle 10进制转换2进制
  6. 阿里redis规范(转自别人的公众号)
  7. UVa11853 Paintball
  8. java取json对象的值_java的JsonObject对象提取值方法
  9. Django项目调用外部程序soffice报错subprocess.CalledProcessError: Command 'soffice --headless --convert-to pdf
  10. PLSQL Developer工具远程连接Oracle数据库的方法
  11. 一分钟详解机器人手眼标定MATLAB及C++实现
  12. MyBatis入门使用及其四大核心对象
  13. 2018年最新桌面CPU性能排行天梯图(含至强处理器)
  14. lede 内核 单 编_openwrt和lede有何区别?
  15. 小米笔记本 Air 13.3 黑苹果教程
  16. 准备了个freyja实例项目(单数据源版)
  17. coldfusion php,将一些PHP移植到ColdFusion
  18. 4.1程序员为什么需要学习编译原理
  19. python蓝牙模块教程_通过蓝牙将HC05蓝牙模块与python连接时出错
  20. 团队作业——Alpha冲刺 8/12

热门文章

  1. Ubuntu 中文 Wiki
  2. 东北大学应用数理统计第二章知识点总结——参数估计
  3. PHP在线客服即时通讯源码
  4. avue框架的Scoped Slot自定义汇总
  5. 【openGL2021版】粒子系统(全)
  6. 分享通达信破解交易接口的使用!
  7. Kaggle实战:随机森林预测泰坦尼克生存率
  8. windows下的BT服务器搭建方案
  9. android 彩信接收到附件的下载原理分析
  10. 《Python编程从入门到实践》学习笔记7:用户输入和while循环