Objective c 使用GoogleDrive API:GTLRDriveQuery_fileUpdate更新文件内容,出现403错误

Objective c 使用GoogleDrive API:GTLRDriveQuery_fileUpdate更新文件内容,出现403错误,objective-c,macos,google-drive-api,Objective C,Macos,Google Drive Api,我不知道如何确切地使用这个API来更新文件内容,因为我并没有从Document和DriveSample应用程序中获得详细信息。因此,我试着这样写: GTLRUploadParameters *uploadParameters = [GTLRUploadParameters uploadParametersWithData:data MIMEType:@"binary/octet-str

我不知道如何确切地使用这个API来更新文件内容,因为我并没有从Document和DriveSample应用程序中获得详细信息。因此,我试着这样写:

GTLRUploadParameters *uploadParameters = [GTLRUploadParameters
                    uploadParametersWithData:data
                                    MIMEType:@"binary/octet-stream"];
GTLRDriveQuery_FilesUpdate *query = [GTLRDriveQuery_FilesUpdate
                                 queryWithObject:cloudPreference
                                          fileId:cloudPreference.identifier
                                uploadParameters:uploadParameters];

[self.driveService executeQuery:query
              completionHandler:^(GTLRServiceTicket *callbackTicket,
                                  GTLRDrive_File *uploadedFile,
                                  NSError *callbackError) {
                  if (callbackError == nil) {
                      NSLog(@"Updating file is finished!");
                  }
                  else {
                      NSLog(@"Failed to update file: %@", callbackError);
                  }
              }];
错误是: 更新文件失败:驱动器API中的错误Domain=com.google.HTTPStatus Code=403“(null)”UserInfo={data=,可能是由ff引起的:

  • 403:超出每日限额
  • 403:超出用户速率限制
  • 403:超出费率限制 -403:用户尚未授予应用程序{appId}{verb}对文件{fileId}的访问权限
  • 403:用户没有足够的权限访问文件{fileId} -403:id为{appId}的应用无法在经过身份验证的用户的域中使用
尝试使用文档中关于的代码实现

创建新文件

GTLServiceDrive *driveService = ...;
NSString *name = @"hello.txt";
NSString *content = @"Hello world";
NSString *mimeType = @"text/plain";

GTLDriveFile *metadata = [GTLDriveFile object];
metadata.name = name;

NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
GTLUploadParameters *uploadParameters = [GTLUploadParameters uploadParametersWithData:data MIMEType:mimeType];
GTLQueryDrive *query = [GTLQueryDrive queryForFilesInsertWithObject:metadata
                                                   uploadParameters:uploadParameters];
[driveService executeQuery:query completionHandler:^(GTLServiceTicket *ticket,
                                                     GTLDriveFile *updatedFile,
                                                     NSError *error) {
  if (error == nil) {
    NSLog(@"File %@", updatedFile);
  } else {
    NSLog(@"An error occurred: %@", error);
  }
}];
要更新现有文件,请执行与创建新文件相同的过程,但请改用queryForFilesUpdatesWithObject方法:

GTLQueryDrive *query = [GTLQueryDrive queryForFilesUpdateWithObject:file
                                                             fileId:file.identifier
                                                   uploadParameters:uploadParameters];

问题是关于新的RESTAPI(GTLR),“eschao”是指旧的(过时的)api


我遇到了完全相同的问题,但我通过创建一个新的虚拟GTLR_文件变量并将其用作查询的第一个参数来修复了它。

非常感谢!我将尝试看看是否可以使用它作为我的预期。如果我只想重命名pdf文件的名称,我该怎么做?那么如何获取数据?这将是属性中的“名称”。只是为了解决方案很清楚;在以前版本的GTL库中,我们应该传递现有的GTLDriveFile对象作为查询创建方法的第一个参数来更新现有文件,但在新的GTLR库中,我们必须创建一个新的空GTLRDrive_file对象,并将其作为第一个参数传递。在@eschao的代码中,替换
使用
[GTLRDrive\u文件对象]
的cloudPreference应该可以工作。