本页介绍了以下步骤如何快速创建向 YouTube Data API 发出请求的简单 iOS 应用。此示例展示了如何检索有关 GoogleDevelopers YouTube 频道的数据。上述代码还包含一些注释,介绍了如何修改查询以检索关于当前用户的 YouTube 频道的数据。
前提条件
如需运行本快速入门,您需要:
第 1 步:启用 YouTube Data API
-
您可以使用此向导在 Google Developers Console 中创建或选择项目,并自动启用 API。点击继续,然后点击转到凭据。
-
在创建凭据页面上,点击取消按钮。
-
在页面顶部,选择 OAuth 同意屏幕标签页。选择一个 Email address(电子邮件地址),输入产品名称(如果尚未设置),然后点击 Save(保存)按钮。
-
选择凭据标签页,点击创建凭据按钮,然后选择 OAuth 客户端 ID。
- 选择应用类型 iOS,输入名称“YouTube Data API 快速入门”,捆绑包 ID 为
com.example.QuickstartApp
,然后点击创建按钮。
第 2 步:准备工作区
- 打开 Xcode 并创建一个新项目:
- 依次点击 File > New > Project,依次选择 iOS > Application > Single View Application 模板,然后点击 Next。
- 将产品名称设置为“快速入门”,将组织标识符设置为“com.example”,并将语言设置为Objective-C。在组织标识符下方,您应该会看到生成的软件包标识符,与您在第 1.b 步中输入的 iOS 软件包 ID (
com.example.QuickstartApp
) 匹配。 - 点击下一步。
- 为项目选择一个目标目录,然后点击 Create。
- 依次点击 File > Close Project 以关闭项目。
- 打开终端窗口,然后转到您刚刚创建的
QuickstartApp.xcodeproj
文件所在的目录。 运行以下命令以创建 Podfile,安装该库,然后打开生成的 XCode 项目:
cat << EOF > Podfile && platform :ios, '8.0' target 'QuickstartApp' do pod 'GoogleAPIClientForREST/YouTube', '~> 1.2.1' pod 'Google/SignIn', '~> 3.0.3' end EOF pod install && open QuickstartApp.xcworkspace
在 XCode Project Navigator 中,选择项目节点“quickstartApp”。然后,依次点击菜单项 File > Add files to "quickstartApp"。
找到之前下载的
GoogleService-Info.plist
文件并将其选中。 点击选项按钮。在选项窗口中进行以下选择,然后点击添加按钮:
- 选中 Copy items if needed 复选框。
- 选中添加到目标部分中列出的所有目标。
在仍选择项目节点的情况下,在 TARGETS 部分中选择“quickstartApp”,如以下两个图片中所示:
点击此屏幕截图中显示的区域:
然后选择正确的目标:
选择信息标签页,然后展开网址类型部分。
点击 + 按钮,并为您的倒序客户端 ID 添加一个网址方案。如需查找此值,请打开您在步骤 2.f 中选择的
GoogleService-Info.plist
配置文件。查找 REVERSED_CLIENT_ID 键。复制该键的值,并将其粘贴到配置页面上的网址方案框中。将其他字段留空。重新构建项目:
- 依次点击 Product > Clean Build Folder(同时按住 option 键)。
- 依次点击 Product > Build。
第 3 步:设置示例
将以下文件的内容替换为提供的代码:#import <UIKit/UIKit.h> @import GoogleSignIn; @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @end
#import "AppDelegate.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Initialize Google sign-in. [GIDSignIn sharedInstance].clientID = @"<YOUR_CLIENT_ID>"; return YES; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[GIDSignIn sharedInstance] handleURL:url sourceApplication:sourceApplication annotation:annotation]; } @end
#import <UIKit/UIKit.h> @import GoogleSignIn; #import <GTLRYouTube.h> @interface ViewController : UIViewController <GIDSignInDelegate, GIDSignInUIDelegate> @property (nonatomic, strong) IBOutlet GIDSignInButton *signInButton; @property (nonatomic, strong) UITextView *output; @property (nonatomic, strong) GTLRYouTubeService *service; @end
#import "ViewController.h" @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Configure Google Sign-in. GIDSignIn* signIn = [GIDSignIn sharedInstance]; signIn.delegate = self; signIn.uiDelegate = self; signIn.scopes = [NSArray arrayWithObjects:kGTLRAuthScopeYouTubeReadonly, nil]; [signIn signInSilently]; // Add the sign-in button. self.signInButton = [[GIDSignInButton alloc] init]; [self.view addSubview:self.signInButton]; // Create a UITextView to display output. self.output = [[UITextView alloc] initWithFrame:self.view.bounds]; self.output.editable = false; self.output.contentInset = UIEdgeInsetsMake(20.0, 0.0, 20.0, 0.0); self.output.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; self.output.hidden = true; [self.view addSubview:self.output]; // Initialize the service object. self.service = [[GTLRYouTubeService alloc] init]; } - (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error { if (error != nil) { [self showAlert:@"Authentication Error" message:error.localizedDescription]; self.service.authorizer = nil; } else { self.signInButton.hidden = true; self.output.hidden = false; self.service.authorizer = user.authentication.fetcherAuthorizer; [self fetchChannelResource]; } } // Construct a query and retrieve the channel resource for the GoogleDevelopers // YouTube channel. Display the channel title, description, and view count. - (void)fetchChannelResource { GTLRYouTubeQuery_ChannelsList *query = [GTLRYouTubeQuery_ChannelsList queryWithPart:@"snippet,statistics"]; query.identifier = @"UC_x5XG1OV2P6uZZ5FSM9Ttw"; // To retrieve data for the current user's channel, comment out the previous // line (query.identifier ...) and uncomment the next line (query.mine ...). // query.mine = true; [self.service executeQuery:query delegate:self didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)]; } // Process the response and display output - (void)displayResultWithTicket:(GTLRServiceTicket *)ticket finishedWithObject:(GTLRYouTube_ChannelListResponse *)channels error:(NSError *)error { if (error == nil) { NSMutableString *output = [[NSMutableString alloc] init]; if (channels.items.count > 0) { [output appendString:@"Channel information:\n"]; for (GTLRYouTube_Channel *channel in channels) { NSString *title = channel.snippet.title; NSString *description = channel.snippet.description; NSNumber *viewCount = channel.statistics.viewCount; [output appendFormat:@"Title: %@\nDescription: %@\nViewCount: %@\n", title, description, viewCount]; } } else { [output appendString:@"Channel not found."]; } self.output.text = output; } else { [self showAlert:@"Error" message:error.localizedDescription]; } } // Helper for showing an alert - (void)showAlert:(NSString *)title message:(NSString *)message { UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { [alert dismissViewControllerAnimated:YES completion:nil]; }]; [alert addAction:ok]; [self presentViewController:alert animated:YES completion:nil]; } @end
第 4 步:运行示例代码
依次点击 Product > Scheme > 快速入门 App,切换到 quickstartApp 方案,然后使用设备模拟器或已配置的设备运行示例 (Cmd+R)。首次运行示例时,它会提示您登录 Google 帐号并授予访问权限。
备注
- 授权信息存储在您的密钥链中,因此后续执行不会提示用户授权。