Ладно, снова фоновые режимы вызывают недоумение. Не обижайтесь на тех, кто пытается помочь, но это сложнее, чем кажется.
Прежде всего: Это устарело, как догадался Колбаса в комментариях. Я знаю это точно, потому что в разделе о приложениях VoIP все еще объясняется старый способ сделать это с периодически вызываемым обработчиком. Я немного исследовал это для этого ответа, поэтому предлагаю вам пойти и прочитать его. Важный урок для этого случая заключается в том, что iOS делает различие между завершением приложения пользователем или системой, а также играет роль независимо от того, был ли телефон перезагружен или нет.
Итак, чтобы подвести итог этому (и вашему вопросу), вы в основном хотите знать, является ли эта часть вышеизложенной устаревшей документации правильной дословно:
В большинстве случаев система не перезапускает приложения после их принудительного закрытия пользователем. Единственным исключением являются приложения определения местоположения, которые в iOS 8 и более поздних версиях перезапускаются после принудительного закрытия пользователем. Однако в других случаях пользователь должен запустить приложение явным образом или перезагрузить устройство, прежде чем приложение сможет быть автоматически запущено системой в фоновом режиме. Когда на устройстве включена защита паролем, система не запускает приложение в фоновом режиме до того, как пользователь впервые разблокирует устройство.
Apple: Понимание того, когда ваше приложение запускается в фоновом режиме
Я тщательно изучил остальные документы, но не нашел определенного ответа, поэтому, к сожалению, все сводится к тому, что уже предложил Дэн: протестировать. Я нутром чувствую, что документация по-прежнему верна в этом отношении (как сказано, что не так, это VoIP). Я говорю это, потому что пользовательский интерфейс в приложении «Настройки» вызывает функцию «Обновление приложения в фоновом режиме», поэтому пользователи, вероятно, должны понимать, что приложение, имеющее это разрешение, не будет обновляться, когда они выталкивают его из фона (например, кнопка «Домой» -> проведите пальцем по экрану). ). Для обычных пользователей приложения либо закрыты (вообще не в диспетчере задач), либо на переднем плане (используя их), либо в фоновом режиме (они в диспетчере задач, а другое приложение на переднем плане и/или телефон заблокирован) .
Чтобы действительно проверить это, вам нужно написать приложение и немного поносить его (я полагаю, по крайней мере, два дня) в каждом состоянии. Сначала, когда он находится в фоновом режиме (ОС должна периодически разрешать ему выборку, поскольку вы, вероятно, знаете, что это также может быть запущено в Xcode), а затем, когда он принудительно завершает работу. Проблема состоит в том, чтобы убедиться, что он извлек материал. Я бы выбрал файл журнала, которым можно поделиться через iTunes. Я набрал код для этого:
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"We're awake! Booyah!");
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config
delegate:nil
delegateQueue:[NSOperationQueue mainQueue]];
NSMutableURLRequest *request = [NSMutableURLRequest new];
request.HTTPMethod = @"GET";
request.URL = [NSURL URLWithString:@"https://www.google.com"];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:^(NSData * _Nullable data,
NSURLResponse * _Nullable response,
NSError * _Nullable error) {
NSDate *now = [NSDate date];
NSString *toLog = [NSString stringWithFormat:@"%@ - fetched\n",
[now description]];
[self updateTestDocumentWithString:toLog];
NSLog(@"Yay, done!");
completionHandler(UIBackgroundFetchResultNewData);
}];
[task resume];
}
- (void)updateTestDocumentWithString:(NSString *)toAppend {
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [[docDir stringByAppendingPathComponent:@"logfile.txt"] copy];
if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
if (![[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil]) {
NSLog(@"We're effed...");
return;
}
}
NSFileHandle *file = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
if (!file) {
NSLog(@"We're effed again...");
return;
}
[file seekToEndOfFile];
// ensure this is never nil
[file writeData:[toAppend dataUsingEncoding:NSUTF8StringEncoding]];
[file closeFile];
}
Это войдет в делегат приложения, и не забудьте добавить логическую настройку Application supports iTunes file sharing
в plist вашего приложения. Я оставлю это на моем устройстве для разработки на некоторое время и проверю файл журнала, в конечном итоге сообщив об этом здесь. Не стесняйтесь проверить это на себе.
person
Gero
schedule
06.07.2017
Background Fetch
— это услуга. Во-вторых, я нашел это, и в обсуждении говорится:If you do not call the completion handler in time, your app is terminated.
о чем +/- 30 секунд макс. Когда приложение завершается, не ожидайте, что обработчик будет вызван снова, если вы не запустите приложение. - person Xorifelse   schedule 29.06.2017