Upload và play file mp3 với Google Drive SDK
1. Enable Google Drive API Truy cập đến link này , sau đó tạo hoặc chọn 1 project có sẵn và click continue Ở trang Add credentials to your project , chọn Cancel . Ở trang Credential , chọn Tab OAuth consent screen , chọn Email address và Product name . Nhấn Save . Qua lại Tab ...
1. Enable Google Drive API
Truy cập đến link này , sau đó tạo hoặc chọn 1 project có sẵn và click continue
Ở trang Add credentials to your project, chọn Cancel.
Ở trang Credential, chọn Tab OAuth consent screen, chọn Email address và Product name. Nhấn Save.
Qua lại Tab Credentials, click Create credentials và chọn OAuth client ID.
Chọn iOS và tên, bundle ID và nhấn Create
Sau đó API sẽ cung cấp cho chúng ta 1 clientID dùng để truy cập sau này.
2. Install Google SDK và kết nối đến tài khoản Google
Trong bài hướng dẫn này, mình sẽ bỏ qua phần install Google SDK và tính năng đăng nhập đến tài khoản Google. Các bạn có thể tham khảo tại đây
3. Get danh sách nhạc
Đầu tiên, bạn cần kéo các file nhạc mp3 vào project
Khi đã thêm các bài nhạc vào project, khi project được build, các bài nhạc này sẽ có trong app của bạn trên device. Bạn cần gọi hàm để lấy chúng ra từ device local.
musicPaths = [NSMutableArray new]; NSString * resourcePath = [[NSBundle mainBundle] resourcePath]; NSError * error; NSArray * directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:resourcePath error:&error]; for (NSString *item in directoryContents){ if ([[item pathExtension] isEqualToString:@"mp3"]) { SongUploadObj *obj = [SongUploadObj new]; obj.filename = item; obj.path = [NSString stringWithFormat:@"%@/%@",resourcePath,item]; [musicPaths addObject:obj]; } }
Mỗi object được thêm vào list sẽ chứa tên và đường dẫn của mp3 file.
4. Upload mp3 file
GTLServiceDrive là cổng kết nối đến Google Drive khi bạn đã link đến tài khoản.
Your View Controller
#import "GTLDrive.h" @interface YourViewController () @property (nonatomic, strong) GTLServiceDrive *service; @end ... - (void)viewDidLoad { [super viewDidLoad]; self.service = [[GTLServiceDrive alloc] init]; self.service.authorizer = [GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:kKeychainItemName clientID:kClientID clientSecret:nil]; }
Các files trong Drive API được hiện thị bởi class GTLDriveFile bao gồm metadata và các thuộc tính file trên Drive. Nội dung của file phải được fetch về hoặc upload lên.
Để upload file, bạn cần chỉ định metadata cho GTLDriveFile và content cho GTLUploadParameters
NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:obj.path]; GTLUploadParameters *uploadParameters = [GTLUploadParameters uploadParametersWithFileHandle:file MIMEType:@"audio/"]; GTLDriveFile *metadata = [GTLDriveFile object]; metadata.name = obj.filename; GTLQueryDrive *query = [GTLQueryDrive queryForFilesCreateWithObject:metadata uploadParameters:uploadParameters]; GTLServiceTicket *ticket = [self.service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLDriveFile *updatedFile, NSError *error) { }];
Khi upload finish thì trả ra 1 block với GTLDriveFile nếu success hoặc 1 NSError nếu fail.
Khi excute 1 query sẽ tương ứng với 1 GTLServiceTicket được tạo ra. Dựa vào ticket này bạn có thể lấy được progress upload trong khi upload.
[ticket setUploadProgressBlock:^(GTLServiceTicket *ticket, unsigned long long totalBytesWritten, unsigned long long totalBytesExpectedToWrite) { NSLog(@"totalBytesWritten=%llu totalBytesExpectedToWrite=%llu", totalBytesWritten, totalBytesExpectedToWrite); }];
Chú ý:
- Để upload 1 file vào 1 folder, bạn cần tạo folder trước khi upload file.
- Các file trên Drive có thể trùng tên nhưng được phân biệt bởi identifier
5. Play mp3 file được upload
Sau khi upload succes sẽ trả về 1 file upload. Từ file này ta đã có thể play stream. Lưu ý bạn cần phải truyền vào identifier của file và accessToken khi kết nối đến API.
GTMOAuth2Authentication *author = self.service.authorizer; NSString *strURL = [NSString stringWithFormat:@"https://www.googleapis.com/drive/v3/files/%@?alt=media&access_token=%@",data.identifier, author.accessToken]; MPMoviePlayerViewController* vc = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:strURL]]; vc.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming; vc.moviePlayer.shouldAutoplay = YES; [self presentMoviePlayerViewControllerAnimated:vc]; [vc.moviePlayer play];