Я пытаюсь получить фоновое приложение iOS для работы в моем приложении. При тестировании в Xcode он работает, при работе на устройстве это не так!
- В моем тестовом устройстве работает iOS 9.3.5 (моя цель развертывания - 7.1).
- Я включил "Фоновая выборка" в разделе "Фоновые режимы" в разделе "Возможности" для цели в Xcode
В приложении: didFinishLaunchingWithOptions Я пробовал различные интервалы с помощью setMinimumBackgroundFetchInterval, включая UIApplicationBackgroundFetchIntervalMinimum
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// tell the system we want background fetch
//[application setMinimumBackgroundFetchInterval:3600]; // 60 minutes
[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
//[application setMinimumBackgroundFetchInterval:1800]; // 30 minutes
return YES;
}
Я реализовал приложение: performFetchWithCompletionHandler
void (^fetchCompletionHandler)(UIBackgroundFetchResult);
NSDate *fetchStart;
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
fetchCompletionHandler = completionHandler;
fetchStart = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:fetchStart forKey:kLastCheckedContentDate];
[[NSUserDefaults standardUserDefaults] synchronize];
[FeedParser parseFeedAtUrl:url withDelegate:self];
}
-(void)onParserFinished
{
DDLogVerbose(@"AppDelegate/onParserFinished");
UIBackgroundFetchResult result = UIBackgroundFetchResultNoData;
NSDate *fetchEnd = [NSDate date];
NSTimeInterval timeElapsed = [fetchEnd timeIntervalSinceDate:fetchStart];
DDLogVerbose(@"Background Fetch Duration: %f seconds", timeElapsed);
if ([self.mostRecentContentDate compare:item.date] < 0) {
DDLogVerbose(@"got new content: %@", item.date);
self.mostRecentContentDate = item.date;
[self scheduleNotificationWithItem:item];
result = UIBackgroundFetchResultNewData;
}
else {
DDLogVerbose(@"no new content.");
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:60];
localNotification.alertBody = [NSString stringWithFormat:@"Checked for new posts in %f seconds", timeElapsed];
localNotification.timeZone = [NSTimeZone defaultTimeZone];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
fetchCompletionHandler(result);
}
-
У меня (успешно!) протестировано с помощью симулятора и устройства с использованием Xcode Debug/SimulateBackgroundFetch
-
Я успешно протестировал новую схему, как показано в другом ответе SO (qaru.site/info/202875/...)
- Мои тесты показывают, что код выполняется в методе performFetch примерно через 0,3 секунды (поэтому он не занимает много времени).
- Я проверил, что устройство имеет обновление фона в настройках.
- Конечно, я рассмотрел другие вопросы SO, надеясь, что кто-то другой испытал одно и то же.:)
При работе на устройстве и не подключенном к Xcode мой код не выполняется. Я открыл приложение, закрыл приложение (не убил приложение!), Ждал часов и дней. Я попробовал регистрацию в обработчиках извлечения, а также написал код для отправки локальных уведомлений.
Я как-то успешно увидел мой локальный тест на устройствах, и на самом деле iOS, похоже, запускал выборку три раза, каждый около пятнадцати минут друг от друга, но потом это никогда не повторялось.
Я знаю, что алгоритм, используемый для определения того, как часто разрешать фоновый выбор, является загадкой, но я ожидаю, что он будет работать хотя бы изредка в течение нескольких дней.
Я не понимаю, что еще нужно проверить, или как устранить неполадку, почему он работает в симуляторе, но не на устройстве.
Оцените любые советы!