내 iOS 앱은 내가 오디오 파일 이름의 배열을 가지고 다음과 같은 방법NSURLSessionDataTask는 아이폰 OS 백그라운드에서 같은 NSURLSession에 NSURLSessionDownloadTask 후 호출되지
에서 작동, 나는 파일이 존재하는지 여부를 확인합니다. 그것이 있으면 그것은 그것을 연주하기 시작합니다. 끝나면 다음 오디오 재생을 시작합니다.
파일이없는 경우
나는 나에게 다운로드 할 파일의 URL 인 문자열을 반환하는NSURLSessionDataTask
POST 요청을합니다. (이 URL 1 분 동안 유효).URL을 수신하면
NSURLSessionDownloadTask
요청을하고 파일을 다운로드하고 파일을 저장하고 오디오를 재생합니다.
앱이 포 그라운드 인 경우이 전체 과정이 완벽하게 작동합니다. 또한 모든 오디오가 있고 앱이 백그라운드에서 실행 중일 때 완벽하게 작동합니다. 오디오 파일이 존재하지 않는 앱이 백그라운드에서 실행 중일 때
문제는 오는
내 코드 : BackgroundFetchManager.h
@interface BackgroundFetchManager : NSObject <NSURLSessionDownloadDelegate,NSURLSessionDataDelegate>
@property bool isDownloading;
@property NSURLSessionDownloadTask *download;
@property NSURLSessionDataTask *dataDownload;
@property (nonatomic, strong)NSURLSession *backgroundSession;
@property NSMutableArray *downloadQueue;
@property FileAccessManager *fileAccessManager;
@end
BackgroundFetchManager.m
초기화 기능
데이터 작업
dataDownload = [self.backgroundSession dataTaskWithRequest:request];
[dataDownload setTaskDescription:@"Data task"];
데이터 다운로드 다운로드 (NSURLSessionDataTask
)
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{
completionHandler(NSURLSessionResponseAllow);
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data
{
NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSString *url = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"This is the response received %@",url);
//download is the NSURLSessionDownloadTask
download = [self.backgroundSession downloadTaskWithURL:[NSURL URLWithString:url]];
[download resume];
}
대표의 대표(NSURLSessionDownloadTask
)
이 앱이있을 때 호출되지 않습니다 것입니다 배경
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
AppDelegate *a = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSURL *destinationURL = [fileAccessManager saveFile:a.downloadQueue[0] fromLocation:location]; // save file code
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
// audio playing stuff
if (![task.taskDescription isEqualToString:@"Data task"]) {
NSLog(@"This is did complete with error %@", task);
AppDelegate *a = (AppDelegate *)[[UIApplication sharedApplication] delegate];
if ([a.downloadQueue[0] isEqualToString:a.audioToBePlayed]) {
NSDictionary* userInfo = @{@"file": a.downloadQueue[0]};
[[NSNotificationCenter defaultCenter] postNotificationName:@"playThisStuff" object:nil userInfo:userInfo];
}
//starts next download
[a pop];
isDownloading = false;
if ([a.downloadQueue count] > 0) {
isDownloading = true;
[self downloadFile:a.downloadQueue[0]];
}
}
}
간단히 말해서 데이터 테스크가 완료된 후에 downloadtask가 호출되지 않습니다. 내가 알고있는 한, backgroundsession으로 구성된 경우 NSURLSession
일 때 OS가 다운로드의 책임을 수행하므로 이상적으로 작동해야합니다. 내가 놓친 게 있니?
일단 사무실에 도착하면 확인해 보겠습니다. –