iOS 向け Play ゲームサービスのスタートガイド

Google Play ゲームサービスを使った iOS ゲームの開発について紹介します。

Play Games SDK では、タブレットやモバイル デバイスでのゲームに実績、リーダーボード、マルチプレーヤー型ゲームなど人気のゲーム機能を簡単に統合できるクロス プラットフォームとして、Google Play ゲームサービスを提供しています。

このドキュメントでは、Play Games SDK を使って iOS ゲームを作成する基本的な手順について説明します。この手順は、iOS 向け Google ログインについての記事の内容より優先されます。

始める前に

Google Games SDK を使用したアプリ作成の要件:

  • Xcode バージョン 6.0 以上
  • iOS 7.0 以上を搭載するモバイル デバイス

手順 1: サンプルゲームを確認する

サンプルゲームをまだ見ていなければ、ダウンロードして内容を確認することをおすすめします。iOS 上での Google Play ゲームサービスのすべての機能について、正しい利用方法がわかります。サンプルゲームの iOS 版はすべて、サンプルのダウンロード ページにあります。各サンプル内の README ファイルに記載の手順を行って、初期化方法や実行方法をご確認ください。

手順 2: Xcode プロジェクトを作成する(または開く)

Xcode で新しいプロジェクトを作成するか、既存のプロジェクトを開きます。次の手順で必要になるため、バンドル ID をメモしておきます。これは通常、com.*your_company*.*your_project* という形式です。

新しいプロジェクトを作成する場合は、単一ビューアプリを選択します。これにより、ゲームのビュー コントローラが自動的にセットアップされます。

手順 3: ゲームを Google Play Console に追加する

Google Play Console にゲームのエントリを作成します。この手順では、そのアプリで Google Play ゲームサービスを有効にし、まだお持ちでなければ、OAuth 2.0 クライアント ID を作成します。

  1. Google Play ゲームサービスのセットアップに記載の手順のとおり、iOS ゲームのエントリを追加します。
  2. 後で必要になるため、ゲームの OAuth 2.0 のクライアント ID をメモしておきます。
  3. (省略可)実績とリーダーボードの設定方法の説明に記載の手順のとおり、ゲームに実績やリーダーボードを追加します。
  4. ゲームの変更の公開についての記事に記載の手順のとおり、チームの他のメンバーのアカウントを追加して、ゲームをテストします。

手順 4: SDK をインストールする

Google Play ゲームサービスの API を使用する前に、以下のいずれかの方法で必要なライブラリをインストールしてください。

方法 1: CocoaPods の使用

CocoaPods は Objective-C ライブラリをインストールするための依存関係マネージャーです。CocoaPads をインストールしている場合は、以下の手順のとおり、CocoaPads を使って iOS 版 Play Games 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 Games SDK を手動でインストールする手順は次のとおりです。

  1. Google Sign-In SDK のダウンロード ページから最新の Google Sign-In SDK をダウンロードして解凍します。
  2. 以下の項目を Google Sign-In SDK からプロジェクトにコピーします。
    • GoogleSignIn.bundle
    • GoogleSignIn.framework
  3. Google+ のダウンロード ページから最新の Google+ iOS SDK をダウンロードして解凍します。
  4. 以下の項目を Google+ SDK からプロジェクトにコピーします。
    • GoogleOpenSource.framework
  5. iOS 版 Play Games 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. これらの 2 つのボタンを Ctrl キーを押したままドラッグして、ビュー コントローラの .m ファイルのプライベート カテゴリ(@interface に含まれるセクション)に移動します。これにより、この 2 つのボタンそれぞれに IBOutlet オブジェクトが作成されます。

    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIButton *signInButton;
    @property (weak, nonatomic) IBOutlet UIButton *signOutButton;
    @end
    
  2. 次に、この 2 つのボタンを Ctrl キーを押したままドラッグして、ビュー コントローラの .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>
    

    この import 文をアプリのプリコンパイルされたヘッダー ファイルに置くことで、他のすべてのファイルにこのヘッダーをインポートする必要はなくなります。

  2. ビュー コントローラの .m ファイルまたは別の定数ファイルで、クライアント ID を設定します。クライアント ID は、上記の「ゲームを Google Play Console に追加する」手順でメモした文字列です。

    static NSString * const kClientID = @"123456789012.apps.googleusercontent.com";
    
  3. 上記の「ログインとログアウトのボタンを追加する」手順で作成した 2 つの buttonWasPressed メソッドに、次のコードを追加します。

    - (IBAction)signInButtonWasPressed:(id)sender {
      [[GPGManager sharedInstance] signInWithClientID:kClientID silently:NO];
    }
    
    - (IBAction)signOutButtonWasPressed:(id)sender {
      [[GPGManager sharedInstance] signOut];
    }
    
  4. プレーヤーが Google にログインすると、ゲーム内のウェブビューでログイン プロセスが行われます。

    1. ターゲット設定の [Info] タブで [URL Types] セクションまで下にスクロールし、+ アイコンをクリックして、2 つの新しい URL タイプを追加します。2 つの新しい [Identifier] フィールドにそれぞれ固有の文字列を指定します。最初の URL タイプについては、[URL Schemes] フィールドにクライアント ID を逆順で指定します。2 つ目の URL タイプについては、[URL Schemes] フィールドにアプリのバンドル ID を指定します。この情報の入力について詳しくは、Google ログインの移行に関するクイックガイドをご覧ください。

      [Identifier] と [URL Schemes] のフィールドを表示した図

    2. アプリの委任の .m ファイルに、Google Sign-in フレームワークをインポートします。

      #import <GoogleSignIn/GoogleSignIn.h>
      
    3. アプリの委任の URL ハンドラから GIDSignIn URL ハンドラを呼び出します。このメソッドは、認証プロセスの終了時にアプリが受け取る URL を処理します。

        [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: プレーヤーが戻ったときに自動的にログインする

ゲームを起動するたびにプレーヤーが毎回ログインしなくて済むよう、自動的にログインすることもできます。GPGManager では、silently:YESsignInWithClientID メソッドに指定すると、プレーヤーのログインが自動的に行われるようになります。この呼び出しが正常に機能するのは、以下の条件をすべて満たす場合です。

  • プレーヤーが以前にアプリで認証を受けたことがある
  • プレーヤーがアプリのアクセス権を取り消していない
  • プレーヤーが前回ログインしてから、アプリが新しいスコープをリクエストしていない

この機能を利用すると、signInWithClientID:silently: の呼び出しを viewDidLoad メソッドの最後に追加し、silentlyYES に設定することで、プレーヤーがゲームに自動的にログインできるようになります。

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

前回のアプリの利用時にログアウトした場合を除き、アプリを実行するとログインが自動的に行われるようになります。

手順 9: インターフェースの一部を改善する

アプリが自動的にプレーヤーのログインを行うようになると、ログイン処理の開始から完了までの間にわずかな遅延が発生します。この間、ゲームでは UI を無効にする必要があります。それには、プレーヤーのログインが自動的に行われる場合に 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. 最後に、2 つの GPGEventDelegate メソッドで refreshInterfaceBasedOnSignIn を呼び出す直前に、_silentlySigningInNO に設定します。

    - (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 ゲームサービス機能を追加する準備ができました。