画像を Parse にアップロードし、それを共有拡張機能の PFObject に関連付けようとしていますが、共有拡張機能の作成に関する制約があるため、これを適切に行う方法がわかりません。
これに対する私の最初の試みは、PFFile および PFObject クラスを使用して次のとおりです。
// Create the UserPhoto PFObject and associate with PFFile
PFObject *userPhoto = [PFObject objectWithClassName:@"UserPhoto"];
userPhoto[@"message"] = @"my photo";
NSData *imageData = UIImageJPEGRepresentation(image, 0.2);
PFFile *imageFile = [PFFile fileWithName:@"image.jpg" data:imageData];
userPhoto[@"imageFile"] = imageFile;
[userPhoto saveInBackground];
このアプローチの問題は、アプリ拡張機能が破棄されたときに saveInBackground が完了していない場合、アップロードが終了するため、アプリ拡張機能のドキュメントに従って NSURLSession を使用して接続を維持する必要があることです。
NSURLSession は Parse クラスと組み合わせて使用できないため、Parse REST API を使用して写真のアップロードを開始し、写真がアップロードされたら URL をオブジェクトに関連付ける必要があります。
写真のアップロード -> 写真の URL をオブジェクトに関連付ける
これにより、画像を Parse にアップロードするアップロード タスクが設定されます。
// [self backroundSession] just configures a session and returns it
NSURLSession *session = [self backgroundSession];
NSURL *url = [NSURL URLWithString:@"https://api.parse.com/1/files/pic.jpg"];
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:url];
[req addValue:@"12345" forHTTPHeaderField:@"X-Parse-Application-Id"];
[req addValue:@"12345" forHTTPHeaderField:@"X-Parse-REST-API-Key"];
[req addValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
[req setHTTPMethod:@"POST"];
// path is the location of the image to be uploaded
NSURLSessionUploadTask *myTask = [session uploadTaskWithRequest:req fromFile:[NSURL fileURLWithPath:path]];
[myTask resume];
写真のアップロードが完了したら、URL をオブジェクトに関連付ける必要があります。上記と同じように、UserPhoto というオブジェクトを作成しています。
- (void)URLSession:(NSURLSession *)mySession task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error {
// note: this bg session doesn't set delegate so we only create the UserPhoto object once
NSURLSession *session = [self backgroundSessionForUserPhoto];
NSURL *url = [NSURL URLWithString:@"https://api.parse.com/1/classes/UserPhoto"];
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:url];
[req addValue:@"12345" forHTTPHeaderField:@"X-Parse-Application-Id"];
[req addValue:@"12345" forHTTPHeaderField:@"X-Parse-REST-API-Key"];
[req addValue:[PFUser currentUser].sessionToken forHTTPHeaderField: @"X-Parse-Session-Token"];
[req addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[req setHTTPMethod:@"POST"];
NSDictionary *jsonDict = @{@"imageFile" : @{@"name" : response[@"url"], @"__type" : @"File"}, @"message" :@"my photo"};
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict
options:NSJSONWritingPrettyPrinted
error:&error];
if (!error) {
[req setHTTPBody:jsonData];
NSURLSessionTask *myTask = [session dataTaskWithRequest:req];
[myTask resume];
}
}
REST API 呼び出しの連鎖が機能する場合もあれば、画像がアップロードされない場合もありますが、画像の URL が UserPhoto に関連付けられていないため、拡張機能が破棄されると OS が別の NSURLSession のトリガーを禁止するのではないかと思います。
だからここに私の質問があります:
1) parse は、Parse REST API を使用する必要をなくす NSURLSession の抽象化を提供しますか?
さもないと
2) 両方の NSURLSession を安全にチェーンして、画像がアップロードされ、画像 URL が Parse オブジェクトに正常に関連付けられるようにするにはどうすればよいですか?