10

AFURLSessionManager を使用しており、マネージャーをシングルトン インスタンスとして設定しています。

- (AFURLSessionManager *)backgroundSession
{
    static AFURLSessionManager *backgroundSession = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.testBackground.BackgroundDownload.BackgroundSession1234"];
    backgroundSession = [[AFURLSessionManager alloc]initWithSessionConfiguration:config];
    [backgroundSession setDownloadTaskDidWriteDataBlock:^(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite){
        NSLog(@"i am downloading my id = %d progress= %f",downloadTask.taskIdentifier, totalBytesWritten*1.0/totalBytesExpectedToWrite);
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    }];
    [backgroundSession setDownloadTaskDidFinishDownloadingBlock:^NSURL *(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location){
        NSLog(@"download finished");
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        return location;

    }];
    });
    return backgroundSession;
}
//assign a download task
NSURLSessionDownloadTask *task = [manager1 downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        return targetPath;
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog("%download success");
}];
[task resume];

アプリをバックグラウンドに切り替えると、ダウンロード タスクが実行されているのに、完了するとシステム コール handleEventsForBackgroundURLSession が呼び出されないことがわかりました。どんなアイデアでも役に立ちます、どうもありがとう。

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler;
4

2 に答える 2

6

おそらくすでにこれを理解していると思いますが、とにかく、バックグラウンド転送サービス API (AFNetworking なし) を操作するテスト コードを書いているときに、まったく同じことが起こりました。解決策は、バックグラウンド セッション構成の識別子文字列を変更するだけでした。どういうわけか、私が使用していたものにバグがあり、システムが handleEventsForBackgroundURLSession コールバックをトリガーしませんでした。デバイスを再起動しても修正されません...ただし、識別子を変更するだけで修正されます。

私の理論は、私のコードが同じ構成で NSURLSession の複数のインスタンスを作成したというもので、Apple はこれに対して明確にアドバイスしています (ドキュメントでは、そうすると未定義の動作になると書かれています)。私はビュー コントローラの viewDidLoad メソッドで、dispatch_once ブロックなしで NSURLSessionConfiguration を取得していたので、それが起こったのは確かにもっともらしいです。

于 2013-12-11T15:58:34.563 に答える