iOS:Google登录及Drive/Youtube集成(二)

About Drive

Drive是谷歌提供的云端硬盘存储服务, 免费用户15GB容量,升级的话价格也很便宜。
更多资讯: Drive

关于项目中的需求:
由于面向比较多的国外用户,App连接Drive后就可以直接对个人Drive进行操作:浏览,下载,删除等等。拿到文件后,我们还可以脱离Drive对文件进行一些App级别的操作。

Google在Objective-C端的SDK其实就是对Restful API的一层封装。

我以为的难度所在

其实一开始项目中就有Google的模块已经正常使用了,但都是上古时期的SDK了(还有MRC的东西)。当时用的也不是Pod直接依赖,而是将一个个模块的文件(Drive、Youtube)放在一起做一个xcodeProject编成静态库使用的。所以当谷歌更新了SSO的方式,并且老的不能用之后,我们才发现这样的方式做起替换实在是太头疼了:
1、登录方式改变意味着后续服务集成时候的登录鉴权都要更改
2、新的登录方式采用了新的类GTMSessionFetcher,和老的GTMHttpFetcher类放在一起很冗余(两者还有共同引用的文件)。
3、老的服务模块代码都是基于GTMSessionFetcher。

后续的解决就是手动替换相应文件,但是还是保留了老的模块文件,期间发生了很多link错误。
为什么不整个删除用新的的原因大概就是: 虽然不知道什么用,但是我不敢删
整个经历下来也给我造成了一种谷歌对Objective-C很不友好,只有Github上几个demo而已的错觉。
事后再回头看Github的wiki和开发者中心,才发现也是有细分的很好的pod库存在的...
感觉自己白忙活了

无痛集成!

pod 'GoogleAPIClientForREST/Drive'

查看文件列表

#import <GTLRService.h> #import <GTLRDrive.h> static NSString *const kFileCellReuseIdentifier = @"kFileCellReuseIdentifier"; @interface FHGoogleDriveViewController ()<UITableViewDelegate,UITableViewDataSource> @property (nonatomic, strong) UITableView *tableView; @property (nonatomic, strong) GTLRDriveService *service; @property (nonatomic, strong) NSArray<GTLRDrive_File *> *fileList; @implementation FHGoogleDriveViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; self.title = @"Files"; [self setupTableView]; [self fetchDriveFiles]; - (void)fetchDriveFiles { //初始化谷歌的关键服务类 self.service = [[GTLRDriveService alloc] init]; //鉴权,需要谷歌授权过。 self.service.authorizer = [[[[FHGoogleLoginManager sharedInstance] currentUser] authentication] fetcherAuthorizer]; //初始化一个Drive列表请求 GTLRDriveQuery_FilesList *query = [GTLRDriveQuery_FilesList query]; //设置需要返回的文件属性 query.fields = @"kind,nextPageToken,files(mimeType,id,kind,name,webViewLink,thumbnailLink,trashed,modifiedTime,size,originalFilename)"; //发起请求 [self.service executeQuery:query completionHandler:^(GTLRServiceTicket *callbackTicket, GTLRDrive_FileList *fileList, NSError *callbackError) { if (callbackError == nil) self.fileList = fileList.files; [self.tableView reloadData]; //Handle error