iOS实现应用退至后台5分钟后终止、重启显示登录页的问题
iOS应用后台挂起5分钟后自动触发登录的实现方案
首先你需要先把info.plist中Application does not run in background(对应键为UIApplicationExitsOnSuspend)的属性改回NO,这个属性开启会直接禁用后台运行能力,无法实现延迟终止效果。
以下提供两种实现方案:
方案1:时间差校验方案(推荐,无审核风险)
该方案无需主动终止应用,通过前后台切换的时间差校验触发登录跳转,兼容性最高,也符合苹果应用开发规范:
- 监听应用生命周期通知/回调
在AppDelegate或SceneDelegate(使用了Scene生命周期的应用)中监听应用退后台、进前台的回调 - 退后台时记录时间戳
收到退后台回调时,将当前时间戳持久化存储到UserDefaults中,Swift示例代码:
Objective-C示例代码:func applicationDidEnterBackground(_ application: UIApplication) { UserDefaults.standard.set(Date().timeIntervalSince1970, forKey: "kBackgroundEnterTimestamp") }- (void)applicationDidEnterBackground:(UIApplication *)application { [[NSUserDefaults standardUserDefaults] setDouble:[NSDate.date timeIntervalSince1970] forKey:@"kBackgroundEnterTimestamp"]; [[NSUserDefaults standardUserDefaults] synchronize]; } - 进前台时校验时间差
收到回到前台回调时,取出存储的时间戳和当前时间计算差值,超过300秒(5分钟)则直接跳转登录页,同时清空原有登录态:func applicationWillEnterForeground(_ application: UIApplication) { let bgTimestamp = UserDefaults.standard.double(forKey: "kBackgroundEnterTimestamp") guard bgTimestamp > 0 else { return } let interval = Date().timeIntervalSince1970 - bgTimestamp if interval >= 300 { // 此处写跳转登录页、清除登录态的逻辑 UserDefaults.standard.removeObject(forKey: "kBackgroundEnterTimestamp") } }
补充说明:如果应用在后台被系统自动回收,下次冷启动时可以在启动逻辑中加入同样的时间差校验,一样可以触发登录页跳转,不需要额外处理系统杀进程的场景。
方案2:后台超时主动终止方案(不推荐,有审核风险)
如果你的应用是企业内部使用不需要上架App Store,确实需要后台到时间就终止进程,可以申请后台任务权限实现:
- 声明后台任务标识符属性
var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid - 退后台时启动延时终止任务
func applicationDidEnterBackground(_ application: UIApplication) { // 申请后台任务权限 backgroundTaskID = application.beginBackgroundTask(withName: "AutoTerminateTask") { // 系统分配的后台时间到期时回调,主动退出应用 exit(0) } // 启动5分钟延时任务 DispatchQueue.global().asyncAfter(deadline: .now() + 300) { if self.backgroundTaskID != .invalid { application.endBackgroundTask(self.backgroundTaskID) self.backgroundTaskID = .invalid exit(0) } } }
注意:iOS默认仅给普通应用分配30秒左右的后台运行时间,如果你需要更长的后台运行时长,需要申请对应的后台模式权限(如音频播放、位置更新等),如果你的应用没有对应使用场景,上架App Store会被直接拒绝,且主动调用
exit(0)退出应用不符合苹果用户体验规范,非特殊场景不建议使用。
内容的提问来源于stack exchange,提问作者Lakith Jayalath
相关产品推荐
相关产品推荐

