问题标签 [uibackgroundtask]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
4983 浏览

ios - UIBackgroundTask 抛出错误`不存在后台任务`

当应用程序转换到后台时, AnAVAudioPlayer在后台任务中停止:

AVAudioPlayer上面的函数由包含何时UIApplicationDidEnterBackground发布通知的视图控制器调用。

我仍然在行出现错误backgroundTask = UIBackgroundTaskInvalid

当我删除该行时,我没有收到任何错误。我查看了关于 SO 的类似问题,但它们没有帮助。

是什么导致了这个错误?

0 投票
2 回答
9173 浏览

ios - iOS11 看门狗超时崩溃(0x8badf00d)但代码不在堆栈上

我正在调试我们的应用程序在从 iOS11 开始在后台重复退出的用户报告,即使在活跃使用期间也是如此(例如,用户将我们设置为后台并在几秒钟或一分钟内返回,却发现它重新启动)。崩溃日志都揭示了相同的原因:看门狗超时。以下是此类崩溃日志中的相关信息:

我意识到我们的代码在接收推送通知或后台运行时的运行时间有限。我们肯定会使用 UIBackgroundTasks(使用Alamofire Networking,FWIW),并且我们确实有执行此操作的过期处理程序:

这些崩溃报告最令人困惑的是,我们的代码不在堆栈中。我们可以从Apple 对 0x8badf00d 异常代码的讨论中看到,有问题的代码实际上是在主线程上主动执行的。

但是,就我而言,没有一个堆栈曾经执行过我的任何代码。这是一个有代表性的样本:

我的代码中唯一正在运行的部分是 main.m,第 22 行,即

因此,当我的代码似乎实际上都没有运行时,我对我的应用程序如何因违反运行时间而反复被杀死感到困惑。iOS 11 中是否有任何新功能可以改变看门狗进程的行为?如果不是,我怎么知道我的代码的哪一部分是因运行时间过长而违反的部分?

0 投票
2 回答
1934 浏览

ios - MPMusicPlayerController.systemMusicPlayer setQueue 困难

我的音乐应用程序有问题。这个想法是点击一个按钮并播放更多来自当前正在播放的艺术家的歌曲。当我在应用程序中并点击下一首歌曲时,它运行良好。但是,如果我让歌曲自然结束,应用程序会随机播放一首歌曲。因此,我添加了逻辑来说明歌曲剩余时间是否为 0,然后使用媒体播放器 func 播放下一首歌曲,因为我知道这是可行的。这解决了它,除非应用程序在后台。如果它在后台,我试图让应用程序保持活动状态,但我想这不起作用。

每次我认为我已经解决了一些问题时,问题就会回来。

我期望发生的是锁定艺术家,将应用程序关闭到背景,当歌曲结束时播放艺术家的另一首歌曲。

实际发生的情况是,当我锁定艺术家并将应用程序关闭到后台时,歌曲将结束,有时它会播放正确的歌曲。有时它不会。但是,当它播放错误的歌曲并且我打开应用程序备份时,它会结束当前(错误)播放的歌曲并开始播放适当艺术家的歌曲

明确地说,我认为需要在歌曲剩余时间为 0 时运行的逻辑以跳到下一首歌曲是不明智的,但无论出于何种原因我都需要它

我已将功能设置为后台获取和音频 Airplay 和画中画

我试图只按顺序发布相关代码..

我有财产

在我的ViewDidLoad

我有一个更新播放时间和剩余时间的函数,我有

当我播放音乐时,我有一个 bool isPlaying

如果是,那么时间在流逝,我有这个

我有它可以在后台保持计时器开启,这样当剩余时间为 0 时它将播放下一首歌曲

现在要锁定艺术家,我有以下代码在按钮点击时执行

0 投票
0 回答
64 浏览

ios - 只有当 iPhone 连接到系统(任何操作系统:Windows、Mac 或 Ubuntu)时才会执行后台任务,否则不会执行

该应用程序处于后台,并在与 BLE 设备断开连接时收到回调,之后应用程序必须等待一段时间(1 分钟)然后执行一些代码。该应用程序即使在后台运行并且只是连接到系统(Mac、Windows 或 Ubuntu)时也能按预期运行,但在其他情况下则不然。此行为仅在 iOS 11.3 上可见,在 10.3 上不可见。

当app处于后台,并且在BLE设备断开连接时收到回调,app注册一个定时器为1分钟的后台任务,之后会进行一定的api调用。

以下是我的观察:

  1. 如果设备连接到系统,所有后台任务和 api 调用都会优雅地进行。
  2. 如果设备未连接到系统,则后台任务和 api 调用不会在 iOS 11.3 中执行,但在 10.3 上运行良好(如果计时器超过 10 秒在 10.3 上运行良好,但在 11.3 上运行良好)
  3. 当我进行无线调试时,与 iPhone 的连接会在几秒钟后自动丢失(>10)。(在 11.3 中观察到此行为)
  4. 当计时器小于或等于 10 秒时,该应用程序在所有版本上都能完美运行,即使它没有连接到任何系统。

这是 AppDelegate 中用于在后台启动计时器的代码:

当与 BLE 设备断开连接时,我通过注册到后台任务来启动计时器:

0 投票
2 回答
1289 浏览

ios - 屏幕关闭/设备在 iOS 中锁定时计时器不运行

该应用程序在后台,它会在与 BLE 设备断开连接时收到回调,之后应用程序必须等待一段时间(1 分钟)然后执行一些代码。如果屏幕打开,即使在后台,应用程序也会按预期运行。但如果屏幕关闭,则计时器无法正常工作,并且应用程序无法按预期执行。

这是 AppDelegate 中用于在后台启动计时器的代码:

当与 BLE 设备断开连接时,我通过注册到后台任务来启动计时器:

0 投票
0 回答
31 浏览

ios - 当应用程序在后台时,需要每隔一定时间间隔运行 NSTimer 或触发动态本地通知

根据我的场景,即需要调用 api,然后显示本地通知,再次需要调用 api。

因此,即使应用程序处于活动状态或在后台,每次都需要遵循 3 个程序。

我曾尝试为此使用 NStimer,但是当应用程序处于后台时计时器停止工作,而且我无法安排本地通知,因为它需要在显示通知之前/之后调用 api,而且本地通知内容每次都是动态的。

我还在“使用蓝牙 LE 附件”的 xcode 功能中启用了后台模式。

任何其他建议都会有所帮助,我只想在显示本地通知之前和之后调用 api

重现步骤

即使应用程序进入后台模式,NSTimer 也应该工作,1 小时后应该调用 api,应该显示本地通知,再次调用 api 应该显示通知。

所以每1小时需要遵循这3个程序,每次本地通知内容都是动态的。

我只想在应用程序处于后台时运行计时器。

0 投票
3 回答
2179 浏览

ios - 后台任务未在 Swift 中调用类

我有一个后台任务应该返回一系列课程,然后发送到 Apple Watch。我正在didReceiveMessage通过内部调用任务WatchConnectivity

后台任务需要执行一些操作,例如打开领域数据库、查询结果和访问文档目录,然后才能将响应返回到课程字典。当手表输出获取课程数据时,逻辑似乎起作用。问题是我不认为后台任务实际上是在调用该方法getWatchCourses()

getWatchCourses()如果结果是硬编码的,这也不起作用。应用程序可以在后台执行此逻辑还是应该工作?

还值得指出的是,网上没有任何地方对此进行记录,它们总是指将简单的文本响应发送回手表,而不是处理器密集型的:(

谢谢

0 投票
1 回答
408 浏览

ios - iOS:在后台运行应用程序并更新位置

我打算开发一个适用于地理围栏进入/退出事件的 iOS 应用程序。

我需要在应用程序在后台运行或被操作系统调用大约 5 分钟时运行我的应用程序。就像收到事件监控的通知一样。

我已经通过位置更新启用了后台执行,并在需要时运行后台任务以继续在后台执行。

问题是应用程序只运行了大约 180 秒,然后后台任务自动终止。完成后我尝试重新启动后台任务,但没有成功,应用程序执行在 3 分钟后停止。

是否可以运行应用程序超过 180 秒的时间?我正在使用 iOS 11 和 12 进行测试。

编辑: 我尝试 keepAlive在后台任务完成时调用功能,但是第二次后台执行时间没有增加并且应用程序终止。

0 投票
3 回答
3430 浏览

xcode10 - Swift4.2 类型“UIBackgroundTaskIdentifier”(又名“Int”)没有成员“无效”

我遇到了一个奇怪的问题,即在一个 XCode 项目中工作的代码无法在另一个项目中编译。两者都运行 Swift4.2。

为什么我会收到“UIBackgroundTaskIdentifier has no member 'invalid' 错误?

导入 UIKit 导入基础

我可以跳转到 UIBackgroundTaskIdentifier 定义并看到: 在此处输入图像描述

0 投票
1 回答
1033 浏览

ios - 如果在手机锁定(屏幕关闭)时启动 iOS 后台任务不会保持活动状态

我有一个与 BLE 设备交互的 iOS 应用程序。蓝牙 LE 附件后台模式处于活动状态,因此即使将应用程序置于后台,应用程序也能够连接并与 BLE 设备交互。连接 BLE 设备时,应用程序在后台执行代码以响应与 BLE 相关的回调,但在 BLE 设备断开连接后,应用程序无法再在后台运行代码(应用程序仅在 BLE 设备断开连接后几秒钟内保持活动状态)。

我需要的是一种在 BLE 设备断开连接后执行有限长度任务(大约 1-2 分钟持续时间)的方法。

阅读Apple 文档我尝试使用beginBackgroundTaskWithExpirationHandler:方法。调用此方法,应用程序应请求一些额外的执行时间(大约 3 分钟)。

调用这些方法中的任何一个都会暂时延迟您的应用程序的暂停,给它一点额外的时间来完成它的工作。

我尝试通过调用 beginBackgroundTaskWithExpirationHandler 响应 BLE 断开回调来注册后台任务,我发现了一个奇怪的行为,这取决于调用 beginBackgroundTaskWithExpirationHandler 时手机是否被锁定:

  • 如果调用 beginBackgroundTaskWithExpirationHandler 时手机锁定(即屏幕打开,应用程序既可以显示也可以在后台运行),则后台任务按预期工作并保持活动状态大约 3 分钟,然后将应用程序置于后台并且屏幕关闭。
  • 如果在调用 beginBackgroundTaskWithExpirationHandler 时手机锁定(屏幕关闭),则后台任务在屏幕关闭时不会在后台保持活动状态,并且在再次打开屏幕时会以某种方式恢复

(我在 iPhone 6、iPhone 8 Plus、iPhone 5s 上都试过 iOS 12.1.4)

我使用的方法与这里描述的非常相似,我在这里也发现另一个类似的问题。

这是后台任务的预期行为吗?如果在手机处于锁定状态时启动,操作系统是否会暂停后台任务?

是否有另一种方法可以从应用程序处于后台并且手机被锁定时触发的回调开始持续时间为 1-2 分钟的有限长度任务?

先感谢您,