最近、肌寒くなりましたよね
厚手の長袖タンスから引っ張り出してきました。ついこないだ、灼熱地獄だったのに
季節の変化についていけてない今日この頃。ご無沙汰しておりますコンドウです。
今回も前回に引き続きiOSのGame Centerについてのお話です。
前回はGame Centerの特徴的な説明で終わりましたが今回はもう一歩踏み込んだ
コード的な話をしたいと思います。
まずはGame Centerを利用するための準備編です。
Game Center対応のアプリケーションを作成するには次のような手順になります。
まずはApple DeveloperサイトにGame Center対応アプリの登録が必要です。
これが無いとGame Centerの認証できません。
登録方法は
予めAppleのデベロッパー契約しておかないといけない(これは当然ですね)
iTune Connectのサイトに訪問
[マイApp]をクリック
作成されているアプリを選択(何も用意していなければまずはアプリ登録から!)
Game CenterをONする
以上で、Webでの登録は完了。
次にXcode側の設定
プロジェクトのInfoを開いて[Required device capabilities](※無ければ新規追加)に、
itemを1つ追加しStringタイプで”gamekit“と登録Web登録で登録した[Bundle ID]を同じくInfoの[Bundle identifier]に書き換え
Build Phasesの[Link Binary With Libraries]に[GameKit.framework]を追加
ソースファイルを追加(適当にGameCenter.hとGameCenter.mm)して適切なコードを記述
既存のAppDelegate.hとAppDelegate.mmに適切なコードの追加
※Xcodeは4.4の頃のものです。(ちょっと情報古いです)
ではコーディング
まずはGame Centerの認証処理から
まずはクラスの宣言から。
GameCenter.h
@interface GameCenter :NSObject //-------------------------------------------------------- // クラスメソッド //-------------------------------------------------------- + (GameCenter*)instance; //-------------------------------------------------------- // 公開メソッド //-------------------------------------------------------- -(id)init; @end
そしてソース。
GameCenter.mm
@interface GameCenter(){ // ここにクラスで使う変数等を宣言する } // プライベートプロパティ //authenticated GameCenterユーザ認証完了待ち(NO:認証中 YES:認証完了) @property (nonatomic) BOOL authenticated; //playerId プレイヤID(nilの場合はGameCenter認証失敗) @property (copy) NSString *playerId; //localPlayer GKLocalPlayerオブジェクト @property (strong) GKLocalPlayer *localPlayer; //myMatch GKMatchオブジェクト @property (strong) GKMatch *myMatch; //matchRequest マッチ用リクエスト @property (retain) GKMatchRequest* matchRequest; @implementation GameCenter static GameCenter *sharedInstance = nil; + (GameCenter*)instance { @synchronized(self) { if (sharedInstance == nil) { sharedInstance = [[self alloc] init]; } } return sharedInstance; } /* init関数 (コメント) 初期化関数 */ -(id)init { self=[super init]; if(self){ [self initMatchMaking]; _matchRequest = [GKMatchRequest new]; } return self; } /* dealloc関数 */ -(void)dealloc { [_matchRequest release]; [super dealloc]; } /* GameCenterのユーザ認証 (コメント) GameCenterでのユーザ認証画面を起動する。 認証完了はisAuthenticated==YESかどうかで確認。 */ -(void)authenticateLocalPlayer { GKLocalPlayer *player=[GKLocalPlayer localPlayer]; if(player.authenticateHandler==nil){ // 初めてのハンドラー登録なら player.authenticateHandler = ^(UIViewController *viewController, NSError *error) { if (viewController != nil){ AppDelegate* delegate = (AppDelegate*)[UIApplication sharedApplication].delegate; [delegate.rootViewController presentViewController:viewController<br /> animated:YES completion:nil]; }else if (player.isAuthenticated){ self.authenticated=YES; [self localPlayerDidChange:player]; }else{ self.authenticated=YES; if(self.playerId){ [self localPlayerDidChange:nil]; } } }; } } /* プレイヤ情報を保持 player GKLocalPlayerデータ */ -(void)localPlayerDidChange:(GKLocalPlayer *)player { self.localPlayer=player; if( player != nil ){ self.playerId=player.playerID; } } /* ユーザ認証開始 (コメント) GameCenterでのユーザ認証画面を起動する。 完了まで時間がかかる為、完了待ち関数(GameCenter_IsAuthenticate)を別途用意。 */ void GameCenter_Authenticate() { [[GameCenter instance] authenticateLocalPlayer]; // ユーザ認証 } /* ユーザ認証完了確認 (戻り値) 0 確認中 1 確認完了(認証成功) -1 確認完了(認証失敗) (コメント) GameCenter_Authenticateで認証開始した結果をこの関数で確認。 */ int GameCenter_IsAuthenticate() { GameCenter *inst = [GameCenter instance]; if( !inst.authenticated ){ // 認証中 return 0; } else{ if( ![inst.localPlayer.isAuthenticated] ){ // 認証失敗 return -1; } return 1; // 認証成功 } }
今回はGame Centerの認証まで処理を用意しました。
使い方としてはまず、
GameCenter_Authenticate()
を実行し、
次のフレームからは
GameCenter_IsAuthenticate()
で認証完了を確認する感じです。
Game Center認証画面
この認証が済まないとGame Centerのサービスが利用できません。必ず最初に行いましょう。
今回はここまで
Game Centerの認証さえ済めば、あとは色々なサービスを利用する事ができます。
ここを乗り越えて行きましょう。
Objective-Cはちょっと癖のある言語(C系っぽくない)ですが、面白いところもあります。
例えば、CやC++ではクラスの実装で内部メンバを見せたくない場合でも宣言に記述しないと
いけないですが、Objective-Cならソース側(m/mmファイル)にも宣言できるので完全に隠蔽
する事ができます。他にも色々ありますが脱線するので割愛。