如何在 iOS 后台运行服务以接收本地通知?

Posted

技术标签:

【中文标题】如何在 iOS 后台运行服务以接收本地通知?【英文标题】:How to run a service in iOS background to receive local notification? 【发布时间】:2017-02-27 10:29:24 【问题描述】:

我正在开发与服务器有 MQTT 连接的应用程序,并且服务器正在发送一些与设备相关的值,并相应地更改 UI。但是,当应用程序处于后台时,用户应该会收到有关某些值已更改的本地通知。我知道 ios 中不允许使用后台服务,但我想确保没有办法实现这一点。

我通过UIApplication.shared.beginBackgroundTask 在后台成功添加了本地通知应用程序,但它仅在苹果终止应用程序后的 3 分钟内有效。

    func registerBackgroundTask() 
        backgroundTask = UIApplication.shared.beginBackgroundTask  [weak self] in
            self?.endBackgroundTask()
        
        assert(backgroundTask != UIBackgroundTaskInvalid)
    
    func endBackgroundTask() 
        print("Background task ended.")
        UIApplication.shared.endBackgroundTask(backgroundTask)
        backgroundTask = UIBackgroundTaskInvalid
    

只需调用self.registerBackgroundTask() 即可让应用在后台运行三分钟。

接下来我要尝试的是后台获取和小部件来运行服务,在这里我只是想要一些建议,上面两个中的一个有没有可能起作用?

【问题讨论】:

【参考方案1】:

听起来“与外部附件通信”将是适合您的应用程序的后台模式。 请参阅Apple Docs 以供参考。 您必须为您的项目激活背景模式并将值设置为“external-accessory”。然后,您可以在后台进行持续的小下载。 Apple 以心率监测器为例。

请注意,持续的后台轮询会浪费能源并且会很快耗尽电池电量。检查您的应用程序是否真的需要它。如果用户只需要不频繁的通知/警报,远程通知将是一个更好的解决方案。我在自己的项目中使用远程通知,它工作得非常流畅和可靠。额外的好处是,即使用户之前关闭了应用,它也会唤醒应用。

【讨论】:

实际上在 MQTT 中存在与服务器的套接字连接,并且在创建连接后,服务器会在某个时间间隔内发送设备状态,我不知道如何在后台模式下使用上述任何苹果模式提供 外置附件需要支持外置附件框架。见developer.apple.com/reference/externalaccessory。对于通用 MQTT 设备,这是不可能的。要将该设备与 iOS 一起使用,您需要使其与 iOS 兼容,方法是使其成为“外部附件”或使用远程通知。如果您无法更改设备,则需要一个自己的小型服务器来执行 MQTT 并将其转换为 iOS/后台兼容流量。 感谢您的解释,我将与我的团队讨论此事 @transistor 你说“即使用户之前关闭了远程通知,它也会唤醒应用程序。”。你能解释一下吗?您的意思是在应用未运行或其他情况时收到警报吗? 这当然是主要功能之一。您希望随时收到通知。想象一下你的电池没电了,你的手机关机了。您不希望手动启动电子邮件和 Twitter 应用程序以再次获取通知。见developer.apple.com/library/content/documentation/…【参考方案2】:

超过 3 分钟。您将启用任何模式。否则当应用程序进入后台应用程序时。 3 分钟后,App 将不会执行任何操作。

【讨论】:

但我没有使用任何位置更新,那么这样做是否正确? 如果您没有使用任何模式。在后台应用程序将在 3 分钟后无法运行。因为苹果不允许应用在后台继续运行超过几分钟。 是的,我知道如果我不使用任何模式,Apple 不允许应用程序继续在后台运行,但在这里我想知道的是我的情况是在我可以使用的任何模式下出现的? 是的,它将解决任何模式。如果您选择位置更新而不是如何在后台工作。这可能是很好的参考***.com/questions/6347503/…

以上是关于如何在 iOS 后台运行服务以接收本地通知?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 在后台在应用程序中接收本地通知时执行功能

iOS10应用关闭时如何响应本地通知?

本地通知 ios 11 在后台

iOS如何在本地通知上启动后台任务

iOS 本地通知 - 在后台时回调

iOS(本地通知与远程通知)