簡體   English   中英

Swift Game Center身份驗證

[英]Swift Game Center Authentication

我在Game Center中進行身份驗證時遇到問題。 我看不到代碼有什么問題。

func authenticateLocalPlayer(){
    var localPlayer = GKLocalPlayer()
    localPlayer.authenticateHandler = {(viewController, error) -> Void in
        if (viewController != nil) {
            self.presentViewController(viewController, animated: true, completion: nil)
        }else{
            println((GKLocalPlayer().authenticated))
        }
    }
}

我在GameViewController側面調用此函數

self.authenticateLocalPlayer()

每次我運行該應用程序時,都會得到錯誤的回報。 我的設備上具有“設置”>“游戲中心”>“開發人員”>“沙箱”>“打開”,但仍然無法在我的應用程序內進行身份驗證。

這個問題與GKLocalPlayer()和Swift中的錯誤有關。 請查看我幾周前給出的非常詳細的答案:

Swift-游戲中心不可用

您可以使用它,在github https://github.com/DaRkD0G/Easy-Game-Center-Swift中為iOS游戲中心創建一個簡單的類

法國寄語,聖誕快樂

開始

(1)添加FrameWork GameKit.framework

(2)創建兩個文件:

GKLocalPlayerHack.h

#import <GameKit/GameKit.h>
@interface GKLocalPlayerHack : NSObject
GKLocalPlayer *getLocalPlayer(void);
@end

GKLocalPlayerHack.m

#import "GKLocalPlayerHack.h"
@implementation GKLocalPlayerHack
GKLocalPlayer *getLocalPlayer(void) {
    return [GKLocalPlayer localPlayer];
}
@end

(3)在您的Swift Bridging Header.h中(Objective-c導入)

#import "GKLocalPlayerHack.h"

下一個

class GameCenter {

// Game Center

let gameCenterPlayer=GKLocalPlayer.localPlayer()
var canUseGameCenter:Bool = false {
    didSet{if canUseGameCenter == true {// load prev. achievments form Game Center
        gameCenterLoadAchievements()}
    }}
var gameCenterAchievements=[String:GKAchievement]()

/**
    builder
*/
init(uiControlNow : UIViewController) {


    // Do any additional setup after loading the view.
    self.gameCenterPlayer.authenticateHandler={(var gameCenterVC:UIViewController!, var gameCenterError:NSError!) -> Void in

        if gameCenterVC != nil {
            //showAuthenticationDialogWhenReasonable: is an example method name. Create your own method that displays an authentication view when appropriate for your app.
            //showAuthenticationDialogWhenReasonable(gameCenterVC!)
            uiControlNow.presentViewController(gameCenterVC, animated: true, completion: { () -> Void in
                // no idea
            })
        }
        else if self.self.gameCenterPlayer.authenticated == true {
            self.self.canUseGameCenter = true
        } else  {
            self.canUseGameCenter = false
        }

        if gameCenterError != nil
        { println("Game Center error: \(gameCenterError)")}
    }


}


/**
    Load prev achievement granted to the player
*/
func gameCenterLoadAchievements(){
    // load all prev. achievements for GameCenter for the user to progress can be added
    var allAchievements=[GKAchievement]()

    GKAchievement.loadAchievementsWithCompletionHandler({ (allAchievements, error:NSError!) -> Void in
        if error != nil{
            println("Game Center: could not load achievements, error: \(error)")
        } else {
            for anAchievement in allAchievements  {
                if let oneAchievement = anAchievement as? GKAchievement {
                    self.gameCenterAchievements[oneAchievement.identifier]=oneAchievement}
            }
        }
    })
}


/**
    Add progress to an achievement

    :param: Progress achievement Double
    :param: ID Achievement
*/
func gameCenterAddProgressToAnAchievement(progress:Double,achievementID:String) {
    if canUseGameCenter == true { // only update progress if user opt-in to use Game Center
        // lookup if prev progress is logged for this achievement = achievement is already know (and loaded) form Game Center for this user
        var lookupAchievement:GKAchievement? = gameCenterAchievements[achievementID]

        if let achievement = lookupAchievement {
            // found the achievement with the given achievementID, check if it already 100% done
            if achievement.percentComplete != 100 {
                // set new progress
                achievement.percentComplete = progress
                if progress == 100.0  {achievement.showsCompletionBanner=true}  // show banner only if achievement is fully granted (progress is 100%)

                // try to report the progress to the Game Center
                GKAchievement.reportAchievements([achievement], withCompletionHandler:  {(var error:NSError!) -> Void in
                    if error != nil {
                        println("Couldn't save achievement (\(achievementID)) progress to \(progress) %")
                    }
                })
            }
            else {// achievemnt already granted, nothing to do
                println("DEBUG: Achievement (\(achievementID)) already granted")}
        } else { // never added  progress for this achievement, create achievement now, recall to add progress
            println("No achievement with ID (\(achievementID)) was found, no progress for this one was recoreded yet. Create achievement now.")
            gameCenterAchievements[achievementID] = GKAchievement(identifier: achievementID)
            // recursive recall this func now that the achievement exist
            gameCenterAddProgressToAnAchievement(progress, achievementID: achievementID)
        }
    }
}
/**
    Remove One Achievements

    :param: ID Achievement
*/
func resetAchievements(achievementID:String) {

    var lookupAchievement:GKAchievement? = gameCenterAchievements[achievementID]

    if let achievement = lookupAchievement {
        GKAchievement.resetAchievementsWithCompletionHandler({ (var error:NSError!) -> Void in
            if error != nil {
                ToolKit.log("Couldn't Reset achievement (\(achievementID))")
            } else {
                ToolKit.log("Reset achievement (\(achievementID))")
            }
        })

    } else {
        println("No achievement with ID (\(achievementID)) was found, no progress for this one was recoreded yet. Create achievement now.")

        gameCenterAchievements[achievementID] = GKAchievement(identifier: achievementID)
        // recursive recall this func now that the achievement exist
        self.resetAchievements(achievementID)
    }
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM