Swift: Game Center へ Achievement を送信する

Apple の Game Center を使って iOS のゲームアプリを設計すれば、ゲームスコアやアチーブメントをサーバーへ送信し、プレイヤーのスコアを元にランキングを表示することが出来ます。

以下の4回に分けて、iTunes Connect の設定や Swift のスコア送信の実装を、説明していきたいと思います。

  • iTunes Connect: Game Center の Leaderboard を設定する
  • Swift: Game Center の Leaderboard へスコアを送信する
  • iTunes Connect: Game Center の Achievement を設定する
  • Swift: Game Center へ Achievement を送信する

Game Center 設定シリーズ最後の投稿は Swift で Game Center へ Achievement の送信を行います。

※この説明は Xcode で アプリが開発されていること、iTunes Connect で新規 iOS App の作成までは完了していることを前提としています。

概要

Swift から Achievement を送信する概要は以下の通りとなります。
各手順の詳しい内容に関しては、次項で説明したいと思います。

必要な Swift ファイル

  • AppDelegate.swift
  • ViewController.swift

手順の概要

  1. Xcode > GameKit.Framework の追加
  2. Xcode > プロジェクトで Game Center を ON にする
  3. Swift > Game Center へログインする
  4. Achievement 送信メソッドを記述する
  5. Achievement 送信メソッドをコールする

Game Center へ Achievement を送信する

前回の iTunes Connect: Game Center の Achievement を設定する で作成した iTunes Connect の Achievement ID を使用し Swift から達成項目の送信を行いたいと思います。

Xcode > GameKit.Framework の追加

Project > General > Linked Frameworks and Libraries の「+」をクリックし、GameKit.Framework を追加します。

swift-game-center-score1

Xcode > プロジェクトで Game Center を ON にする

Project > General > Capabillities > Game Center を ON にします。

swift-game-center-score2

Game Center へログインする

AppDelegate.swift に GameKit をインポートし の func application didFinishLaunchingWithOptions に Game Center のログイン処理を記述します。
ここで Game Center のログイン処理を行えば、アプリが起動する毎に Game Center のログインがチェックされるようになります。

AppDelegate.swift

import UIKit
import GameKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        // GameCenter Login
        if let presentView = window?.rootViewController {
            let target = presentView
            let player = GKLocalPlayer.localPlayer()
            player.authenticateHandler = {(viewController, error) -> Void in
                if ((viewController) != nil) {
                    println("GameCenter Login: Not Logged In > Show GameCenter Login")
                    
                    target.presentViewController(viewController, animated: true, completion: nil);
                } else {
                    println("GameCenter Login: Log In")
                    
                    if (error == nil){
                        println("LoginAuthentication: Success")
                    } else {
                        println("LoginAuthentication: Failed")
                    }
                }
            }
        }
        
        return true
    }
}

ビルドし確認します。Game Center へログインしていない場合、ログイン画面が表示されます。

swift-game-center-score3

Achievement 送信メソッドを記述する

ViewController に GameKit をインポートし、Achievement を送信するメソッドを記述します。

ViewController.swift

func reportAchievement(percent: Double, achievementId: String) {
    if GKLocalPlayer.localPlayer().authenticated {
        let achievement = GKAchievement(identifier: achievementId)
        if !achievement.completed {
            achievement?.percentComplete = percent
            achievement?.showsCompletionBanner = true
            GKAchievement.reportAchievements([achievement!]) { (error) -> Void in
                if error != nil {
                    println("Error in reporting achievements: \(error)")
                }
            }
        }
    }
}

Achievement 送信メソッドをコールする

ViewController の viewDidLoad から 上記のメソッドを呼び出します。ViewController.swift の全ソースは以下のようになります。

ViewController.swift

import UIKit
import GameKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        reportAchievement(100, achievementId: "your achievement ID")
    }
    
    func reportAchievement(percent: Double, achievementId: String) {
        if GKLocalPlayer.localPlayer().authenticated {
            let achievement = GKAchievement(identifier: achievementId)
            if !achievement.completed {
                achievement?.percentComplete = percent
                achievement?.showsCompletionBanner = true
                GKAchievement.reportAchievements([achievement!]) { (error) -> Void in
                    if error != nil {
                        println("Error in reporting achievements: \(error)")
                    }
                }
            }
        }
    }
}

以上で Swift から Game Center へ Achievement を送信する説明は完了です。viewDidLoad に記述した送信メソッドを、任意のタイミングで呼び出せば、様々なアプリで流用が可能です。

まとめ

Achievement はアプリ内で使用する様々な値(起動回数、プレイ回数、レベルなど)を、達成項目として設定することが可能です。
注意すべき点は、Game Center へのスコアの反映は、サーバーのトラフィックにより早い時は数秒、遅いと数十分かかる場合があります。

ですので、まずはローカル上のデータベース(もしくはユーザーデフォルト等)にスコアを保存し、Game Center なしでアプリが機能することを確認してから Game Center を実装する という手順を守る必要があります。

アプリリリース前の Leaderbord や Achievement のテストは、Sandbox を利用し行います。Game Center のテストに関してはまた別の機会に投稿したいと思います。

最後に、本投稿のサンプルで使用している iOS ゲームアプリ SQN では Game Center の Achievement を使って、プレイ回数やゲーム中に発生するユニークな値を送信しています。
SQN は完全無料ですので、よかったらダウンロードして遊んでみてください。

↓SQN のダウンロードはこちらから

SQN はユニバーサルアプリなので、すべての iOS デバイス(※) でお楽しみいただけます。
※iOS 8.0 以降がインストールされているデバイスが対象となります。

この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。

siro:chro 無料ゲーム SQN をリリースしました

img_sqn_00

sirochro 初の無料ゲームアプリ SQN をリリースしました。
記事:SQN: iOS 無料ゲームアプリ SQN - Sequential Numbers をリリース
ちょっとした時間に楽しめる完全無料のゲームなっていますので、是非ダウンロードして遊んでみてください。

↓SQN のダウンロードはこちらから

Related Contents

Pickup Contents