后台任务仅适用于模拟器
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 模拟器运行良好。)
代码
在AppDelegate
的applicationDidEnterBackground()
中,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
在实际设备的后台不起作用。它仅适用于模拟器。但是,您可以使用 UIApplication
s 方法 beginBackgroundTaskWithExpirationHandler
执行后台任务,但是 Apple 为后台执行设置了硬性限制(如果我没记错的话,只有 180 秒)。
建议使用UILocalNotification
s 而不是后台任务。
【讨论】:
首先,感谢您抽出宝贵时间。其次,我不相信这是真的。正如我所写,它根据实际建议起作用,但我不记得有什么不同/什么时候停止工作并且无法将其恢复到该版本。我还写道,我已经在使用UILocalNotification
s,这使它首先工作。
也许您以前使用过后台任务?因为当应用进入后台模式时,任何代码都应该停止。
不知道后台任务是如何工作的。当我在applicationDidEnterBackground()
中实现UILocalNotification
时,它开始起作用了。另请注意,即使我完全退出应用程序(从多任务处理),通知仍然有效。
是的,UILocalNotification
s 即使在应用程序关闭时也能工作,因为它们不是后台任务。
这里来自 Apple 开发人员文档,用于后台执行:developer.apple.com/library/ios/documentation/iPhone/Conceptual/…以上是关于后台任务仅适用于模拟器的主要内容,如果未能解决你的问题,请参考以下文章
推送通知后台任务崩溃 Windows Phone 8.1 模拟器/设备
Google nearBy BLE 后台订阅仅适用于事件屏幕
Android编程,后台任务中的后台任务(Context)不能应用于()