为什么我不能在 swift 3 的应用程序中使用后台模式?

why I can't use background mode in my app in swift 3?

我想在我的应用程序中使用后台模式,所以在功能中我勾选了后台获取和通知但问题是在模拟器中一切正常,而在真实的 iPhone 中应用程序会冻结在后台

您无法在后台模式下从服务器获取最新内容,因为 Apple 只允许在特定原因下获取内容,例如。

  • 实施长运行任务
  • 对于需要更多执行时间来执行的任务,您必须 在后台请求对 运行 它们的特定权限,而无需 他们被停职。在 iOS 中,只允许特定的应用类型 在后台 运行:

    • 在后台向用户播放音频内容的应用, 例如音乐播放器应用
    • 在后台录制音频内容的应用程序
    • 让用户随时了解其位置的应用,例如 导航应用程序
    • 支持互联网协议语音 (VoIP) 的应用程序
    • 需要定期下载和处理新内容的应用程序
    • 从外部配件接收定期更新的应用程序

实现这些服务的应用程序必须声明它们支持的服务并使用系统框架来实现这些服务的相关方面。声明服务让系统知道您使用了哪些服务,但在某些情况下,实际上是系统框架阻止了您的应用程序被挂起。

除了这些,您还可以在短时间内从服务器获取内容,例如。 1-2 分钟,具体取决于 cpu 使用情况

func doUpdate() {
    DispatchQueue.global(qos: .default).async(execute: {() -> Void in
        self.beginBackgroundUpdateTask()
        var response: URLResponse? = nil
        var error: Error? = nil
        let responseData: Data? = try? NSURLConnection.sendSynchronousRequest(request, returningResponse: response)
        // Do something with the result
        self.endBackgroundUpdateTask()
    })
}

func beginBackgroundUpdateTask() {
    backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(withExpirationHandler: {() -> Void in
        self.endBackgroundUpdateTask()
    })
}

func endBackgroundUpdateTask() {
    UIApplication.shared.endBackgroundTask(backgroundUpdateTask)
    backgroundUpdateTask = UIBackgroundTaskInvalid
}