定期后台同步

Periodic background synchronization

我对 iOS 编程还很陌生,现在想实现定期后台同步,以将我的服务器数据与客户端数据同步。我想实现的是与Androids相当SyncAdapter,你可以定义一个时间间隔(例如每30分钟),系统会在后台自动触发定义的任务。

直到现在我都找不到 Swift 3.0 的这种机制所以我需要询问是否有人有经验或对我如何实现这一点有一些提示。

我想做的事情听起来很简单:

当应用首次启动时,应用应设置一个同步管理器,它每 30 分钟自动触发一次后台任务。后台任务负责同步服务器和客户端数据(使用Alamofire)。

我该怎么做?

你不能。 Apple 不允许 3rd 方应用程序有这样的常规后台时间。您需要想出另一种方法,例如在新内容可用时从您的服务器实施

正如@ekscrypto 在他们的评论中指出的那样,您可以 在系统决定获取数据时使用后台获取来加载少量数据。但是,您无法控制何时进行提取。在 Xcode 帮助系统中搜索 "Fetching Small Amounts of Content Opportunistically" 以获取更多信息。

有一个名为 BackgroundFetch 的 iOS 功能,您可以为

设置它

regularly downloads and processes small amounts of content from the network

您可以设置 minimumBackgroundFetchInterval.

与提到的 Android 功能相比,此间隔不能保证。

OS 在黑盒中进行了一些启发。它会奖励您使用“合理的”(OS)CPU 时间/功耗以及用户经常使用。另一方面,您会因为耗尽电池或(甚至更糟)从未被用户 used/opened 而受到惩罚。

参见:Apple Sample and Apple Docs


更新: 自 iOS13 起,BackgroundFetch 已弃用。

有一个类似的新 API 名为 BGTaskBGAppRefreshTask 等同于已弃用的 BackgroundFetch

Apple Docs


或者,根据您的需要,只要服务器端的用户数据发生变化,您就可以 post Silent (push) Notification。静默推送会在不通知用户的情况下唤醒您的应用程序,因此您可以获取数据并可能通过安排本地通知来通知用户。

参见:Apple Documentation