web-dev-qa-db-ja.com

NSURLConnectionはiOS9で非推奨

NSURLRequestを含むファイルをダウンロードして保存したいが、

NSData * data = ...でエラーが発生します。

NSURL *Urlstring = [NSURL URLWithString:@"http://yourdomain.com/yourfile.pdf"];
NSURLRequest *request = [NSURLRequest requestWithURL: Urlstring];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
documentsURL = [documentsURL URLByAppendingPathComponent:@"localFile.pdf"];

[data writeToURL:documentsURL atomically:YES];

警告メッセージは、NSURLSession dataTaskwithrequest "を使用する必要があるということです。なぜなら、sendSynchronousRequestはiOS 9で非推奨になったからです。しかし、それは機能しません。

19
Maximilian

次に、NSURLSessionを使用する必要があります

例(GET):

-(void)placeGetRequest:(NSString *)action withHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))ourBlock {

    NSString *urlString = [NSString stringWithFormat:@"%@/%@", URL_API, action];


    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:ourBlock] resume];
}

次に、アクション(または必要に応じて完全なURL)と、API呼び出しが戻るときに実行されるブロックを使用して、そのメソッドを呼び出す必要があります。

[self placeGetRequest:@"action" withHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // your code
}];

そのブロック内で、応答データを含むNSDataとHTTP応答を含むNSURLResponseを受け取ります。だから今、あなたはあなたのコードをそこに置くことができます:

NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
documentsURL = [documentsURL URLByAppendingPathComponent:@"localFile.pdf"];

[data writeToURL:documentsURL atomically:YES];

NSURLSessionとNSURLConnectionの主な違い

  • NSURLConnection:NSURLConnectionとのオープン接続があり、システムがアプリを中断した場合、アプリがバックグラウンドモードになると、受信または送信したものはすべて失われます。 Process diagram for NSURLConnection

  • NSURLSession:この問題を解決し、アウトプロセスのダウンロードも提供します。アクセス権がない場合でも、接続プロセスを管理します。 AppDelegateでapplication:handleEventsForBackgroundURLSession:completionHandlerを使用する必要があります Process diagram for NSURLSession

NSURLSessionを使用すると、OSがインターネット接続を管理するため、インターネット接続を管理または確認する必要はありません。

34
EnriMR