BGTaskScheduler 后台数据刷新

随笔8个月前发布 白云端之上
88 0 0

公司应用需要用到后台数据更新,当数据发生变化时,发送本地通知告诉用户。一番搜索,便找到了BGTaskScheduler。后台保活有很多种方法,但都有一定的局限性,这里不做过多讨论,只讲其中的Background Fetch。

Background Fetch需要用到BGAppRefreshTask,BGAppRefreshTask可以获得30秒的处理时间,以供你请求接口数据或其他处理。接入流程如下:

1.在Targets中开启Background Modes:TARGETS > Capability > Background Modes > Background Fetch,如图

BGTaskScheduler  后台数据刷新

2.在Info.plist中添加一个自定义的任务标志,后面会用到:Permitted background task scheduler identifiers。

BGTaskScheduler  后台数据刷新

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需要改成你自己的,跟上面保持一致。

具体操作是:用真机调试,在提交任务的时候设置断点,并在右下角窗口输入上面的代码,然后继续运行,就会触发。如下图:

BGTaskScheduler  后台数据刷新

最后的最后,如果你尝试不成功,请检查你的真机是否开启了后台刷新的权限。具体位置是:设置 > 通用 > 后台App刷新。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...