MILLEN BOX

音楽好きの元組み込みソフトエンジニアによるプログラミング(主にiOSアプリ開発)の勉強の記録

Game Center 2歩目。非アクティブからの復帰時のGame Centerログインに対応する [Game Center初心者] [swift1.2]

お盆は家族サービスに忙しかったのです。
前回は、はじめの一歩としてGame Centerのログインを行う実装を行いました。

SwiftでのGameCenterはじめの一歩。ログインを簡単に行う [Game Center初心者向け] [Swift1.2] - MILLEN BOX

しかし上記リンクの方法では、アプリが非アクティブから復帰した際にもログイン出来ませんでした。非アクティブから復帰した際のログインの対応には、前回の処理をAppDelegateに実装しなければなりません。
今回はこれを行っていきます。参考サイトにしたサイトは以下です。

swift-salaryman.com

自分ポイント1

ログイン処理を別ファイルに書き出します。ファイル名は GKLocalPlayerUtil.swift です。
前回の処理に加えSandbox処理についても追加しています。(elseの部分)

//
//  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")
                }
            }
        }
    }
}

自分ポイント2

AppDelegateにて、 自分ポイント1 で抜き出した処理を呼び出します。
記載箇所は、didFinishLaunchingWithOptions です。これはAppDelegate処理内の最後の方で呼ばれる処理みたいです。
iOS のイベント駆動をライフサイクルイベントとユーザアクションイベントにわけて理解する - A Day In The Life を参照のこと。

//
//  AppDelegate.swift
//

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.
        
        // GameCenter Auto Login
        if let presentView = window?.rootViewController {
            let targetViewController = presentView
            GKLocalPlayerUtil.login(targetViewController)
        }
        
        return true
    }

    ...

}

if let presentView = window?.rootViewControllerがないと動かすことが出来なかったため、忘れずに記載して下さい。
これでバッチリ非アクティブから復帰に対応出来ました。