后台任务仅适用于模拟器

Posted

技术标签:

【中文标题】后台任务仅适用于模拟器【英文标题】:Background Task works on Simulator only 【发布时间】:2015-06-03 21:04:13 【问题描述】:

背景

我创建了一个示例计时器应用程序,该应用程序从特定值倒数到零。一个标签显示还剩多少时间。

每次NSTimer(1 秒间隔)调用countDownSecs() 时,它都会打印还剩多少秒并执行println("countDownSecs()")。当倒计时达到0 秒时,它会发送本地推送通知。 当在工作模拟器中运行时,它甚至会停留在后台并持续打印剩余的秒数和countDownSecs() 5 分钟。 另一方面,在实际设备(iPhone 4S、ios 8.1.3 和 iOS 8.3)上运行时,它会在进入后台时立即停止。 (它之前在 iOS 8.3 上运行过。我认为这可能是因为 iPhone 4S 无法处理,但 iPhone 4S 模拟器运行良好。)

代码

AppDelegateapplicationDidEnterBackground() 中,UILocalNotification 的代码如下:

var alarmTime: NSDate = NSDate()
var app: UIApplication = UIApplication.sharedApplication()
var notifyAlarm: UILocalNotification = UILocalNotification()

//counterAll contains the total amount of seconds        
alarmTime.dateByAddingTimeInterval(NSDate.timeIntervalSinceReferenceDate())
notifyAlarm.fireDate = NSDate(timeIntervalSinceNow: counterAll)
notifyAlarm.timeZone = NSTimeZone.defaultTimeZone()
notifyAlarm.repeatInterval = NSCalendarUnit(0)
notifyAlarm.soundName = "Time's Up.m4a"
notifyAlarm.alertBody = "Time's Up! - Your timer has ended."
app.scheduleLocalNotification(notifyAlarm)

问题

我可以更改任何内容来解决此问题吗?

提前致谢:)

【问题讨论】:

alarmTime 不应该是 fireDate 吗? alarmTime 始终为 0,所以我使用了 NSTimeInterval counterAll。通知运行良好。 你注册UserNotificationSettings了吗? 是的,正如我所说,通知工作正常。 我认为你应该使用 NSTimer(fireDate:) 而不是使用倒计时 【参考方案1】:

默认情况下,NSTimer实际设备的后台不起作用。它仅适用于模拟器。但是,您可以使用 UIApplications 方法 beginBackgroundTaskWithExpirationHandler 执行后台任务,但是 Apple 为后台执行设置了硬性限制(如果我没记错的话,只有 180 秒)。

建议使用UILocalNotifications 而不是后台任务。

【讨论】:

首先,感谢您抽出宝贵时间。其次,我不相信这是真的。正如我所写,它根据实际建议起作用,但我不记得有什么不同/什么时候停止工作并且无法将其恢复到该版本。我还写道,我已经在使用UILocalNotifications,这使它首先工作。 也许您以前使用过后台任务?因为当应用进入后台模式时,任何代码都应该停止。 不知道后台任务是如何工作的。当我在applicationDidEnterBackground() 中实现UILocalNotification 时,它开始起作用了。另请注意,即使我完全退出应用程序(从多任务处理),通知仍然有效。 是的,UILocalNotifications 即使在应用程序关闭时也能工作,因为它们不是后台任务。 这里来自 Apple 开发人员文档,用于后台执行:developer.apple.com/library/ios/documentation/iPhone/Conceptual/…

以上是关于后台任务仅适用于模拟器的主要内容,如果未能解决你的问题,请参考以下文章

推送通知后台任务崩溃 Windows Phone 8.1 模拟器/设备

Google nearBy BLE 后台订阅仅适用于事件屏幕

仅适用于部分用户的蓝牙 iOS 后台模式

Android编程,后台任务中的后台任务(Context)不能应用于()

适用于 Windows Phone 8.1 的后台媒体播放器中的无缝循环

仅启动一次后台服务,并在任务完成后停止