iOS
SpriteKit
Swift

Game Center機能を実装する

More than 3 years have passed since last update.

SwiftでGame Center機能を実装する情報が少なかったので、まとめておきます。

今回は、ベストタイムを送信する機能を実装してみます。


大まかな流れ


  • iTunes Connectにアプリを登録する。

  • iTunes ConnectでGame Center機能を有効化する。

  • Xcodeでスコア送信機能などを実装する。

  • 動作確認を行う。


iTunes Connectへの登録



  • iTunes Connectにアクセスし、ログインする。

  • 「マイ App」を押下する。

    iTunesConnect.png


  • 「新規 iOS App」を押下し、アプリを登録する。

    newApp.png



Game Center機能の有効化とLeaderBoardの作成


  • アプリ詳細ページからGame Centerタブを開き、シングルゲーム向けに有効化を押下する。

    gamecenter.png


  • LeaderBoardの追加を押下する。

    gamecenter2.png


  • 各項目を埋め、対応させる言語毎にサフィックスなどを入力する。

    gamecenter3.png


    gamecenter4.png


  • アプリの詳細情報入力画面で、Game Centerを有効化する。

    gamecenter5.png



Xcodeの設定


  • GameKit.Frameworの追加(General - Linked Frameworks and Libraries)

    GameKitFramework.png


  • plist(General - Info - Custom iOS Target Properties)にGameKitを追記

    plist.png



スコア送信機能の実装


ログイン機能の構築

アプリ起動時に呼ばれるAppDelegateの"didFinishLaunchingWithOptions"内にログイン処理を記述することで、アプリが非アクティブから復帰した際にもきちんとログインするようにします。

※Swiftサラリーマンさんのソースを拝借させていただきました。


AppDelegate.swift

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

window = UIWindow(frame: UIScreen.mainScreen().bounds)
if let window = window{
window.backgroundColor = UIColor.whiteColor()
window.rootViewController = ViewController()
window.makeKeyAndVisible()
}
// GameCenter Auto Login
if let presentView = window?.rootViewController {
let targetViewController = presentView
GKLocalPlayerUtil.login(targetViewController)
}
return true
}以下略



GKLocalPlayerUtil.swift

import UIKit

import GameKit

struct GKLocalPlayerUtil {
static var localPlayer:GKLocalPlayer = GKLocalPlayer();

static func login(target: UIViewController){
self.localPlayer = GKLocalPlayer.localPlayer()
self.localPlayer.authenticateHandler = {(viewController, error) -> Void in
if ((viewController) != nil) {
println("LoginCheck: Failed - LoginPageOpen")
target.presentViewController(viewController, animated: true, completion: nil);
}else{
println("LoginCheck: Success")
if (error == nil){
println("LoginAuthentication: Success")
}else{
println("LoginAuthentication: Failed")
}
}
}
}
}


以下のようなログインページが表示できれば成功です。

login.png


スコア送信機能の実装

「Elapsed Time - To the Hundredth of a Second」を選択しているので、以下のように実装しました。


GameScene.swift

// Time Interval

self.startDate = NSDate() // StartDate
self.time = NSDate().timeIntervalSinceDate(self.startDate) // Elapsed Time
self.clearTime = self.time // Clear Time

// GameCenter Score Transration
var leaderBoardScore = Int(omitTime(self.clearTime) * 100) // Elapsed Time
GKScoreUtil.reportScore(leaderBoardScore, leaderboardid: gameMode)

func omitTime(time: Double) -> Double {
return Double(Int(time * 100)) / 100
}時間関連の処理を一部抜粋



GKScoreUtil.swift

import UIKit

import GameKit

struct GKScoreUtil {
static func reportScore(value: Int, leaderboardid: String){
var score: GKScore = GKScore()
score.value = Int64(value)
score.leaderboardIdentifier = leaderboardid
var scoreArr:[GKScore] = [score]
GKScore.reportScores(scoreArr, withCompletionHandler:{(error:NSError!) -> Void in
if((error != nil)){
println("ReportScore NG")
}else{
println("ReportScore OK")
}
})
}
}



スコア確認機能の実装


GameScene.swift

// LeaderBoard

var localPlayer = GKLocalPlayer()
let navigationController = self.view?.window?.rootViewController as UINavigationController

if let vc = navigationController.visibleViewController as? ViewController {
localPlayer.loadDefaultLeaderboardIdentifierWithCompletionHandler({ (leaderboardIdentifier : String!, error : NSError!) -> Void in
if error != nil {
println(error.localizedDescription)
} else {
let gameCenterController:GKGameCenterViewController = GKGameCenterViewController()
gameCenterController.gameCenterDelegate = vc
gameCenterController.viewState = GKGameCenterViewControllerState.Leaderboards
gameCenterController.leaderboardIdentifier = self.gameMode
vc.presentViewController(gameCenterController, animated: true, completion: nil)
}
})
}



動作確認


サンドボックスユーザの作成


  • iTunesConnectにログインし、ユーザと役割を選択します。

    user.png


  • Sandboxテスターを選択し、テスターを作成します。

    この際、1アカウントにつき1メールアドレス必要になってくるので、Gmailのエイリアス機能(+tester1)を用いて登録すると良いかもしれません。

    user2.png



実機もしくはシミュレータでの動作確認


  • Settings - GameCenterから先ほど作成したユーザでログインし、Sandboxにチェックをいれておきます。

    iOS Simulator Screen Shot 2015.04.01 16.46.16.png


  • アプリを立ち上げると、画面上部にWelcomBackのメッセージが表示されます。

    sand.png


  • スコア送信処理を行った後、LeaderBoardを起動し、下記画面が表示されれば成功です。

    leaderboard.png



参考

Swiftサラリーマン - GameCenterのGKLocalPlayerでログイン認証