如何在特定时间点进行背景获取,例如午夜



我有一个应用程序,该应用程序是从地址簿中同步的,我只需要自动检查新联系人并将此联系人同步到我的应用程序数据库中。

我已经获得了ios7新功能"背景获取",但这与我的要求不符,在此中,OS将根据用户活动触发fetch。

但是,我的数据在上午12点之前已经过时了,如果在此特定时间实例中未启动此活动,我的应用程序将毫无用处。

是否有任何方法可以实现我所需的目标,以便我可以使用背景过程将数据库与通讯簿同步。

谢谢

您无法配置背景获取的时间。相反,您可能想查看iOS 7的新远程通知功能。

远程通知本质上是推送通知,但它们包括content-available属性。当这些通知之一到达时,系统将唤醒您的应用程序并调用应用程序委托方法:

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

在此方法中,您可以执行背景获取以检索新数据。

您必须设置服务器,以将数据刷新后,将远程通知发送到您的应用程序,以提示他们更新自己。

有关远程通知的更多信息,请参见此问题OBJC.IO和"使用推送通知启动下载"。

您是否真的需要在午夜更新数据?还是必须在午夜之后进行更新?

您仍然可以使用背景获取功能。只需让操作系统唤醒您检查一下,如果它是午夜过期,请执行您的更新。即使操作系统要等到下一个应用程序发布,您也会在下一个发布会上进行。如果用户在此期间未启动该应用程序,是否确实有必要在某些特定时间更新数据?

您可以在修改地址簿数据库时订阅ABAddressBookRegisterExternalChangeCallback以接收通知。我认为它比棚的同步要好,但是,只有当应用在前景中,这才能起作用。但是,当该应用程序被暂停时,它不能直接引起自己的行动。它以前无法安排NSTimer,无法使用performSelector:afterDelay之类的东西,依此类推。该应用程序再次活跃的唯一方法是,如果用户可以使其活跃起来,例如收到本地或远程通知并弹出了警报。只有在应用程序具有背景模式时,才允许在后台模式下执行应用程序,则允许使用:voipaudiolocationnewstand。即使它具有这些类型之一,应用程序也无法在没有某些限制的情况下执行其代码。

因此,唯一的方法是iOS 7功能:background task execution if content avaliable正如詹姆斯·弗罗斯特(James Frost)所建议的那样,但是为此,您需要外部服务器,这将向您的应用程序发送推送通知。

您说:"...is not started at this particular time instance my app will be rendered useless.",但是谁将检查它,直到该应用再次启动?如果时间值之间的三角洲比某个值更大,为什么在每个应用程序运行期间都无法通过通讯簿进行所有关键更新。我的意思是,您可以(当应用程序返回到applicationDidFinishLaunching中的前景时)计算[NSDATE NOW]和您在同步完成后存储在NSUserDefaultsplist中的最后一个同步日期值之间的三角洲。如果三角洲更大,例如大于24小时,然后再次调用同步mehtod。

詹姆斯的答案是最正确的。如果您设置了后端以在午夜向所有设备发送通知,则可以在那个时候触发背景获取。这样,用户很可能不会看到加载对话框。只是不要以100%的确定性来确定用户收到推动并得到正确提取,因为一路上可能出了问题。

您可以设置一个脚本来进行推动,然后在该脚本上进行cron Job Call。我过去曾使用https://www.setcronjob.com进行此类事情,并且效果很好。

设置服务来处理推送通知管理也可能是个好主意。如果您选择走这条路线,我建议解析(http://www.parse.com)。

另一个更简单的选项可能就是将应用程序上的背景提取间隔设置为最小值。

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

在大多数情况下,这应该足以满足您的目的。

最新更新