我需要在每天凌晨 1 点或每 2 周启动同步。我将如何在 iOS 中实现这一点?iOS 中有没有一种方法可以让我的应用程序在此时提醒我,并且我的应用程序应该在那个特定的时间被提醒。
4 回答
后台获取是操作系统(iOS 7 及更高版本)为请求在后台执行操作的应用程序提供的机会,但由操作系统决定时间。在了解用户对应用程序的使用后,操作系统将在后台静默唤醒您的应用程序(实际上是一个处理程序方法)。
功能使用:截至目前,该功能已在iOS7中引入,以增强社交媒体、报纸等日常/频繁/重度内容刷新应用的可用性。
注意- 它只是一个不能保证被满足的请求,而是底层操作系统试图更好的用户体验)
从编码/实现的角度来看,主要有 2-3 个关键步骤 -
A)打开属性(Background Modes
选择App Target > Capabilities > Background Modes > Background Fetch)
Background Fetch
B)实现这个应用程序委托方法 -
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0);
C)定义您的获取间隔,通常在应用程序启动时 - 即 appDidFinishLaunchingWithOptions
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
由于它是操作系统自动触发的事件,如何在开发过程中测试这种行为 -
好吧,您可以使用菜单Debug > Simulate Background Fetch通过XCode 5+模拟/测试应用程序中的后台获取行为
这是带有示例项目的教程的链接。
此外,您可以从 Apple 的 WWDC 2013 视频中查看会话 204 -多任务处理的新功能
编辑 -
截至今天(iOS 7.0.3),由于缺乏适当的官方文档,实际使用说明 -
- 强制的 minimumBackgroundFetchInterval 介于 5 到 15 分钟之间(任何小于它的时间都不会被接受)。
- 设备锁定时不会发生后台提取。
- 用户解锁设备后立即触发后台获取。
但是,在即将发布的版本中,我认为此功能将得到增强,并为开发人员/用户提供更多功能。
您可以使用NSLocalNotification
. 看一个例子(取自这里):
UILocalNotification *notification = [[UILocalNotification alloc] init];
// Activate in 5 segundos
notification.fireDate = [[NSDate alloc] initWithTimeIntervalSinceNow:5];
// message to show
notification.alertBody = self.nameTextField.text;
// default sound
notification.soundName = UILocalNotificationDefaultSoundName;
// button title
notification.alertAction = @"Ahora te lo cuento";
notification.hasAction = YES;
// activa la notificación
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
关键是当本地通知触发时,行为取决于应用程序状态。如果应用程序在前台运行,您可以静默处理通知。但是如果应用程序没有运行,或者它在后台,则需要用户交互。
我已经成功实现了@Steve 的解决方案——例如在没有后台传输服务的情况下实现 Apple 推送通知。我的应用程序依赖于创建 EKCalendar 事件,然后将触发创建特定开始/结束日期/时间的推送通知。应用程序使用didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
应用程序委托中的函数来处理远程通知的接收,然后根据事件执行一些代码来执行应用程序的必要功能。注意:远程通知消息必须包含content-available
设置为 1。唯一的缺点是依赖于及时发送远程通知,到目前为止,在我的测试期间,它已被证明在 2-30 秒内有效/准确率约为 95+%,但我也见过从未收到通知或延迟超过 1-5 分钟的情况。这种情况很少见,出于我的目的,我的应用程序功能可以接受。
您可能想尝试结合使用 Apple 推送通知和后台传输服务。如果您观看 Ashok 提到的 WWDC 2013 视频,他们在视频中提到让静音推送通知唤醒应用程序,然后您可以配置后台传输。
您可以将您的应用注册为拥有推送通知,让您的服务器向 Apple 发送通知请求,然后在收到推送通知时,您的应用从后台唤醒,您使用 NSURLSession 配置下载/上传,然后启动会话。数据传输完成后,运行同步应用程序所需的任何代码,然后通知操作系统您的后台传输已完成,以便它可以让您的应用程序重新进入睡眠状态。
请注意,时间仍然不在您的控制之下,但这与我所看到的为您的问题创建解决方案一样接近。