当app未运行时,使用通知触发后台同步

时间:2016-12-01 04:18:46

标签: ios objective-c iphone notifications data-synchronization

我已经实现了这个:

  • 在后台模式下启用远程通知
  • 无声通知{"aps": {"content-available": 1}}

在关于推送通知的Apple文档中,他们说:

  

当无声通知到来时,iOS会唤醒您的应用   后台,以便您可以从您的服务器获取新数据或做   背景信息处理。

(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

收到无声通知后。在这种方法中,我从服务器下载一些数据,然后进行数据同步。

预期:

目标是当用户打开/使用应用程序时,它应该反映用户的最新位置。

ACTUAL:

接收静默通知,从服务器下载数据,然后当应用程序在前台和后台运行时数据同步正常工作。

但是不能在后台唤醒应用程序并在我的应用程序未处于运行状态时执行此操作(应用程序未从应用程序切换器启动或终止)。

问题:

当应用未运行时,我的静音通知不起作用? (不能在后台唤醒应用程序)

我的代码中是否缺少需要实现的代码?

如果应用未运行,这种方式不起作用。有没有办法让我的应用程序本地数据始终与数据库服务器相同/同步(当我使用或不使用应用程序时)?其他应用程序如何做到这一点?

1 个答案:

答案 0 :(得分:1)

根据Apple文档,无声通知可以将您的应用程序带到后台以执行您可能需要的任何任务:

  

系统在后台唤醒应用程序(或将其启动到后台)

您正在使用的方法userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:, 调用以让您的应用知道用户为给定通知选择了哪个操作。

您应该实施的正确方法(即使在iOS10中)是: application:didReceiveRemoteNotification:fetchCompletionHandler:。这告诉应用程序已到达远程通知,表明有要提取的数据。

当用户没有积极地与应用程序交互时,您正在执行此操作的方式是在服务器和应用程序实例之间同步数据的正确(并且可能是最流行的方式)。您的问题似乎是您使用了错误的app delegate instance方法进行回调。

更新1:

根据您更新的问题,我已更新了我的答案。

在用户终止后,通知未按照设计提供给您的应用。根据{{​​3}}:

  

如果用户强行退出,系统不会自动启动您的应用。在这种情况下,用户必须重新启动您的应用程序或重新启动设备,然后系统才会再次尝试自动启动您的应用。

要解决此问题,您可以查看documentation。最初用于VoIP应用程序,它也适用于您的应用程序。但是,与常规静默通知不同,这些会唤醒您的应用,即使它已被用户终止。

但是,请记住,一旦用户终止某个应用程序,他希望将其终止(或直到​​他手动重新启动它)。重写这将是糟糕的设计。如果应用程序花费一些时间在启动时下载最新数据如果用户之前已终止该应用程序,那么用户可能会很好吗?根据您在启动之前需要应用程序获取最新信息的确切原因,您可能不需要考虑这种情况。