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で非推奨になったからです。しかし、それは機能しません。
次に、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とのオープン接続があり、システムがアプリを中断した場合、アプリがバックグラウンドモードになると、受信または送信したものはすべて失われます。
NSURLSession:この問題を解決し、アウトプロセスのダウンロードも提供します。アクセス権がない場合でも、接続プロセスを管理します。 AppDelegateでapplication:handleEventsForBackgroundURLSession:completionHandler
を使用する必要があります
NSURLSessionを使用すると、OSがインターネット接続を管理するため、インターネット接続を管理または確認する必要はありません。