iOS上可靠的后台同步

前言

我写了一个应该显示即将发生的事件的移动应用 该应用程序从服务器下载数据。 数据每24小时分批准备一次,准备在凌晨4点以后提取。 这为我提供了一个绝佳的机会,可以在一夜之间进行同步,并在用户打开应用程序时立即提供新的数据。

后台获取

这是我第一个与服务器同步数据的方法。 它被广告为非常强大的function,但单独使用它(超出testing环境)是不够的:

  • 没有办法强制后台提取以确切的间隔执行。

我认为可以configuration后台获取操作的频率

// Setup background fetch let timeIntervalEveryHour: NSTimeInterval = 3600 let sharedApp = UIApplication.sharedApplication() sharedApp.setMinimumBackgroundFetchInterval(timeIntervalEveryHour) 

但它仍然是dynamic的, 我认为从来没有经常使用应用程序的用户。

  • 如果禁用了“后台应用程序刷新”,如果设备处于“低功耗模式”,则自动发生后台提取将不会被触发。

  • 其他问题,如设备locking时的数据保护 ,以及完成所有任务的30秒窗口都会被考虑。

远程(无声)通知

所以我采取了下一步,并configuration服务器发布无声通知,一旦批准备就绪,发现这还是不够的:

  • 如果应用程序被用户强制终止或设备重新启动,则不会处理通知。
  • 费率限制。 交付将被延迟,这取决于苹果公司没有明确规定的各种因素,但可能 – 电池寿命,手机是否在蜂窝电话等。

    有时会在应用程序启动时分派静默推送通知,这可能会导致检查手动同步的竞争状况。 所以我会尝试通过添加"alert" = ""; 到有效载荷。 (正如这里所build议的那样)

  • 无声推送通知可以被用户禁用“背景应用刷新” – 源

手动同步

为了确保数据始终保持最新状态,如果最近没有更新数据,当应用程序到达前台时,会向用户显示要求手动同步的警报。 也可以稍后从设置选项卡启动。 不幸的是,根据分析,大部分获取请求都是手动完成的。

第一次运行的情况下也处理。

下一步

我正在考虑使用VOIP通知。 即使力量被杀,他们也应该唤醒应用程序。 不过,我担心这会导致应用程序被拒绝。

问题

有什么我失踪? 我知道背景同步取决于各种因素,可能没有互联网连接等,但有什么办法让它更可靠吗?