2

내 iOS 앱은 내가 오디오 파일 이름의 배열을 가지고 다음과 같은 방법NSURLSessionDataTask는 아이폰 OS 백그라운드에서 같은 NSURLSession에 NSURLSessionDownloadTask 후 호출되지

  1. 에서 작동, 나는 파일이 존재하는지 여부를 확인합니다. 그것이 있으면 그것은 그것을 연주하기 시작합니다. 끝나면 다음 오디오 재생을 시작합니다.

  2. 파일이없는 경우

    나는 나에게 다운로드 할 파일의 URL 인 문자열을 반환하는 NSURLSessionDataTaskPOST 요청을합니다. (이 URL 1 분 동안 유효).

  3. 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가 다운로드의 책임을 수행하므로 이상적으로 작동해야합니다. 내가 놓친 게 있니?

답변

1

이 문제는 앱이 백그라운드에있는 동안 iOS에서 새 작업을 시작할 수 없기 때문에 발생합니다. 나는 이것이 새로운 애플 리케이션을 지속적으로 발사하고 앱을 무기한으로 유지하지 못하도록하기 위해 이루어 졌다고 믿는다.

백그라운드 작업은 일반적으로 작업이 진행되는 동안 전경에서 배경으로 전환하는 앱을 정상적으로 처리하는 데 적합합니다. 첫 번째 작업이 완료되었지만 두 번째 작업은 완료되지 않은 이유입니다.

한 가지 해결 방법은 초기 데이터 작업을 해고 할 때 OS에서 배경 실행 시간을 요청하는 것입니다 적어도 당신의 응용 프로그램을 제공해야합니다

UIBackgroundTaskIdentifier backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 

}]; 

배경 시간의 몇 분 두 번째 작업을 시작하기를 . 두 번째 작업에서 -resume으로 전화 한 후에는 -endBackgroundTask:으로 전화하십시오.

아쉽게도 모든 파일을 다운로드 할 수 있다고 보장 할 수 없습니다. 배경 시간이 부족한 경우 Silent Push Notifications을 사용하여 앱을 깨우고 주기적으로 다운로드하는 것이 더 나을 수 있습니다.

+0

일단 사무실에 도착하면 확인해 보겠습니다. –