1

私は自分のプロジェクトで Afnetworking を使用しており、バックグラウンドで 100mb または 150mb 程度の大きなファイルをダウンロードしたいのですが、Apple のドキュメントでは、バックグラウンド タスクが最大 10 分続くと述べているため、この問題をどのように解決すればよいですか?

インターネットで検索し、アイドルタイマーを無効にするか、ファイルに応じてタイマーを設定しますか?(ただし、ファイルサイズに応じてアイドルタイマーを設定するにはどうすればよいですか?また、インターネット接続にも依存します)。

一部の SO ポスト マット ポストでは、この回答を投稿しますが、彼がこのafnetworking バックグラウンド回答のアイドル タイマーを無効にするかどうかはわかりません

(void)applicationWillResignActive:(UIApplication *)application {
__block UIBackgroundTaskIdentifier backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^(void) {
    [application endBackgroundTask:backgroundTaskIdentifier];
    [[YourRestClient sharedClient] cancelAllHTTPOperations];
}];

これは私の afnetworking コードです

        NSURL *url = [NSURL URLWithString:downloadMainURL];

        AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
        [httpClient.operationQueue setMaxConcurrentOperationCount:1];


        NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:downloadPostUrl parameters:postRequest];

        AFDownloadRequestOperation *operation = [[AFDownloadRequestOperation alloc] initWithRequest:request targetPath:destPath shouldResume:YES];


        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
            if(operation.response.statusCode == 200) {

                 NSLog(@"enable ipad sleep");
                [[UIApplication sharedApplication] setIdleTimerDisabled:NO];// enable the idle screen timmer
                 [loadingHUD hide:TRUE];
              //   NSLog(@"responseString is %@",[operation responseString]);
                              }
            else{
                NSLog(@"setCompletionBlockWithSuccess");
                [[UIApplication sharedApplication] setIdleTimerDisabled:NO];// enable the idle screen timmer
                [loadingHUD hide:TRUE];
            }

        }failure:^(AFHTTPRequestOperation *operation, NSError *error) {

            if(operation.response.statusCode!= 200) {

                [[UIApplication sharedApplication] setIdleTimerDisabled:NO];// enable the idle screen timmer
                [loadingHUD hide:TRUE];
                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Attention" message:@"download failed" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
                [alertView show];
            }
        }];

        [httpClient enqueueHTTPRequestOperation:operation];

        [operation setDownloadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite)
         {

             int filesize = [[NSUserDefaults standardUserDefaults] integerForKey:@"filesize"];
             int totalbytes=filesize+bytesWritten;


             NSLog(@"productidFileSize value is %f",productidFileSize);
             NSLog(@"totalBytesWritten value is %d",totalbytes);

             progress = ((float)totalbytes )/ productidFileSize;
             NSLog(@"progress value is %f",progress);
             loadingHUD.progress = progress;
             [[NSUserDefaults standardUserDefaults] setInteger:totalbytes forKey:@"filesize"];
                }];

    }


}
4

2 に答える 2

0

iOS7 以降で利用可能なバックグラウンド転送サービスを確認してください: http://code.tutsplus.com/tutorials/ios-7-sdk-background-transfer-service--mobile-20595

于 2014-03-11T23:59:50.857 に答える
0

「iOSにその10mの制限を延長させる」方法はありません。

2つのオプションがあると思います:

  • まず、「再開」パラメーターをいじってみて、許可された時間内にできるだけ多くをダウンロードしてから、タイマーが切れると、以前のダウンロードから再開する新しいバックグラウンド ダウンロードをトリガーします。どれくらいの時間が許されるか分からないことに注意してください。10 分でも 1 分でもかまいません。それ以上の保証はありません。
  • 次に、iOS7 には「フェッチ」と呼ばれる新しい「バックグラウンド モード」があります。ただし、繰り返しになりますが、大きなダウンロードよりも「小さくて妥当な」ダウンロードが優先されます。したがって、ダウンロードすればするほど、ペナルティが高くなります。

それ以外は、ローダーを使用して UI で実行し、ユーザーにダウンロードを裸にするように依頼する必要があります。

于 2013-11-23T09:04:01.343 に答える