Help us understand the problem. What is going on with this article?

【ios7版】GameCenterのランキング表示、スコア送信を実装する

More than 5 years have passed since last update.

ios7からGameCenterの実装方法が少々変わったようで、ブログなどに書いているGameCenterの実装方法を試してみても、
ios7では非推奨の警告が出る部分が多かったので、コードを書き直してみました。

リーダーボードの設定などはiTunes connectであらかじめ済ませておいてください。
参考:【iPhoneアプリ】アプリをGame Center対応にする方法(前編: iTunes Connectでの設定編) - 夏までにiPhone アプリつくってみっか!

準備

1,Gamekitフレームワークをプロジェクトに追加
2,Gamekitフレームワークを.hファイルでimport
3,GKGameCenterControllerDelegateを実装

#import <GameKit/GameKit.h>

@interface HogeViewController : UIViewController<GKGameCenterControllerDelegate>

ログイン認証

ログインしているかどうかの確認をするauthenticateLocalPlayerを作成して、ViewDidLoadとかviewWillAppearとかAppDelegateなどで読み込ませる。

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

    };
}


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

スコア送信

if文でGameCenterにログインしているかどうか確認してログインしていればスコアを送信する。
書き換える部分は:MY_LEADERBOARD_ID, HIGH_SCOREの2点。
エラーの場合はエラーの旨のAlertを表示させると良い感じだと思います。

※スコアで少数の値を送信する場合は値の渡し方に少し注意する必要があるので下記の記事をどうぞ。
参考:Game CenterのLeaderboardで小数(float型)のスコアを送信する - タブレット上のcron

少数値のまま送信するのではなく、*10,*100して整数値に直して送信しないといけないみたいですね。

if ([GKLocalPlayer localPlayer].isAuthenticated) {
            GKScore* score = [[GKScore alloc] initWithLeaderboardIdentifier:MY_LEADERBOARD_ID];
            score.value = HIGH_SCORE;
            [GKScore reportScores:@[score] withCompletionHandler:^(NSError *error) {
                if (error) {
                    // エラーの場合
                }
            }];
        }

リーダーボード表示

Storyboard上でボタン作成して、showRankingと紐づけておけば、
下記コードをコピペでOKだと思います。

/**
 * ランキングボタンタップ時の処理
 * リーダーボードを表示
 */
- (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];
}

s0hno
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした