BGAppRefreshTask 后台任务未执行

2024-01-17

我正在使用新的 iOS13 后台任务框架,并实现 BGAppRefreshTask 类型。我的问题是,即使在等待几个小时之后,我的设备也永远不会调用该任务,但我能够使用调用 _simulateLaunchForTaskWithIdentifier 的调试器技巧成功运行代码。

我已设置以下内容:

  • 使用后台模式功能启用我的应用程序,检查“后台获取”。
  • 将我的背景 ID 添加到 Info.plist 的“允许的后台任务调度程序标识符”下:“com.XYZ.PearWeather.backgroundAlerts”。

我已在我的 AppDelegate 中注册了来自 application(didFinishLaunchingWithOptions) 的任务:

        BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.XYZ.PearWeather.backgroundAlerts", using: nil) { task in
            self.backgroundAlerts(task: task as! BGAppRefreshTask)
        }

我正在 AppDelegate 内的 func 中安排任务,并从我的 SceneDelegate sceneDidEnterBackground() 调用它。它本来是一个静态函数,但我现在将其更改为实例函数,并获取 AppDelegate 实例(因为我在绝望中尝试了很多更改):

    func sceneDidEnterBackground(_ scene: UIScene) {
        (UIApplication.shared.delegate as! AppDelegate).scheduleBackgroundAlerts()
    }
    func scheduleBackgroundAlerts() {
        let request = BGAppRefreshTaskRequest(identifier: "com.XYZ.PearWeather.backgroundAlerts")

        request.earliestBeginDate = Date(timeIntervalSinceNow: 5 * 60)

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

至少在Debugger场景下,提交调用没有错误。我已经为上面的 timeIntervalSinceNow 参数尝试了许多不同的值。我还从任务处理程序本身调用此 ScheduleBackgroundAlerts() 函数,如下所示:

    func backgroundAlerts(task: BGAppRefreshTask) {

        scheduleBackgroundAlerts()

        task.expirationHandler = {
            // After all operations are cancelled, the completion block below is called to set the task to complete.
            task.setTaskCompleted(success: false)
        }

        AlertsOperation.showNotification()


        task.setTaskCompleted(success: true)
    }

这个实现发生了很大的变化 - 我最初使用了一个OperationQueue,尝试将scheduleBackgroundAlerts()调用放在func的开头和结尾,等等。现在它被剥离了。 AlertOperation.showNotification() 现在也非常简单:

    static func showNotification() {

        let now = Date()
        let bg = Locale.currentLocale().formattedTime(date: now)
        SettingsManager.shared.settings.bg = bg
    }

这只是在 UserDefaults 中存储一个值(在我的 SettingsManager 中,其详细信息与此处无关),我可以在我的应用程序中读回该值以查看是否发生了任何情况。

现在,该函数的原始实现使用 UNUserNotificationCenter 等发出本地通知,这就是我在此后台任务中尝试执行的操作。这在调试器中工作得很好,但我将其简化为这个简单的代码,只是为了制作一个非常小的实现。

正如我所说,从调试器调用任务处理程序可以正常工作,使用:

e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.XYZ.PearWeather.backgroundAlerts"]

但设备本身没有发生任何事情。我看不到我错过了什么。我也不知道如何从后台任务处理程序中记录任何异常。

我是 Swift 和 iOS 的新手,所以非常感谢您的指点。上面的大部分代码几乎都是关于这个主题的许多教程的副本。但对我来说,一切都行不通,我已经没有选择了!


提交请求后和提交后代码中有断点request(BGTaskScheduler.shared.submit(request))然后运行命令

e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.XYZ.PearWeather.backgroundAlerts"]

然后将为该标识符调用注册的处理程序。 查看POC https://github.com/sreexamus/BackgroundTasksPOC查看更多详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BGAppRefreshTask 后台任务未执行 的相关文章

随机推荐

  • 数据属性变为整数

    看看这个简单的例子在jsfiddle上 http jsfiddle net TZxUU 2 div 00005 turns into div div S00005 turns into div code a append a data si
  • AttributeError:“MLPClassifier”对象没有属性“decision_function”

    我不知道为什么在尝试使用时会出现该错误decision function model 1 BaggingClassifier base estimator MLPClassifier model 1 fit Xtrain ytrain mo
  • 如何合并给定属性上的两个列表

    我有两个查询 每个查询返回一个对象列表 List a list1 query List a list2 query A 是对象模型 两个查询返回几乎相同的对象 但设置了不同的属性 我想根据对象 A 的属性删除重复项并将它们合并到单个列表中
  • cURL 使用 PHP,可以确定 cURL 将使用的 IP 地址吗?

    是否可以通过编程方式确定 cURL 在连接到远程服务器时使用的 IP 地址 我有一个正在使用 cURL 的共享服务器 我需要将 IP 地址作为请求的一部分发送 我正在交谈的服务器需要一个结合了连接 IP 地址和旋转密码的身份验证字符串 例如
  • VSCode 上的 pwa-node 类型启动配置是什么?

    我注意到 VSCode 为 npm 调试生成的默认启动配置 通过 NPM 启动 默认将配置类型设置为 pwa node 添加 通过 NPM 启动 配置 生成的配置类型 我搜索了一下 但没有找到它的含义 也许与渐进式网络应用程序有关 有谁知道
  • ServiceStack 基准测试继续:为什么将简单(复杂)持久化为 JSON 会减慢 SELECT 速度?

    我想切换到 OrmLite 我需要弄清楚它是否很慢 如果是 原因是什么 在我的研究中 我得出的结论是 复杂的对象 在 OrmLite 中被 blob 为 JSON 是 SELECT 速度非常慢的罪魁祸首 因此 我创建了一个仅关注 OrmLi
  • sklearn ColumnTransformer 与 MultilabelBinarizer

    我想知道是否可以在 ColumnTransformer 中使用 MultilabelBinarizer 我有一个玩具熊猫数据框 例如 df pd DataFrame id 1 2 3 text some text some other te
  • 检测屏幕上任意位置的触摸

    我想知道用户何时触摸了我的应用程序屏幕上的任何位置 我已经研究过使用 UIResponder nextResponder但不幸的是 这不起作用 因为我也会自动重新加载表 所以当发生这种情况时就会触发它 我还尝试了手势识别器 代码如下 但这只
  • firefox dev 版本中不显示的参数值去哪儿了?

    Firefox 开发者版在哪里隐藏 XHR 请求参数 这是我打开控制台工具并发出一些 XHR 请求但没有显示任何参数时的图像 当 XHR 时我使用 POST 方法 我使用的是 firefox dev 版本 57 0b11 64位 谢谢你的指
  • TS 文件中“translation”元素的“vanished”类型

    我注意到 Qt TS 文件中的某些消息的翻译元素具有 消失 类型 但其用途尚不清楚 似乎只有 未命名 上下文中的消息才具有这种类型 相应的DTD http doc qt io qt 5 linguist ts file format htm
  • OpenCV 用椭圆裁剪图像

    我有一个图像 cv Mat 大小为92x112我想用椭圆包围该图像中的对象 然后仅获取该像素来创建仅包含该对象的另一个图像 我的意思是 用椭圆裁剪原始图像 这是可能的 我正在尝试绘制一个椭圆 但椭圆没有绘制完整 如下所示 ellipse e
  • 如何通过 URI 激活打开 WinUI Maui?

    我创建了一个毛伊岛 Windows 应用程序 我希望通过 URI 激活应用程序并将查询参数传递给应用程序 我在包清单中添加了用于通过 uri 调用应用程序的 Windows 协议
  • 如何使用 AWS CDK 标记 EBS 卷?

    我正在使用 AWS CDK 创建带有 EBS 卷的实例 BlockDevice durableStorage BlockDevice builder deviceName dev sdf volume BlockDeviceVolume e
  • Scrapy tbody标签返回一个空答案,但里面有文本

    我尝试废弃并抓取一个网站 数据位于 tbody 标记 事件名称 中 当我检查谷歌控制台时 tbody标签有文本数据 但是当我尝试废弃它时 它返回一个空答案 也在scrapy shell中进行了测试 我检查了 AJAX 方法 因为它可以使脚本
  • 为什么宏扩展有时会加一个空格?

    如果我这样做 define F a F It expands to a godbolt https gcc godbolt org z reGxqz 如果我这样做 define F F It expands to with a space
  • Swift 将字节数组转换为字符串

    我无法将下面的字节数组快速转换为字符串 let chars UInt8 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 let datastring NSString data
  • 使用 mysqli_query 的长文本最大内存错误

    我工作的公司使用Kayako https www kayako com 管理其支持票证 我准备制作一个外部网络应用程序 它可以获取一家公司的所有门票并显示历史记录 我使用 mysqli query 连接到数据库 link mysqli co
  • 将数组添加到 web.config 中的键

    我想知道是否可以将数组作为键中的值 示例
  • 在 postgresql 中查找现有函数脚本的命令是什么?

    由于我们使用 sp helptext 过程名称 来获取 Sqlserver 中的 SP 脚本 因此我需要可用于从 postgresql 检索函数脚本的命令 请帮忙 如果您使用 pl sql 命令行界面 您可以使用 df 正如 tobixen
  • BGAppRefreshTask 后台任务未执行

    我正在使用新的 iOS13 后台任务框架 并实现 BGAppRefreshTask 类型 我的问题是 即使在等待几个小时之后 我的设备也永远不会调用该任务 但我能够使用调用 simulateLaunchForTaskWithIdentifi