面向 iOS 平台的 Play 游戏服务使用入门

欢迎使用 Google Play 游戏服务开发 iOS 游戏!

Play 游戏 SDK 提供了跨平台 Google Play 游戏服务,让您可以轻松地在针对平板电脑和手机而设计的游戏中集成热门的游戏功能,例如成就、排行榜和多人游戏。

本文档介绍了使用 Play 游戏 SDK 开发 iOS 游戏的基本步骤。请注意,本文的说明取代了 Google Sign-In for iOS 文档。

准备工作

要使用 Google 游戏 SDK 创建应用,需具备以下条件:

  • Xcode 6.0 或更高版本
  • 搭载 iOS 7.0 或更高版本的移动设备

第 1 步:了解示例游戏

示例游戏展示了如何在 iOS 上正确使用各种 Google Play 游戏服务功能,如果您尚未了解示例游戏,则应进行下载并查看,您可能会发现很有帮助。针对 iOS 平台的所有示例游戏都可以在示例下载页面上找到。请按照每个示例游戏的 README 文件内的说明,了解初始化和运行示例游戏的操作方法。

第 2 步:创建或打开 Xcode 项目

在 Xcode 中创建一个新项目,或打开现有项目。记下相应软件包标识符,因为下个步骤中会用到此值。通常该标识符的格式为 com.*your_company*.*your_project*

如果您要创建新项目,我们建议您选择单一视图应用选项,这样可以为您的游戏设置视图控制器。

第 3 步:将您的游戏添加到 Google Play 管理中心

在 Google Play 管理中心为您的游戏创建一个条目。此操作会为您的应用启用 Google Play 游戏服务,并创建 OAuth 2.0 客户端 ID(如果您尚无该 ID)。

  1. 按照设置 Google Play 游戏服务中所述的步骤为您的 iOS 游戏添加一个条目。
  2. 记下该游戏的 OAuth 2.0 客户端 ID;稍后会用到此 ID。
  3. (可选)按照配置成就和排行榜中所述的步骤将成就和排行榜添加到您的游戏。
  4. 按照发布您的游戏更改中所述的步骤为您团队中的其他成员添加帐号,以便测试您的游戏。

第 4 步:安装 SDK

在使用 Google Play 游戏服务 API 之前,您必须通过以下某种方法安装所需的库。

方法 1:使用 CocoaPods 安装

CocoaPods 是一个用于安装 Objective-C 库的依赖管理器。如果您已安装 CocoaPods,则可以按照以下步骤用它来安装 iOS 版 Play 游戏 SDK:

  1. 创建一个 Podfile,确保在其中指定的平台为 ios 7.0 或更高版本
  2. GooglePlayGames pod 添加到您的 Podfile 中。典型的 podfile 内容可能如下所示:

    platform :ios, '7.0'
    pod 'GooglePlayGames'
    // Other pods might go here
    
  3. 从命令行运行 pod install

  4. 打开为您的应用生成的 .xcworkspace 文件。

  5. 在 XCode 中打开您的项目,从下文中添加登录按钮和退出按钮部分所述的步骤继续操作。

方法 2:手动安装

要在不使用 CocoaPods 的情况下手动安装适用于 iOS 平台的 Play 游戏 SDK,请按照以下步骤进行操作:

  1. Google 登录下载页面下载并解压缩最新的 Google 登录 SDK。
  2. 将 Google 登录 SDK 中的以下内容复制到您的项目内:
    • GoogleSignIn.bundle
    • GoogleSignIn.framework
  3. Google+ 下载页面下载并解压缩最新的 Google+ iOS SDK。
  4. 将 Google+ SDK 中的以下内容复制到您的项目内:
    • GoogleOpenSource.framework
  5. 下载并解压缩适用于 iOS 平台的 Play 游戏 SDK。SDK 下载页面上提供了此 SDK 的最新版本。
  6. 将以下内容添加到您的 Xcode 项目中:
    • gpg.bundle
    • gpg.framework
  7. 打开您的项目设置,然后在 Build Phases 标签的 Link Binary With Libraries 部分,点击“+”图标并添加以下框架:
    • AddressBook.framework
    • AssetsLibrary.framework
    • CoreData.framework
    • CoreLocation.framework
    • CoreMotion.framework
    • CoreTelephony.framework
    • CoreText.framework
    • Foundation.framework
    • MediaPlayer.framework
    • QuartzCore.framework
    • SafariServices
    • Security.framework
    • StoreKit
    • Security.framework
    • SystemConfiguration.framework
    • libc++.dylib
    • libz.dylib
  8. 在应用目标的编译设置中添加 ObjC 链接器标志。在目标设置中,依次选择 Build Settings > Linking > Other Linker Flags,然后添加 -ObjC 标志。

    Other Linker Flags: -ObjC
    

第 5 步:添加登录按钮和退出按钮

在您的视图控制器中,添加一个登录按钮和一个退出按钮。确保您的登录按钮符合 Google 登录品牌推广指南。为了减少您的开发工作量,Google Play 游戏服务提供的很多内置界面已包含退出选项,因此您无需手动添加该按钮。

要添加登录按钮和退出按钮,请按照以下步骤进行操作:

  1. 按住 Control 键并将这两个按钮拖动到视图控制器的 .m 文件内的专用类别(@interface 所包含的部分)中。此操作会为这两个按钮创建 IBOutlet 对象。

    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIButton *signInButton;
    @property (weak, nonatomic) IBOutlet UIButton *signOutButton;
    @end
    
  2. 接下来,按住 Control 键并将这两个按钮拖动到视图控制器的 .m 文件内的 @implementation 部分。此操作会创建以下方法,用于处理玩家的按钮按下操作。

    - (IBAction)signInButtonWasPressed:(id)sender {
      // handle the sign-in button press
    }
    
    - (IBAction)signOutButtonWasPressed:(id)sender {
      // handle the sign-out button press
    }
    

第 6 步:导入 Play 游戏 SDK 并启用登录功能

  1. 导入 GooglePlayGames 头文件。提示:要执行此操作,最简单的方法是打开应用的 .pch 文件并添加如下一行代码:

    #import <gpg/GooglePlayGames.h>
    

    将此导入语句放入应用的预编译头文件内,您便无需在所有其他文件中导入此头文件。

  2. 在视图控制器的 .m 文件或单独的常量文件中,设置您的客户端 ID。该 ID 就是您之前在“将您的游戏添加到 Google Play 管理中心”部分中记录的字符串。

    static NSString * const kClientID = @"123456789012.apps.googleusercontent.com";
    
  3. 将以下代码添加到您之前在“添加登录按钮和退出按钮”部分创建的两个 buttonWasPressed 方法中。

    - (IBAction)signInButtonWasPressed:(id)sender {
      [[GPGManager sharedInstance] signInWithClientID:kClientID silently:NO];
    }
    
    - (IBAction)signOutButtonWasPressed:(id)sender {
      [[GPGManager sharedInstance] signOut];
    }
    
  4. 当玩家在您的游戏中登录 Google 服务时,相应登录流程会在网页视图中完成。

    1. 在目标设置 Info 标签中,向下滚动到 URL Types 部分,然后点击 + 图标以添加两个新的网址类型。在两个新的“Identifier”字段中指定两个唯一的字符串。对于第一个网址类型,请在“URL Schemas”字段中以倒序指定客户端 ID。对于第二个网址类型,请在“URL Schemas”字段中指定应用的软件包标识符。要详细了解如何输入此信息,请参阅 Google 登录快速迁移指南

      显示标识符和网址格式字段的图形。

    2. 在应用代理的 .m 文件中,导入 Google 登录框架。

      #import <GoogleSignIn/GoogleSignIn.h>
      
    3. 从应用代理的网址处理程序中调用 GIDSignIn 网址处理程序。此方法可处理您的应用在验证流程结束时收到的网址。

        [super application:application
            openURL:url
            sourceApplication:sourceApplication
            annotation:annotation];
      - (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
            sourceApplication:(NSString *)sourceApplication
            annotation:(id)annotation {
        return [[GIDSignIn sharedInstance] handleURL:url sourceApplication:sourceApplication annotation:annotation];
      }
      

现在,您可以对应用进行测试,能够执行登录流程和退出流程了。当测试人员在您的应用中登录时,他们将通过网页视图来完成登录流程。

[GIDSignIn sharedInstance].uiDelegate = self;

第 7 步:添加 GPGStatusDelegate

接下来,添加相应代码来让您的应用在登录流程完成时收到通知。

  1. viewDidLoad 专用类别中,将您的视图控制器声明为 GPGStatusDelegate

    @interface ViewController () <GPGStatusDelegate>
    
  2. 然后,向 GPGManager 声明此类将是其状态代理。您可以在整个应用的多个位置(例如在 AppDelegate 中)执行此操作。以下代码段展示了如何从 viewDidLoad 方法为初始视图控制器执行此操作:

    - (void)viewDidLoad {
      [super viewDidLoad];
      [GPGManager sharedInstance].statusDelegate = self;
    }
    
  3. 实现以下 GPGStatusDelegate 方法:didFinishGamesSignInWithError(用于在玩家完成登录流程时进行相应处理)和 didFinishGamesSignOutWithError(用于在玩家完成退出流程时进行相应处理)。

    - (void)didFinishGamesSignInWithError:(NSError *)error {
      if (error) {
          NSLog(@"Received an error while signing in %@", [error localizedDescription]);
      } else {
          NSLog(@"Signed in!");
      }
      [self refreshInterfaceBasedOnSignIn];
    }
    
    - (void)didFinishGamesSignOutWithError:(NSError *)error {
      if (error) {
          NSLog(@"Received an error while signing out %@", [error localizedDescription]);
      } else {
          NSLog(@"Signed out!");
      }
      [self refreshInterfaceBasedOnSignIn];
    }
    
  4. refreshInterfaceBasedOnSignIn 调用创建一个空方法。

    - (void)refreshInterfaceBasedOnSignIn {
      // We'll be filling this out shortly.
    }
    

    现在,当测试人员登录或退出时,他们应该会在控制台日志中看到系统报告了相应消息。

  5. 填写实现 refreshInterfaceBasedOnSignIn 方法所需的信息。使用 GPGManager 的 isSignedIn 属性确定要显示的按钮。

    - (void)refreshInterfaceBasedOnSignIn {
      BOOL signedInToGameServices = [GPGManager sharedInstance].isSignedIn;
      self.signInButton.hidden = signedInToGameServices;
      self.signOutButton.hidden = !signedInToGameServices;
    }
    

现在,当测试人员完成登录时,登录按钮会变为隐藏状态。当他们退出后,退出按钮会变为隐藏状态,而登录按钮应该会再次显示。

第 8 步:让回访玩家自动登录

您还可以让玩家自动登录,这样他们就不必每次启动您的游戏时都要进行登录。如果您在 signInWithClientID 方法中指定 silently:YESGPGManager 便会让玩家自动登录。当满足以下全部条件时,此调用便会成功:

  • 玩家过去曾对您的应用给予过授权;
  • 玩家尚未撤消对您的应用授予的访问权限;并且
  • 自玩家上次登录以来,应用并没有请求新的权限。

通过使用此行为,您可以在 viewDidLoad 方法的末尾添加 signInWithClientID:silently: 调用,并将 silently 设置为 YES,从而让玩家自动登录您的游戏。

[[GPGManager sharedInstance] signInWithClientID:kClientID silently:YES];

运行您的应用,您会发现,除非您在上次使用该应用时执行了退出操作,否则现在会自动登录。

第 9 步:添加一些界面优化元素

当应用开始让玩家自动登录时,从登录开始到完成期间存在一小段延迟。在这段时间内,您的游戏界面最好处于不可使用的状态。为此,不妨利用 signInWithClientID:silently 方法会在尝试让玩家自动登录时返回 YES 这一行为。

  1. 首先,向您的视图控制器类中添加一个实例变量,用以跟踪您是否以静默方式让玩家自动登录:

    @implementation ViewController {
        BOOL _silentlySigningIn;
    }
    
  2. 接下来,使用该变量记录从 signInWithClientID:silently: 方法返回的内容,然后立即调用 refreshInterfaceBasedOnSignIn

    - (void)viewDidLoad {
      [super viewDidLoad];
      [GPGManager sharedInstance].statusDelegate = self;
      _silentlySigningIn = [[GPGManager sharedInstance]
              signInWithClientID:kClientID silently:YES];
      [self refreshInterfaceBasedOnSignIn];
    }
    
  3. 然后,向 refreshInterfaceBasedOnSignIn 方法中添加以下两行代码,这样在玩家以静默方式自动登录时应用的登录按钮和退出按钮便会变为停用状态:

    self.signInButton.enabled = !_silentlySigningIn;
    self.signOutButton.enabled = !_silentlySigningIn;
    
  4. 最后,在调用两个 GPGEventDelegate 方法中的 refreshInterfaceBasedOnSignIn 之前,将 _silentlySigningIn 设为 NO

    - (void)didFinishGamesSignInWithError:(NSError *)error {
      // Other code goes here...
      _silentlySigningIn = NO;
      [self refreshInterfaceBasedOnSignIn];
    
    }
    
    - (void)didFinishGamesSignOutWithError:(NSError *)error {
      // Other code goes here...
      _silentlySigningIn = NO;
      [self refreshInterfaceBasedOnSignIn];
    }
    

现在,当测试人员启动您的应用时,他们应该会看到登录按钮,而在自动登录时系统会隐藏该按钮。在玩家完成初次登录后,系统就会隐藏登录按钮,并显示退出按钮。

祝贺您!现在,您已掌握了相应方法,可以为您的游戏添加成就、排行榜、任务以及其他 Google Play 游戏服务功能了。