Objective-CでGameCenter

久々の更新。

1年ぶりにiPhoneアプリをもっかいやってみようと思い立った。
いつの間にやらxcodeにSWIFTなる言語が追加されていた。

おぶしーもまだサッパリ分からないのでSWIFTに乗り換えても良いかなと思ったが、
新しく本を買うのがもったいなかったのでしばらくはおぶしーで頑張ろう。

で、以前作ったアプリにGame Center機能を付けようと奮戦した。

まず、GameCenterを使うにはitunes connectでLeaderboardを設定しておかなければならない。
その辺は色々なサイトで紹介されているので割愛。

ただしここで重要なのは「参照名」ではなく「Leaderboard ID」ってとこだけ宜しく。

ランキング表示はこちらを参照させて頂いた。
【ios7版】GameCenterのランキング表示、スコア送信を実装する – Qiita

ログイン認証とランキン表示は上記サイトのコードそのままで問題なかった。
ログイン認証

/**
* 画面を読み込む際の処理
*/
- (void)viewDidLoad
{
[super viewDidLoad];
[self authenticateLocalPlayer];
}

/**
 * GameCenterにログインしているか確認処理
 * ログインしていなければログイン画面を表示
 */
- (void)authenticateLocalPlayer
{
    GKLocalPlayer* player = [GKLocalPlayer localPlayer];
    player.authenticateHandler = ^(UIViewController* ui, NSError* error )
    {
        if( nil != ui )
        {
            [self presentViewController:ui animated:YES completion:nil];
        }
    };
}

ついで、ランキング表示

/**
 * ランキングボタンタップ時の処理
 * リーダーボードを表示
 */
- (IBAction)showRanking:(id)sender {
    GKGameCenterViewController *gcView = [GKGameCenterViewController new];
    if (gcView != nil)
    {
        gcView.gameCenterDelegate = self;
        gcView.viewState = GKGameCenterViewControllerStateLeaderboards;
        [self presentViewController:gcView animated:YES completion:nil];
    }
}

/**
 * リーダーボードで完了タップ時の処理
 * 前の画面に戻る
 */
- (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

ここまでは良かった。

しかしスコア送信だけうまく行かなった。
何度試しても「NO SCORE」と出るのです。

apple公式のGamecenterプログラミングガイドを読んでもよく判らん。
identifierってなんやねん。

そもそも、ランキングを呼び出すときはLeaderboard IDは要らないのもよくわからんかった。
あとで呼び出しは全体呼び出しかデフォルト設定ってことがわかった。

で、送信するときのidentifierが参照名かLeaderboard IDなのかわかりにくい、表記の仕方もわかりにくい。

そうして色々と調べていくとこちらのサイトでは
ios7からのGameCenter – Qiita

GKScore *scoreReporter=[[GKScore alloc] initWithLeaderboardIdentifier:@"カテゴリのID"];

となっている。
最後のLeaderboard IDのところが@””で囲まれている。
前後のコードで描き方も変わるんだろうが超が30個位つく初心者にはよくわからない。

しかたがないので色々なパターンを試して

    GKScore *scoreReporter=[[GKScore alloc] initWithLeaderboardIdentifier:@"Leaderboard ID"];
    scoreReporter.value = self.Score;
    NSArray *scorearray=[[NSArray alloc]initWithObjects:scoreReporter, nil];
    NSLog(@"点数送信!!!!!");
    [GKScore reportScores:scorearray withCompletionHandler:^(NSError *error)
     {
         if (error)
         {
             NSLog(@"書き込めませんでした/(^o^)\");
         }
     }];

とゆーコードを点数を確認したすぐ後に入れることで何とかちゃんと送信できるようになった。

あと、sandboxの話とかもあるけど関係あったのか無かったのかよく分からず。
これだけのために数日費やしたので忘れないように残しておく。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です