在iOS中安排ersatz背景提取

时间:2015-02-26 22:14:41

标签: ios cocoa-touch scheduling background-fetch

我试图让我的应用在特定的预定时间执行后台提取。我想让iOS自己解决这个问题,所以(在AppDelegate中):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) {
        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeSound categories:nil]];
    }

    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
    return YES;
}

然后(也在AppDelegate中)

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    NSDate *now = [NSDate date];

    if ((([now timeIntervalSinceDate:lastCheckTime]/60) > 60)||(!lastCheckTime)) { //don't update more than once every hour
        lastCheckTime = now;
        [notificationUpdate getStatusUpdateWithCompletionHandler:completionHandler];
    } else {
        completionHandler(UIBackgroundFetchResultNewData);
    }    
}

如果我手动触发背景检查,在Xcode中,这非常有效。可悲的是,如果我把它留在自己的设备上,它并不能完美地工作。

如何安排执行getStatusUpdate函数的时间或导致在特定时间进行后台获取(实际用例将是应用程序将在用户定义的时间周围检查,如闹钟 - 这不是一直在运行并咀嚼电池的东西。

我在互联网上找到了很多关于安排闹钟的信息(包括这里 - 我在这里找到一个例子,建议使用CoreLocation来引发后台提取 - 我不知道这是否会起作用但是,出于省电的原因,我不喜欢这个想法。) - 但这只会导致警报显示在屏幕上,我不想显示警报 - 至少在此之前我已检查状态更新。

与往常一样,任何帮助都会非常感激(但我担心的答案是我不能做我想做的事!)。

1 个答案:

答案 0 :(得分:2)

你无法做你想做的事。唯一的解决方法是实现推送通知,并让API在指定时间发送推送。