2015-02-26 2 views
1

Я пытаюсь получить мое приложение для выполнения фоновой выборки в определенное, запланированное время. У меня была идея позволить IOS разобраться в этом для себя, так (в AppDelegate):Планирование эскиза фона в iOS

- (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, чтобы вызвать фоновое извлечение, - я не знаю, будет ли это работать, но по соображениям экономии энергии мне не нравится эта идея.) - но это просто вызывает предупреждение, которое будет отображаться на экране, и Я не хочу отображать предупреждение - по крайней мере, не раньше, чем я проверил обновления статуса.

Как всегда, любая помощь будет очень благодарна (но я боюсь, что ответ заключается в том, что я не могу делать то, что хочу!).

ответ

2

Вы не можете делать то, что хотите. Единственным обходным решением является внедрение push-уведомлений и передача API в указанное время.

+0

Когда вы говорите push-уведомления, вы имеете в виду от моего собственного сервера? Или можно что-то настроить, чтобы он полностью работал по телефону? – headbanger

+0

От вашего сервера. Вы не можете сделать это полностью на своем телефоне. –

+0

Какая жалость. Здесь мы надеемся, что код Apple в будущем будет выполнен по расписанию - похоже, такая очевидная вещь. Очевидно, что им нужно будет убедиться, что эта способность не подвергается насилию (точно так же, как они наверняка должны делать для геолокации основных местоположений) – headbanger

Смежные вопросы