Swift SpriteKit-Can';t登录到游戏中心
我在itunes connect方面做得很好,但当我启动应用程序时,它不会进行身份验证,当我按下Gamecenter按钮时,它会给我一条消息“Gamecenter不可用,用户未登录” 代码: 视图控制器:Swift SpriteKit-Can';t登录到游戏中心,swift,sprite-kit,game-center,Swift,Sprite Kit,Game Center,我在itunes connect方面做得很好,但当我启动应用程序时,它不会进行身份验证,当我按下Gamecenter按钮时,它会给我一条消息“Gamecenter不可用,用户未登录” 代码: 视图控制器: import UIKit import SpriteKit import GameKit class GameViewController: UIViewController { override func viewDidLoad() { super.viewD
import UIKit
import SpriteKit
import GameKit
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
authenticateLocalPlayer()
}
//initiate gamecenter
func authenticateLocalPlayer(){
print("Starting..1")
let localPlayer = GKLocalPlayer.localPlayer()
print("Starting..2")
localPlayer.authenticateHandler = {(viewController, error) -> Void in
print("Starting..3")
if (viewController != nil) {
print("Not signed in. Authenticating now")
var vc = self.view?.window?.rootViewController
vc?.presentViewController(viewController!, animated: true, completion: nil)
}
else {
print((GKLocalPlayer.localPlayer().authenticated))
}
}
}
游戏场景:
import SpriteKit
import iAd
import GameKit
class GameScene: SKScene, SKPhysicsContactDelegate, ADBannerViewDelegate, GKGameCenterControllerDelegate {
func saveHighscore(score:Int) {
//check if user is signed in
if GKLocalPlayer.localPlayer().authenticated {
let scoreReporter = GKScore(leaderboardIdentifier: "CC_Leaderboard_1") //leaderboard id here
scoreReporter.value = Int64(score) //score variable here (same as above)
let scoreArray: [GKScore] = [scoreReporter]
GKScore.reportScores(scoreArray, withCompletionHandler: {(error : NSError?) -> Void in
if error != nil {
print("error") }
})
}
}
//shows leaderboard screen
func showLeader() {
var vc = self.view?.window?.rootViewController
var gc = GKGameCenterViewController()
gc.gameCenterDelegate = self
vc?.presentViewController(gc, animated: true, completion: nil)
}
//hides leaderboard screen
func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!)
{
gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)
}
}
我还尝试在游戏场景中进行身份验证,但也没有成功
编辑:
看看上面函数中的print
语句,“Gamecenter..3”永远不会被打印
编辑2:
当我退出游戏中心时,问题自行解决了。(这种东西多么愚蠢)一种可能性是:在身份验证处理程序中,您从不检查错误代码。仅检查是否设置了viewController。但是,如果设置了错误代码,viewController(通常)将为零,因此您可以将登录错误解释为成功登录
我会将代码更改为:
localPlayer.authenticateHandler = {(viewController, error) -> Void in
if (error != nil)
{
//add some stuff to report the error
}
else if (viewController != nil){
print("Not signed in. Authenticating now")
var vc = self.view?.window?.rootViewController
vc?.presentViewController(viewController!, animated: true, completion: nil)
}
else {
print((GKLocalPlayer.localPlayer().authenticated))
}
}
以确认登录时没有出现错误。如果你遇到了一个错误,这将提供一个关于下一步要看什么的线索
编辑
有些人报告身份验证问题,直到他们在iTunesConnect中添加至少一个排行榜或成就。在这些报告中,他们实际上得到了一个登录错误,游戏无法识别。但是,考虑到game center固有的弱点,我会添加一个占位符成就或排行榜来排除这个问题。()您是否在Xcode的“功能”部分启用了Game Center?是的,请查看我编辑的帖子。在沙箱模式下,如果您拒绝登录5次,您将无法再次登录,除非您从“系统设置”中的“Game Center”设置中删除凭据,然后启动应用程序并重新登录,无错误。请看我编辑的帖子。
localPlayer.authenticateHandler = {(viewController, error) -> Void in
if (error != nil)
{
//add some stuff to report the error
}
else if (viewController != nil){
print("Not signed in. Authenticating now")
var vc = self.view?.window?.rootViewController
vc?.presentViewController(viewController!, animated: true, completion: nil)
}
else {
print((GKLocalPlayer.localPlayer().authenticated))
}
}