Я реализовал код для загрузки кусков размером 1-2 МБ в пакете из 20. После завершения сеанса первого запроса на загрузку 20 будет установлен новый пакет из 20 запросов в сеансе.Я проверил это на реальном устройстве в консольном журнале и нашел это.
default 15:56:03.627080 +0800 xyz __nw_socket_service_writes_block_invoke sendmsg(fd 14, 31 bytes): socket has been closed
default 15:56:03.671468 +0800 mediaserverd -CMSessionMgr- cmsmHandleApplicationStateChange: CMSession: Client com.xyz with pid '1447' is now Background Suspended. Background entitlement: NO
default 15:56:03.671804 +0800 mediaserverd 1067: pid 1447(xyz)
default 15:56:03.672156 +0800 mediaserverd 3138: sid:0x1a653, xyz(1447), 'prim' new state = Background Task Suspended
default 15:56:03.673578 +0800 locationd Client com.xyz disconnected
default 15:56:03.694200 +0800 symptomsd 1447 com.xyz: BackgroundTaskSuspended (most elevated: BackgroundTaskSuspended)
default 15:56:03.716198 +0800 symptomsd Entry, display name com.xyz uuid 02184FD5-F48B-3EF7-B2B6-98AB05145DB9 pid 1447 isFront 0
Иногда возникает эта проблема.
Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory" UserInfo={NSErrorFailingURLKey`enter code here`
Код = 2 связан с ресурсами устройства.
Мой вопрос: можем ли мы загрузить и запросить дополнительные файлы в фоновом режиме после загрузки пакета.Или фоновый режим работает только по текущему запросу и приостанавливает работу приложения, но продолжает загружать файл, упомянутый в отправленной задаче, в пакетном режиме.
Вот код для задания BG,
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {
backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[[NSBundle mainBundle] bundleIdentifier]];
} else {
backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"downloadmanager"];
}
backgroundConfiguration.discretionary = YES;
backgroundConfiguration.sessionSendsLaunchEvents = YES;
self.backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:self delegateQueue:NSOperationQueue.mainQueue];
Код длядобавьте NSURLRequest в BG Task,
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionDownloadTask *downloadTask;
downloadTask = [self.backgroundSession downloadTaskWithRequest:request];
Обработчик фоновой задачи в AppDelegate
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
DownloadManager.shared().backgroundTransferCompletionHandler = completionHandler
print("background task called")
}
После отправки приложения в BG прогресс делегата прекратит печать журнала через некоторое время в консоли.И я вижу, что он частично загрузил файл.
- (void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
NSLog(@"Byte downlaoded %lld of %lld ", bytesWritten, totalBytesWritten);
}