iOS 应用程序在模拟器中以后台模式运行但在设备中不运行?

iOS app works in background mode in simulator but not in device?

我正在编写一个时间跟踪应用程序,它在模拟器中完美运行。我在 9:00 按开始键,锁定屏幕,在 9:05 返回,计时器调整为 5 分钟。但是,在我的实际设备上,后台没有任何反应。这是什么原因造成的?
这是我的后台模式代码。我还在目标功能中检查了后台模式。

进入后台模式时,查找日期以计算后台时间。

func appGoesIntoBackground() {
    if isActivityPaused == false {
        quitDate = NSDate()
    }
}

从后台加载后,计算它在后台的时间并显示。

  func appLoadedFromBackground() {
    if isActivityPaused == false {
        let passedSecondsTillInactive = 
  NSDate().timeIntervalSinceDate(quitDate!)
        passedSeconds += Int(passedSecondsTillInactive)
    }
   }

保存到历史记录。如果我删除 startDate = nil 和 choosenActivity = nil,它在模拟器中不起作用。

func saveActivityToHistory() {
    CoreDataHandler.sharedInstance.saveHistory(choosenActivity!.name!, 
startDate: startDate!, endDate: NSDate(), duration: passedSeconds)
    startDate = nil
    choosenActivity = nil
    passedSeconds = 0
    loadCoreDataEntities()
}

在这种情况下,我看不出有任何理由使用后台模式。我建议您以其他方式将 quitDate 保存到 userDefaults、plist 文件或核心数据。这样,应用程序进入后台后发生什么都没有关系,也没有关系多长时间。您在唤醒时从持久数据中检索退出日期并按预期进行。

iOS 8.0 和 11.0 Beta 2 之间的 Simualtor 运行时无法暂停后台任务。从 iOS 11.0 Beta 3 模拟器(它是 Xcode 9.0 Beta 3 的一部分)开始,这个问题已经得到解决。应适当暂停后台应用,以更好地匹配设备行为。