Загрузка NSURLSession не работает
Я пытаюсь загрузить несколько файлов, используя NSURL
фоновый сеанс с nsurlsessiontask
. Все работает как прелесть, когда приложение работает в режиме отладки (когда устройство подключено к Xcode), не работает при отключении устройства (iPad) от Xcode.
Я использую Xcode 7.3.1 с iOS 9.3.5. Я уже провел недели, отслеживая это странное поведение, но не получив прорывов. Может быть, я пропустил что-то, чтобы выполнить загрузку фона.
Недавно обновленные версии Xcode до 8.1.2 и iOS до 10.2.1 при условии, что обновление может решить проблему, но это не так.
Ответы
Ответ 1
В Навигаторе проектов выберите цель проекта в верхней части. Затем в главном окне перейдите на вкладку "Возможности", и там будут отображаться все функции, которые можно включить или отключить, просто используя кнопку переключателя. Среди них найдите область фоновых режимов (вторая с конца) и нажмите кнопку переключателя справа, чтобы включить ее. ![введите описание изображения здесь]()
После этого swith 'Background fetch'.
![введите описание изображения здесь]()
Ответ 2
Оформить мой рабочий код,
NSURL *url = [NSURL URLWithString:imageURL];
NSURLSessionTask *_imageDownloadTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (data) {
//Here you can read your files from data
if (image) {
dispatch_async(dispatch_get_main_queue(), ^{
//Save your files here for cache purpose
@try {
//You can handle onDownloadFinishWithFile: here too using delegate protocol
}
@catch (NSException *exception) {
NSLog(@"%@", exception.reason);
}
@finally {
// Defines a block of related code that is subsequently executed whether an exception is thrown or not.
}
});
}
}
}];
[_imageDownloadTask resume];
[ Примечание: Я использую код выше для загрузки изображений].
Ответ 3
Убедитесь, что флажок Фоновая выборка в фоновых режимах отмечена.
![введите описание изображения здесь]()
Ответ 4
см. ссылку ниже и выполните шаги
https://www.appcoda.com/background-transfer-service-ios7/
-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
// Check if all download tasks have been finished.
[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
if ([downloadTasks count] == 0) {
if (appDelegate.backgroundTransferCompletionHandler != nil) {
// Copy locally the completion handler.
void(^completionHandler)() = appDelegate.backgroundTransferCompletionHandler;
// Make nil the backgroundTransferCompletionHandler.
appDelegate.backgroundTransferCompletionHandler = nil;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// Call the completion handler to tell the system that there are no other background transfers.
completionHandler();
// Show a local notification when all downloads are over.
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.alertBody = @"All files have been downloaded!";
[[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
}];
}
}
}];
}