Swift Game Center身份验证

问题描述:

我在Game Center中验证有问题。我看不出我的代码有什么问题。Swift 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() 

我每次运行应用程序时,我得到一个错误的回报。我的设备上有Settings> Game Center> Developer> SandBox> ON ,但仍然无法在我的应用内进行身份验证。

+0

的可能重复[斯威夫特 - 游戏中心不可用(http://stackoverflow.com/questions/25569028/swift-game-中心 - 不提供) – mattt 2014-10-02 02:22:24

这个问题与GKLocalPlayer()和Swift中的错误有关。请看到我从几个星期前给这个很详细的解答:

Swift - Game Center not available

您可以使用,我在github上来自法国制作iOS游戏中心的简单类 https://github.com/DaRkD0G/Easy-Game-Center-Swift

消息,圣诞快乐

开始

(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)在您的斯威夫特桥接报.h(Objectic-c import)

#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) 
    } 
} 

}