上传Google云端存储iOS

我正在尝试将图片上传到Google云端存储几天。 我试图从https://code.google.com/p/google-api-objectivec-client/wiki/Introduction链接中使用Objective-C的Google API客户端库。

这是我的代码实现:

_serviceStorage = [GTLServiceStorage new]; _serviceStorage.APIKey = API_KEY; _serviceStorage.additionalHTTPHeaders = @{@"x-goog-project-id": PROJECT_ID}; GTLUploadParameters *uploadParam = [GTLUploadParameters uploadParametersWithData:_imageData MIMEType:@"image/jpeg"]; GTLStorageObject *storageObj = [GTLStorageObject object]; GTLQueryStorage *query = [GTLQueryStorage queryForObjectsInsertWithObject:storageObj bucket:BUCKET_NAME uploadParameters:uploadParam]; GTLServiceTicket *ticket = [_serviceStorage executeQuery:query delegate:self didFinishSelector:@selector(serviceTicket:finishedWithObject:error:)]; ticket.uploadProgressBlock = ^(GTLServiceTicket *ticket, unsigned long long numberOfBytesRead, unsigned long long dataLength) { self.progressView.progress = (float)numberOfBytesRead/(float)dataLength; }; 

使用该代码,错误总是出现“无法完成操作(访问未configuration,请使用Google Developers Console为您的项目激活API)” 。 我不知道为什么会出现错误,而我启用了与Google云端存储和Google云端存储JSON API等存储相关的所有服务,并更改存储桶的ACL,以便互联网上的所有用户都可以写入/上传。

上传前我也尝试过authentication过程。 viewDidLoad上的代码:

 _serviceStorage = [GTLServiceStorage new]; _serviceStorage.additionalHTTPHeaders = @{@"x-goog-project-id": PROJECT_ID}; GTMOAuth2ViewControllerTouch *oAuthVC = [[GTMOAuth2ViewControllerTouch alloc] initWithScope:kScope clientID:kClientID clientSecret:kClientSecret keychainItemName:kKeychainItemName completionHandler:^(GTMOAuth2ViewControllerTouch *viewController, GTMOAuth2Authentication *auth, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ [self dismissViewControllerAnimated:YES completion:nil]; }); auth.authorizationTokenKey = @"access_token"; _serviceStorage.authorizer = auth; }]; dispatch_async(dispatch_get_main_queue(), ^{ [self presentViewController:oAuthVC animated:YES completion:nil]; }); 

当用户按上传button时:

 GTLUploadParameters *uploadParam = [GTLUploadParameters uploadParametersWithData:_imageData MIMEType:@"image/jpeg"]; GTLStorageObject *storageObj = [GTLStorageObject object]; GTLQueryStorage *query = [GTLQueryStorage queryForObjectsInsertWithObject:storageObj bucket:BUCKET_NAME uploadParameters:uploadParam]; GTLServiceTicket *ticket = [_serviceStorage executeQuery:query delegate:self didFinishSelector:@selector(serviceTicket:finishedWithObject:error:)]; ticket.uploadProgressBlock = ^(GTLServiceTicket *ticket, unsigned long long numberOfBytesRead, unsigned long long dataLength) { self.progressView.progress = (float)numberOfBytesRead/(float)dataLength; }; 

通过这个实现,我得到了不同的错误: “操作无法完成(权限不足)”

我应该怎么做才能成功上传图片? 任何帮助将不胜感激。

非常感谢你。

最后我find了答案。 这是validation的代码:

 GTMOAuth2ViewControllerTouch *oAuthVC = [[GTMOAuth2ViewControllerTouch alloc] initWithScope:kGTLAuthScopeStorageDevstorageReadWrite clientID:kClientID clientSecret:kClientSecret keychainItemName:kKeychainItemName completionHandler:^(GTMOAuth2ViewControllerTouch *viewController, GTMOAuth2Authentication *auth, NSError *error) { _accessToken = [NSString stringWithFormat:@"Bearer %@", [auth.parameters objectForKey:@"access_token"]]; _serviceStorage.additionalHTTPHeaders = @{@"x-goog-project-id": PROJECT_ID, @"Content-Type": @"application/json-rpc", @"Accept": @"application/json-rpc", @"Authorization": _accessToken}; _serviceStorage.authorizer = auth; dispatch_async(dispatch_get_main_queue(), ^{ [self dismissViewControllerAnimated:YES completion:nil]; }); }]; 

这里是上传过程:

 GTLUploadParameters *uploadParam = [GTLUploadParameters uploadParametersWithData:_imageData MIMEType:@"image/jpeg"]; GTLStorageObject *storageObj = [GTLStorageObject object]; storageObj.name = FILE_NAME; GTLQueryStorage *query = [GTLQueryStorage queryForObjectsInsertWithObject:storageObj bucket:BUCKET_NAME uploadParameters:uploadParam]; GTLServiceTicket *ticket = [_serviceStorage executeQuery:query completionHandler:^(GTLServiceTicket *ticket, id object, NSError *error) { }]; ticket.uploadProgressBlock = ^(GTLServiceTicket *ticket, unsigned long long numberOfBytesRead, unsigned long long dataLength) { self.progressView.progress = (float)numberOfBytesRead/(float)dataLength; }; 

或者,如果您想要上传而不进行身份validation,则必须为服务器应用程序分配API密钥, 不是用于iOS应用程序的密钥

 _serviceStorage.APIKey = KEY_SERVER_APPLICATION; 

我不知道为什么上传过程成功使用密钥服务器应用程序,而这是一个iOS应用程序