一般的な質問があります。経験豊富な開発者がそれを読んだときに私を笑うかもしれませんが、どうにかしてそれを処理できませんでした。
基本的に、ファイルシステムから Amazon s3 バケットに画像をアップロードした後、これらの画像のリンクをサーバーにアップロードしたいと考えています。画像を s3 にアップロードした後、それらのリンクを取得して配列に保存しました。次に、それらのリンクをサーバーにアップロードします。しかし、アプリケーションの中断に対してアップロードをカバーするために、このプロセスをバックグラウンドで実行したいと考えています。スキーマは以下のとおりです。
画像を s3 にアップロード -> これらの画像の s3 リンクを取得 -> リンクをサーバーにアップロード
Amazonはバックグラウンドアップロードに使用することを推奨しているため、Amazon SDKのpresignedURLユーティリティを使用しようとしています。
iOS API ドキュメントには、NSURLSessionUploadTask が私がやろうとしていることを行うと書かれています。まず、presignedURL で s3 に画像をアップロードできませんでした (TransferManagerUploadRequest でアップロードできました)。第 2 に、このプロセスは、アプリケーションが中断された場合でも実行されている必要があります。しかし、実際にそれを行う方法がわかりません。「s3へのアップロード」コードを下に置きましたが、現在は機能していません。
複雑な質問で申し訳ありませんが、それは確かに今の私の心を示しています。
NSString *fileContentTypeStr = @"image/png";
AWSS3GetPreSignedURLRequest *urlRequest = [AWSS3GetPreSignedURLRequest new];
urlRequest.bucket = @"bounty-app";
urlRequest.key =[NSString stringWithFormat:@"submissions/photos/%@",nameOfImage];
urlRequest.HTTPMethod = AWSHTTPMethodPUT;
urlRequest.expires = [NSDate dateWithTimeIntervalSinceNow:3600];
urlRequest.contentType = fileContentTypeStr;
[[[AWSS3PreSignedURLBuilder defaultS3PreSignedURLBuilder] getPreSignedURL:urlRequest]
continueWithBlock:^id(BFTask *task) {
if (task.error) {
NSLog(@"Error: %@",task.error);
} else {
NSURL *presignedURL = task.result;
NSLog(@"upload presignedURL is: \n%@", presignedURL);
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:presignedURL];
request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
[request setHTTPMethod:@"PUT"];
[request setValue:fileContentTypeStr forHTTPHeaderField:@"Content-Type"];
NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"unique_name_of_tttask"];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromFile:savedPath];
[uploadTask resume];
}
return nil;
}];