GameCenterを登録してみた

1.LeaderBoardの追加

ランキングを表示するためのLeaderBoardを作成します

初めてのGameCenterなので右も左もわからない状況ですがなんとなくこんな感じで設定してみました。

スコアの範囲は最大値が以下の数値だったのでそのまま入れています。

Leaderboardができたら機能TabからAppleStoreタブに移動してGame Centerのチェックマークにチェックをつけて先ほど作成したLeaderboardを選択します

2.GameCenterにログインさせスコアを登録する

GameCenterへのログイン

func authenticateLocalPlayer() {
    let player = GKLocalPlayer.local
    player.authenticateHandler = {(viewController, error) -> Void in
        if viewController != nil
        {
            self.present(viewController!, animated: true, completion: nil)
        }
    }
}

Leaderboardへのデータ送信

func sendLeaderboardWithID(ID:String, rate:Int64) -> Void {
    let score = GKScore(leaderboardIdentifier: ID)
    if GKLocalPlayer.local.isAuthenticated {
        //スコアを設定
        score.value = rate
        print("success")
        GKScore.report([score], withCompletionHandler: { (error) in
            if error != nil {
                // エラーの場合
                print("error: \(String(describing: error))")
            }
        })
    } else {
        print("GameCenterにログインしていません")
    }
}

3.Leaderboardでランキングを表示させる

私はのアプリはゲーム画面を全てSKSceneで作ってうまく遷移させることができなかったので、Notificationを飛ばしてSKSceneを乗っけているメインのViewControllerで以下のように遷移させました

@objc func openLeaderBordScoreLanking() {
    let localPlayer = GKLocalPlayer()
    localPlayer.loadDefaultLeaderboardIdentifier(completionHandler: {leaderboardIdentifier,error in
        if error != nil {
            print(error.debugDescription)
        } else {
            
            let gcvc:GKGameCenterViewController = GKGameCenterViewController()
            gcvc.gameCenterDelegate = self
            gcvc.viewState = .leaderboards
            gcvc.leaderboardIdentifier = "munyu.score.ranking"
            self.present(gcvc, animated: true, completion: nil)
        }
    })
}

extension ViewController: GKGameCenterControllerDelegate {
    func gameCenterViewControllerDidFinish(_ gameCenterViewController: GKGameCenterViewController) {
        self.dismiss(animated: true, completion: nil)
    }
}