GameCenterを用いたオンラインスコア対応手順

GameCenterでのオンラインスコア対応としてランキングと達成項目を対応させる場合の手順。

環境
Xcode:7.2.1
Swift:2.1.1
SpriteKit使用

目次
0.事前準備
1.iTunes Connectでの登録
 1-1.Leaderboardを追加
 1-2.達成項目を追加
 1-3.アプリに対してLeaderboardと達成項目を追加
2.Xcodeの設定
3.プログラム実装
 3-1.ログイン処理
 3-2.スコア送信、Leaderboard表示処理
4.Sandboxの対応
 4-1.iTunes Connectにユーザ追加
 4-2.シミュレーターで確認

おおまかな流れやソースの記述は主に下記3サイトを参考にさせてもらいました。
「Game Center機能を実装する」
「[iPhone] Game Center を実装する (Swift)」
「swift2 + spriteKit のGameCenter対応まとめ」


0.事前準備
事前にiTunes Connect上でAppを作成しておく

作り方は
iOSアプリ登録の流れを参考に。
証明書の生成済みであれば「2.AppIDの登録」から「4-1.アプリを追加」まで※でOK
※Game Centerを使えるようにする為の最小限の準備



1.iTunes Connectでの登録
1-1.Leaderboardを追加
iTunes Connectにログイン
> マイApp へ移動
> 該当のアプリを選択
> 機能 > GameCenter を選択
> Leaderboardの横の「+」をクリック

スクリーンショット 2016-02-25-01.png

> タイプで「シングルLeaderboard」を選択

スクリーンショット 2016-02-25-02.png

> 必要情報を入力

スクリーンショット 2016-02-25-03.png

参照名:iTunes Connect上での名称、ユニーク
ID:識別子、ユニーク
フォーマットタイプ:選択肢の中から選ぶ
送信タイプ:2つから選択
並べ替え:2つから選択、今回は高い得点を最初にしたかったので降順を指定
スコアの範囲:フォーマットにIntegerを指定した際のオプション

ローカリゼーションの入力
> 「言語を追加」をクリック

スクリーンショット 2016-02-25-04.png

言語:対象言語を選択
名前:(対象アプリでの)Leaderboard上で表示される名称
フォーマット:選択肢の中から選ぶ
サフィックス:スコアの末尾に付ける文字(~点や~回、等)
画像:Leaderboard上で表示されるアイコン画像

スクリーンショット 2016-02-25-05.png

> 入力が終わったら右下の保存

1-2.達成項目を追加
iTunes Connectにログイン
> マイApp へ移動
> 該当のアプリを選択
> 機能 > GameCenter を選択
(1-1から続けて行っている場合はここから)
> 達成項目の横の「+」をクリック

スクリーンショット 2016-02-25-06.png

> 必要情報を入力

スクリーンショット 2016-02-25-07.png

参照名:iTunes Connect上での名称、ユニーク
ID:識別子、ユニーク
点数:達成時に得られる点数(1つ最高100まで、累計1000上限)
送信タイプ:2つから選択
非表示:Yes or No、達成時まで隠すかどうか
複数回達成可能:Yes or No、既に達成した項目のチャレンジを受け入れるか

ローカリゼーションの入力
> 「言語を追加」をクリック

スクリーンショット 2016-02-25-08.png
※画像必須の為、キャプチャはダミー画像を入れています

言語:対象言語を選択
タイトル:達成項目の表示名
達成前説明:(非表示にしていない場合のみ)取得前に出てくる説明
達成後説明:取得後に出てくる説明
画像:該当達成項目のアイコン画像、取得前は見えない※必須

複数の達成項目を設定する場合は「1-2」の作業を繰り返し行う
※一覧の並びがそのままLeaderBoardの表示順になるので注意

> 入力が終わったら右下の保存

1-3.アプリに対してLeaderboardと達成項目を追加

> App Storeを選択
> バージョン情報入力画面(画面では「1.0提出準備中」)
> Game Center項目をONにする
> Leaderboardの横の「+」をクリック

スクリーンショット 2016-02-25-21.png

> 1-1で作成したLeaderboardを選択して追加

スクリーンショット 2016-02-25-22.png

> 達成項目の横の「+」をクリック

スクリーンショット 2016-02-25-23.png

> 1-2で作成した達成項目を選択して追加

スクリーンショット 2016-02-25-24.png

> Leaderboardと達成項目の追加が出来たら(右上の)保存をクリック



2.Xcodeの設定

ライブラリの追加
Xcode上でプロジェクトをクリック
> General
> Linked Frameworks and Libraries
> 「+」をクリック

スクリーンショット 2016-02-25-31.png
※広告サービスのnendを利用している為、画像では既に3つのライブラリがありますが
手動で何も追加していない状態では1個も一覧にない状態になります

GameKitを検索し、「GameKit.framework」をAdd

スクリーンショット 2016-02-25-32.png

plistへ追加
> info
> Custom iOS TargetPropeties
> Required devide capabilities

スクリーンショット 2016-02-25-33.png

> 横の「+」をクリックし"gamekit"と入力

スクリーンショット 2016-02-25-34.png



3.プログラム実装

3-1.ログイン処理
端末上でGameCenterにログインしていない場合の対応として、アプリ起動時にログイン画面を呼び出す

AppDelegate.swiftに追記
・GameKitのインポート
・application関数にログイン処理

実装例)

import UIKit
import GameKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.

//game center login
if let rootView = self.window?.rootViewController {
let player = GKLocalPlayer.localPlayer()

player.authenticateHandler = {(viewController, error) -> Void in
if player.authenticated {
//geme center login
print("geme center authenticated")

} else if viewController != nil {
//game center not login. login page open
print("game center not login. login page open")
rootView.presentViewController(viewController!, animated: true, completion: nil)

} else {
if error != nil {
//game center login error
print("game center login error, \(error!.code): \(error!.description)")
}
}
}
}

return true
}

~中略

}



3-2.スコア送信・達成項目送信、Leaderboard表示処理

対象のSceneファイルに下記を追記
・GKGameCenterControllerDelegate実装
・スコア送信、達成項目送信処理
・Leaderboard表示処理

実装例)

import SpriteKit
import UIKit
import GameKit


class xxxxScene: SKScene, GKGameCenterControllerDelegate {
//Leaderboard ID
let LEADERBOARD_ID = "xxxxxxxxxx"

//Achivement ID
let ACHIVEMENT_ID_100 = "xxxxxxxxxxxx"

~中略

override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
if let touch = touches.first as UITouch? {
let name = self.nodeAtPoint(touch.locationInNode(self)).name

if name == "send" {
//sendボタン
let sendScore = 200
reportScore(sendScore)
reportAchivement(sendScore)

} else if name == "leaderboard" {
//leaderboardボタン
showLeaderboard()
}
}
}

~中略

//GKGameCenterControllerDelegate実装用
func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController) {
gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)
}

//leaderboardへスコア送信
func reportScore(sendScore: Int) {
let score: GKScore = GKScore()
score.value = Int64(sendScore)
score.leaderboardIdentifier = LEADERBOARD_ID

let scoreArr: [GKScore] = [score]
GKScore.reportScores(scoreArr, withCompletionHandler: {(error: NSError?) -> Void in
if error != nil {
print("report score error")
} else {
print("report score OK")
}
})
}

//達成項目
func reportAchivement(sendScore: Int) {
let ids = getAchievementId(sendScore)

var achievements: [GKAchievement] = Array()

for achivementId in ids {
let achievement: GKAchievement = GKAchievement()
achievement.identifier = achivementId
achievement.percentComplete = 100
achievements.append(achievement)
}
if achievements.count != 0 {
GKAchievement.reportAchievements(achievements, withCompletionHandler: {(error) -> Void in
if error != nil {
print(error!.description)
}
})

}
}
//達成状況によって達成項目のID配列を戻す
func getAchievementId(sendScore: Int) -> [String] {
var ids: [String] = Array()
if sendScore >= 100 {
ids.append(ACHIVEMENT_ID_100)
}
return ids
}

//leaderboard取得
func showLeaderboard() {
let localPlayer = GKLocalPlayer()
localPlayer.loadDefaultLeaderboardIdentifierWithCompletionHandler({
(leaderboardIdentifier : String?, error : NSError?) -> Void in
if error != nil {
print(error!.localizedDescription)
} else {
let gameCenterController: GKGameCenterViewController = GKGameCenterViewController()
gameCenterController.gameCenterDelegate = self
gameCenterController.viewState = GKGameCenterViewControllerState.Leaderboards
gameCenterController.leaderboardIdentifier = self.LEADERBOARD_ID
self.view?.window?.rootViewController?.presentViewController(
gameCenterController, animated: true, completion: nil)
}
})
}
}




4.Sandboxの対応

4-1.iTunes Connectにテストユーザ追加

iTunes Connectにログイン
> ユーザと役割 へ移動
> Sandboxテスターを選択
> テスターの横の「+」をクリック

スクリーンショット 2016-02-25-41.png

> ユーザ情報を登録する
> (右上の)保存
※既にapple IDを取得しているメールアドレスは使用できないので
 テスト用にメールアドレスを取得した方が良いかも

スクリーンショット 2016-02-25-42.png

登録後指定したメールアドレス宛に確認メールが送信されてくるので
メール内の確認から一度ログインを行う事で登録完了

4-2.シミュレーターで確認

シミュレーターを起動する
> Home(Shift + Cmd + h)へ移動
> Settingsを起動
> Game Center
> Sign In
「4-1」で作成したテストユーザでログインする

Game Center機能を実装したアプリを起動し、動作確認を行う

テストアプリからデータ送信をした際のGame Center画面を何枚か

達成項目なし
スクリーンショット 2016-02-25-43.png
-----
スクリーンショット 2016-02-25-44.png
-----
スクリーンショット 2016-02-25-45.png

達成項目取得後
スクリーンショット 2016-02-25-46.png
-----
スクリーンショット 2016-02-25-47.png


上記まで行ければ必要そうなパーツは一通りでしょうか。
あとはスコア送信後のアプリ側の対応や達成項目の増設や達成率の対応などを詰めていく感じですね。


※以下、私が参考にしている本の紹介になります。







スポンサーリンク

この記事へのコメント


この記事へのトラックバック