定期后台同步

13

我对iOS编程很新,现在想实现定期后台同步以将我的服务器数据与客户端数据同步。我想要实现的类似于Android的SyncAdapter,你可以定义一个时间间隔(例如每30分钟),系统会自动在后台触发所定义的任务。

到目前为止,我还没有找到Swift 3.0的这种机制,所以我想问是否有人有经验或一些提示,告诉我如何实现这一点。

我想做的听起来很简单:

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

我该怎么做呢?

2个回答

14
这里有一个iOS功能叫做BackgroundFetch,你可以设置它来定期从网络中下载和处理少量的内容。你可以设置一个minimumBackgroundFetchInterval。与提到的Android功能相反,这个间隔并不是保证的。操作系统在一个黑盒子中进行一些启发式。它会奖励你使用“合理”的(对于操作系统而言)CPU时间/电源消耗,并且还会被用户经常使用。另一方面,如果你消耗电池电量或者(更糟糕的是)从不被用户使用,你就会受到惩罚。请参见:Apple SampleApple Docs

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

有一个类似的新API叫做BGTaskBGAppRefreshTask是弃用的BackgroundFetch的替代品。

请参见苹果文档


根据您的需求,您可以在服务器端用户数据更改时发布一个“静默(推送)通知”。 静默推送会唤醒您的应用程序而不通知用户,因此您可以获取数据并通过安排本地通知来通知用户。 详情请参见:Apple Documentation

@AkashRajput 你会受到惩罚,即你的后台获取触发频率会降低。 - shallowThought
对于那些刚发现这篇文章的人,你想要的部分叫做“机会主义地获取少量内容” ,位于https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html。 - ekscrypto

0

不行。苹果不允许第三方应用程序像那样拥有常规的后台时间。您需要想出另一种方法,例如在服务器上实现静默推送通知,以便在有新内容可用时进行通知。

正如@ekscrypto在他们的评论中指出的那样,您可以使用后台获取功能在系统决定获取数据时加载少量数据。但是,您无法控制获取发生的时间。在Xcode帮助系统中搜索“机会性地获取少量内容”以获取更多信息。


哇!你是认真的吗?对我来说,没有这样的功能听起来不可思议。那个名为NSBackgroundActivityScheduler的东西,我在谷歌上找到了它,但在Swift 3.0中已经不存在了。 - Mulgard
你可以从文档 - https://developer.apple.com/reference/foundation/nsbackgroundactivityscheduler - 中看到,NSBackgroundActivityScheduler 是为 MacOS 而不是 iOS 设计的。在 iOS 上,您需要使用后台获取(background fetch)或服务器推送(server push)。 - Paulw11
你绝对可以,看一下https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html中的“机会地获取少量内容”一节。 - ekscrypto
@ekscrypto,你提到了有关机会获取数据的好点子,但这并不符合OP的要求,即按照规律间隔时间获取数据。相反,系统会决定何时是获取数据的好时机(我猜测是当移动网络或WiFi连接“亮起来”且可以访问互联网时)。 - Duncan C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接