首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用BGTaskScheduler的后台获取在调试模拟中工作得很好,但在实践中从来都不起作用

使用BGTaskScheduler的后台获取在调试模拟中工作得很好,但在实践中从来都不起作用
EN

Stack Overflow用户
提问于 2020-11-15 21:13:08
回答 2查看 683关注 0票数 3

我在appDelegate的didFinishLaunchingWithOptions中注册了后台获取任务:

代码语言:javascript
复制
BGTaskScheduler.shared.register(forTaskWithIdentifier: BackgroundScheduler.shared.backgroundTaskId, using: DispatchQueue.main) { task in

    BackgroundScheduler.shared.handleAppRefresh(task: task as! BGAppRefreshTask)
}

handleAppRefersh函数调度另一个刷新任务,并调用该操作的fetch方法,还传递一个完成处理程序,以便在完成fetch操作后运行。

代码语言:javascript
复制
func handleAppRefresh(task: BGAppRefreshTask) {
    
    os_log("handleAppRefresh exetued.")
    
    scheduleAppRefresh()
    
    task.expirationHandler = {
        os_log("backgroundFetch expiration called")
    }
    
    operation.fetch() {
        os_log("backgroundFetch fetch called")
        task.setTaskCompleted(success: true)
    }
}

scheduleAppRefresh提交BGAppRefreshTAskRequest以重复后台fetch执行。

代码语言:javascript
复制
func scheduleAppRefresh() {
    
    os_log("scheduleAppRefresh exetued.")
    
    let request = BGAppRefreshTaskRequest(identifier: backgroundFetchId)
    request.earliestBeginDate = Date(timeIntervalSinceNow: AppSettings.refreshInterval)

    do {
        try BGTaskScheduler.shared.submit(request)
    } catch {
        os_log("Could not schedule app refresh:", error.localizedDescription)
    }
}

refreshInterval为10 * 60,即10分钟。

operation.fetch方法检查设备的当前位置并向远程服务器发送请求。最后,它发送本地通知,更新UI并调用以下代码:

代码语言:javascript
复制
task.setTaskCompleted(success: true)

在Xcode中检查“位置更新”和“后台获取”功能,并将所需的设置添加到info.plist中。

当我使用下面的debug命令测试后台抓取功能时,一切工作正常,调试器中没有任何警告消息。

代码语言:javascript
复制
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"TASK_IDENTIFIER"]

但是,当我将应用程序放在后台很长时间时,iOS永远不会调用handleAppRefresh函数。

Xcode: 12.2,iOS: 14.2

项目公共存储库:https://github.com/amirrezaeghtedari/CoronaVirousRegulations.git

我完全糊涂了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-26 03:46:33

我将后台获取间隔设置为10分钟,在等待了大约4个小时或更长时间后,iOS在后台运行我的应用程序。在那之后,我的应用程序会不定期地在后台被调用,时间间隔从不到一个小时到几个小时。很明显,我的实现没有问题,这些执行间隔取决于iOS策略。

票数 3
EN

Stack Overflow用户

发布于 2020-11-16 11:57:24

WWDC 2020 Background execution demystified

据称,有许多因素在起作用,这些因素决定了你的应用程序何时实际运行后台刷新。操作系统的神经引擎会在用户启动应用程序时学习,以便在更新之前执行更新。他们在2019年的会议上首次提到了这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64844812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档