Tôi đã bật Chế độ nền với nhiệm vụ thông báo từ xa để tải xuống tệp nhỏ (100kb) ở chế độ nền khi ứng dụng nhận được thông báo đẩy. Tôi đã cấu hình các phiên tải về sử dụngWeird NSURLSessionDownloadTask hành vi trên di động (không wifi)
NSURLSessionConfiguration *backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier];
[backgroundConfiguration setAllowsCellularAccess:YES];
self.backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration
delegate:self
delegateQueue:[NSOperationQueue mainQueue]];
và kích hoạt nó bằng cách sử
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[hostComponents URL]];
[request setAllowsCellularAccess:YES];
NSMutableData *bodyMutableData = [NSMutableData data];
[bodyMutableData appendData:[params dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[bodyMutableData copy]];
_downloadTask = [self.backgroundSession downloadTaskWithRequest:request];
[self.downloadTask resume];
Bây giờ mọi thứ hoạt động một cách chính xác chỉ khi tôi đang kết nối thông qua Wifi hoặc qua mạng không dây nhưng với iPhone được kết nối bằng cáp để xCode, nếu tôi ngắt kết nối iPhone và nhận được thông báo đẩy qua di động, mã dừng tại số [self.downloadTask resume];
mà không cần gọi URL.
Các lớp xử lý các hoạt động là một NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, NSURLSessionTaskDelegate và do đó cụ:
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
Tôi đã cố gắng để chèn một dòng debug với một UILocalNotification
(đã trình bày 'bây giờ') sau khi [self.downloadTask resume]
nhưng được gọi sau 5 phút và cho biết rằng self.downloadTask.state
bị 'tạm ngưng'
Hành vi lạ lùng này là gì?
Tôi đang trải qua hành vi tương tự chính xác này trên mạng với IOS 7.0 ATT. Vì không xảy ra khi kết nối với Xcode, tôi lưu nhật ký trên điện thoại để xem khi nào tôi khởi động lại ứng dụng. Tìm thấy rằng NSURLSessionDownloadTasks vẫn còn với State = NSURLSessionTaskStateRunning nhưng hành động như chúng bị đình chỉ. Nếu kết nối với wifi trong khi ứng dụng vẫn ở chế độ nền, những tải xuống bị ngừng hoạt động này hoàn tất thành công. Nếu tôi đưa ứng dụng vào nền trước, chúng vẫn bị trì hoãn. –
Từ câu trả lời của Sani Elfshishawy bên dưới "khi được cắm vào nguồn và trên Wi-Fi" Có vẻ như với tôi rằng việc cắm vào XCODE sẽ thay đổi cắm vào điều kiện nguồn. –
Tôi cũng nhấn cùng một trường hợp. Tôi đang kết hợp iBeacon với tác vụ nền NSURLSession nền để thực hiện một số kiểm tra khi người dùng gần đèn hiệu. Và tôi thấy rằng nhiệm vụ tải xuống không khả dụng khi người dùng sử dụng mạng di động. Các bạn có một số gợi ý không? –