React Native iOS应用在后台状态下的相关问题
1. App后台运行原理
iOS系统支持多任务操作,但是实质上是一个假多任务。当App进入后台之后,如果不进行特殊操作,App就会处于挂起状态。苹果这样做的好处是为了省电,也确保了安全性。
尽管iOS系统是假的多任务。但是他的一些系统级应用还是真系统级应用。比如 远程推送应用。当然苹果也提供了在一些场景下可以使开发者应用在后台一直处于运行状态:
1. 位置更新 location update
2. VoIP 网络电话
3. 音频播放
4. 蓝牙
...
(更多信息具体可以在 项目 -> capabilities -> background Modes 中查看)
同时我们仍然需要在info.plist表中增加字段 Application does not run in background 值为 NO。
在AppDelegate.m文件中,在applicationDidEnterBackground:代理方法中,或者在相应页面通过监听 UIApplicationDidEnterBackgroundNotification 通知, 调用:
// 通过这个方法向系统申请额外在后台运行的时间(一般是3min、10min)。一旦这个时间到了之后,可以再申请一次,之后系统就会立即挂起应用。
[application beginBackgroundTaskWithExpirationHandler:^{
// 系统分配的后台时间使用完之后,要做的事情
}];
如果想要实现App长期在后台运行,需要在info.plist表中再加上字段:Required background modes 填入对应的值(如:location,notification,Bluetooth等)。或者通过选择:项目 -> capabilities -> 打开 background Modes 并选择对应功能。
注意: 需要根据对应的App类型来选择对应的后台功能。如果乱选,审核会不过。如果想要更深入的了解,请自定搜索:“ios后台状态长时间运行” 相关知识
2. React Native后台时钟
针对于RN的setTimeOut和setInterval,即使已经在原生端设置好了可以在后台运行。但是当App处于后台之后,js端的代码仍然会处于**挂起**状态。对于需要在后台仍然定时做一些事情的业务场景下(比如定位轨迹的描绘)。默认的setTimout和setInterval就不适合了。
于是必须将原生的装成一个RN模块,提供给js端调用。具体思路如下:
1. 使用RCTEventEmitter类来实例化一个对象
2. 使用NSTimer创建时钟,将每次的回调方法中,发送事件给js端。
3. 实现多时钟情况下的回调。
3. react-native-inback-timer-ios
根据以上思路,个人写了一个第三方库:react-native-inback-timer-ios
该库具有一下特点:
1. 能够在App处于后台时,仍能运行时钟
1. 能够支持最多20个时钟同时运行;
2. 提供与js的setTimeout、setInterval相同用法的方法;
如果喜欢,就star一下吧