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 后台任务未执行 的相关文章

  • 如何在IOS中的UIStackView中设置权重

    UIStackView与安卓类似LinearLayout但我不知道如何设置子视图的权重 假设我有一个垂直的UIStackView and 3 UIImageView就在里面 我想连续设置权重3 6 1UIImageViews 我怎么做 UI
  • 将永久字符添加到 UITextField

    有没有办法将字母永久添加到 UITextField 中 用户无法删除它 我想添加一个字符 用户无法删除它 但他们仍然可以在之后添加字母 Cheers 附注这是适用于 iOS 的 A UITextField有一个名为 应该更改范围内的字符 的
  • 从 UIImagePickerController 相机视图推送 viewController

    我正在开发一款消息应用程序 类似于 WhatsApp 用户可以互相发送文本和图像消息 当用户想要发送图像时 他可以从相机胶卷中选择一张图像 也可以用相机拍摄一张图像 这就是我介绍的方式UIImagePickerController对于这两种
  • 本地化现有的 iOS 应用程序

    我不敢相信以前没有人问过这个问题 要么是我的编码实践太无组织性 要么是我没有使用正确的关键字 How can I localize an existing iOS app that does not use NSLocalizedStrin
  • 如何使用 NSUserDefaults 在 Swift 中存储自定义类的数组?

    我有一个名为的自定义类Person当某人输入信息时 它会存储有关某人的各种属性 class Person Person dictionary variable var name String var age String var html
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • UIScrollView setZoomScale 将应用的旋转设置回零

    我已经从事地图替换工作很长一段时间了 整个事情的工作原理是UIScrollView由一个支持CATiledLayer 为了旋转我的地图 我旋转图层本身 使用CATransform3DMakeRotation 到目前为止效果很好 但如果我打电
  • 当地图视图只是屏幕的一部分时,如何在 iOS 模拟器中进行捏合?

    我在 iPad 上有一个视图 我正在添加MKMapView也就是说 全屏高度的一半 然而 当我尝试在 iOS 模拟器上进行捏合时 它不起作用 因为 to nubs 填充了模拟器上的整个 iPad 视图 And so with the map
  • 更改组织以使用 Xcode 9 在 iTunes Connect 上上传二进制文件

    我在 Xcode9 上配置了多个团队 当我尝试将二进制文件上传到 Xcode 9 上的 iTunes Connect 时 没有更改团队的选项 并且出现以下错误 ERROR ITMS 4088 来自苹果开发者论坛的解决方案 1 正常存档2 窗
  • 如何使用AudioKit保存音频文件?

    我有音频文件 我给它做了一些效果 let pitchshifter AKPitchShifter self audioPlayer pitchshifter shift 10 AudioKit output pitchshifter 如果我
  • 如何接收有关与我共享的记录中所做更改的 CloudKit 通知?

    我有两个 iCloud 帐户 A and B 在两个不同的设备上 来自其中之一 A 我将 ckrecord 分享给另一个人 B 像这样 let controller UICloudSharingController controller p
  • UIButton的高亮状态由什么控制事件开始和结束

    我正在创建类似钢琴的视图UIButton作为钢琴键 什么UIControlEvents当按钮获得和失去突出显示状态时 我应该监听以获得回调吗 我试图创建子类UIButton并添加属性观察者highlighted并且运行良好 然而 有时我需要
  • 如何使用 Swift 使用 TouchID?

    Apple 为 iOS 8 的 TouchID 实现提供的文档采用 Objective C 语言 有 Swift 版本吗 Objective C IBAction touchIDAvailable UIButton touchIDAvail
  • 推送动画,没有阴影和停电

    我有一个简单的iOS NavigationController基于应用程序 二UICollectionViews 相继 如果元素打开 第一个合集 被点击时 第二集 将被打开 非常简单 重要的提示 Both UICollectionViews
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • ios水平居中约束问题?

    I am having hard time in learning constraints auto layout in iOS I have used any width any height I have a storyboard sc
  • 在 iOS 中,如何创建一个始终位于所有其他视图控制器之上的按钮?

    无论是否呈现模态或用户执行任何类型的转场 有没有办法让按钮在整个应用程序中 始终位于顶部 而不是屏幕顶部 有什么方法可以让这个按钮可拖动并可捕捉到屏幕上吗 我正在以苹果自己的辅助触摸作为此类按钮的示例 您可以通过创建自己的子类来做到这一点U
  • PFQueryTableViewController 错误

    我正在遵循在线教程 使用 Parse 作为后端创建照片共享应用程序 我已经运行了两次教程 两次都从头开始创建应用程序 但在同一位置仍然出现相同的错误 我到处寻找解决方案 但仍然没有运气 我正在使用 PFQueryTableViewContr
  • Swift 中的 import 语句是否有相关成本?

    阅读字符串宣言 我看到一个段落 https github com apple swift blob master docs StringManifesto md batteries included关于避免Foundation不需要的时候导
  • UIView晃动动画

    我试图在按下按钮时使 UIView 摇动 我正在调整我找到的代码http www cimgf com 2008 02 27 core animation tutorial window shake effect http www cimgf

随机推荐

  • 数据属性变为整数

    看看这个简单的例子在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