公司应用需要用到后台数据更新,当数据发生变化时,发送本地通知告诉用户。一番搜索,便找到了BGTaskScheduler。后台保活有很多种方法,但都有一定的局限性,这里不做过多讨论,只讲其中的Background Fetch。
Background Fetch需要用到BGAppRefreshTask,BGAppRefreshTask可以获得30秒的处理时间,以供你请求接口数据或其他处理。接入流程如下:
1.在Targets中开启Background Modes:TARGETS > Capability > Background Modes > Background Fetch,如图
2.在Info.plist中添加一个自定义的任务标志,后面会用到:Permitted background task scheduler identifiers。
3.AppDelegate中添加对应代码:
(1)引入头文件
import BackgroundTasks
(2)注册后台刷新任务:
funcapplication(_application:UIApplication,didFinishLaunchingWithOptionslaunchOptions: [UIApplication.LaunchOptionsKey:Any]?) ->Bool{
// Override point for customization after application launch.
registerBackgroundTask()
return true
}
// 注册后台刷新任务
func registerBackgroundTask() {
// info.plist中填入的标志
let identifier = “com.test.BackgroundDemo”
if BGTaskScheduler.shared.register(forTaskWithIdentifier: identifier, using: .global(), launchHandler: { task in
self.handleAppRefresh(task: taskas!BGAppRefreshTask)
}) {
print(“注册成功!”)
}else{
print(“注册失败!”)
}
}
// 这里处理任务触发后的逻辑
func handleAppRefresh(task: BGAppRefreshTask) {
print(“任务触发!”)
task.expirationHandler= {
// 任务时间结束会调用
task.setTaskCompleted(success: false)
}
// 这里下载数据和处理数据,然后主动结束任务
task.setTaskCompleted(success: true)
}
(3)在应用进入后台时,提交后台刷新任务请求
func applicationDidEnterBackground(_ application: UIApplication) {
submitBackgroundTasks()
}
// 提交后台刷新任务的请求
func submitBackgroundTasks() {
// info.plist中填入的标志,和注册的一致
let identifier = “com.test.BackgroundDemo”
let timeDelay = 10.0 // 最早的触发时间,但实际出发时间由系统自己决定
lettaskRequest =BGAppRefreshTaskRequest(identifier: identifier)
taskRequest.earliestBeginDate = Date(timeIntervalSinceNow: timeDelay)
do{
tryBGTaskScheduler.shared.submit(taskRequest)
print(“任务提交成功”)
}catch{
print(“任务提交失败”)
}
}
至此,大功告成!
但是测试后台刷新不时间容易的事,因为有时候需要等很久才会触发,好在我们有个简单的方法去主动触发。
需要用到的Xcode代码:e -l objc — (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@”com.test.BackgroundDemo”]
注意,这里的Identifier需要改成你自己的,跟上面保持一致。
具体操作是:用真机调试,在提交任务的时候设置断点,并在右下角窗口输入上面的代码,然后继续运行,就会触发。如下图:
最后的最后,如果你尝试不成功,请检查你的真机是否开启了后台刷新的权限。具体位置是:设置 > 通用 > 后台App刷新。