定期后台同步
Posted
技术标签:
【中文标题】定期后台同步【英文标题】:Periodic background synchronization 【发布时间】:2016-10-30 11:29:47 【问题描述】:我对 ios 编程很陌生,现在想实现一个周期性的后台同步来同步我的服务器数据和客户端数据。我想要达到的效果与androids SyncAdapter
相当,您可以定义一个时间间隔(例如每30分钟),系统将在后台自动触发定义的任务。
到目前为止,我还没有为 Swift 3.0 找到这样的机制,所以我需要询问是否有人有经验或对我的一些提示,我该如何实现这一点。
我想做的事情听起来很简单:
当应用首次启动时,应用应设置一个同步管理器,该管理器每 30 分钟自动触发一次后台任务。后台任务负责同步服务器和客户端数据(使用 Alamofire)。
我该怎么做?
【问题讨论】:
【参考方案1】:有一个名为 BackgroundFetch
的 iOS 功能,您可以对其进行设置
定期从网络下载和处理少量内容
您可以设置minimumBackgroundFetchInterval
。
与上面提到的 Android 功能相比,这个间隔并不能保证。
操作系统在黑盒中进行一些启发式操作。它奖励您使用“合理的”(对操作系统而言)CPU 时间/功耗以及用户经常使用的奖励。另一方面,您会因耗尽电池或(更糟糕的是)从未被用户使用/打开而受到惩罚。
请参阅:Apple Sample 和 Apple Docs
更新:自 iOS13 起,BackgroundFetch
已弃用。
有一个类似的新 API,名为 BGTask
,BGAppRefreshTask
等同于已弃用的 BackgroundFetch
。
见Apple Docs
或者,根据您的需要,您可以在服务器端的用户数据发生变化时发布Silent (push) Notification
。静默推送会在不通知用户的情况下唤醒您的应用,因此您可以获取数据并可能通过安排本地通知来通知用户。
见:Apple Documentation
【讨论】:
@AkashRajput 你会因为获得更少的时间而受到惩罚,即你的后台获取被触发的频率更低。 对于那些新发现这篇文章的人,你想要的部分被称为“机会主义地获取少量内容”developer.apple.com/library/archive/documentation/iPhone/…【参考方案2】:你不能。 Apple 不允许 3rd 方应用程序有这样的常规后台时间。当有新内容可用时,您需要想出另一种方法,例如从您的服务器实现silent push notification。
正如@ekscrypto 在他们的评论中指出的那样,当系统决定提取少量数据时,您可以使用后台提取来加载少量数据。但是,您无法控制何时进行提取。在 Xcode 帮助系统中搜索“Fetching Small Amounts of Content Opportunistically”了解更多信息。
【讨论】:
哇!你是认真的吗?对我来说没有这样的功能听起来令人难以置信。NSBackgroundActivityScheduler
我在 google 上找到了它,但在 Swift 3.0 中它不存在。
您可以从文档中看到 - developer.apple.com/reference/foundation/… - NSBackgroundActivityScheduler
适用于 MacOS,而不是 iOS。在 iOS 上,您需要使用后台获取或服务器推送
你绝对可以,在标题为“机会性地获取少量内容”的部分中查看developer.apple.com/library/archive/documentation/iPhone/…
@ekscrypto,关于机会性数据获取的好点,但这不符合 OP 定期获取数据的要求。相反,系统会决定何时是获取数据的好时机(我的猜测是当手机或 WiFi 连接“亮起”并且可以实时访问互联网时。)以上是关于定期后台同步的主要内容,如果未能解决你的问题,请参考以下文章