后台任务仅适用于模拟器

Background Task works on Simulator only

背景

我创建了一个示例计时器应用程序,它从特定值开始计数到零。标签显示剩余时间。

每次 NSTimer(1 秒间隔)调用 countDownSecs() 时,它会打印剩余的秒数并执行 println("countDownSecs()")。当倒计时达到 0 秒时,它会发送本地推送通知。
模拟器 中的 运行 工作 时,甚至在后台停留 5 分钟,并连续打印剩余的秒数和 countDownSecs()
另一方面,当 运行 在实际设备上(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)

问题

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

提前致谢:)

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

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