使用以下代码,GKLocalPlayer().authenticated
变量始终为false
。代码运行到"User still not authenticated"
后,您就可以下载Game Center数据了。这是下面代码中的错误还是问题?
func notificationReceived()
{
println("GKPlayerAuthenticationDidChangeNotificationName - Authentication Status: \(self.localPlayer.authenticated)")
}
//MARK: 2 Authenticate the Player
func authenticateLocalPlayer()
{
println(__FUNCTION__)
self.delegate?.willSignIn()
self.localPlayer.authenticateHandler = {(viewController : UIViewController!, error : NSError!) -> Void in
if (viewController != nil)
{
dispatch_async(dispatch_get_main_queue(), {
self.showAuthenticationDialogueWhenReasonable(viewController)
})
}
else if (self.localPlayer.authenticated == true)
{
println("Player is Authenticated")
self.registerListener()
self.downloadCachedMatches()
self.delegate?.didSignIn()
}
else
{
println("User Still Not Authenticated")
self.delegate?.failedToSignIn()
}
if (error)
{
self.delegate?.failedToSignInWithError(error)
}
}
}
//MARK: 2a Show Authentication Dialogue
func showAuthenticationDialogueWhenReasonable(viewController:UIViewController!) -> Void
{
println(__FUNCTION__)
UIApplication.sharedApplication().keyWindow.rootViewController.presentViewController(viewController, animated: true, completion: nil)
}
控制台输出如下所示:
init(notification:)
authenticationCheck()
authenticateLocalPlayer()
GKPlayerAuthenticationDidChangeNotificationName - Authentication Status: false
GKPlayerAuthenticationDidChangeNotificationName - Authentication Status: false
showAuthenticationDialogueWhenReasonable
GKPlayerAuthenticationDidChangeNotificationName - Authentication Status: false
GKPlayerAuthenticationDidChangeNotificationName - Authentication Status: false
GKPlayerAuthenticationDidChangeNotificationName - Authentication Status: false
User Still Not Authenticated
Aug 2 07:33:10 iMac.local <Debug>: 07:33:10.149128 com.apple.viceroytrace: ENV: VRTraceLogToFile="-"
Aug 2 07:33:10 iMac.local <Debug>: 07:33:10.149544 com.apple.viceroytrace: ENV: VRTraceErrorLogLevel="ALL"
Aug 2 07:33:10 iMac.local <Debug>: 07:33:10.149997 com.apple.viceroytrace: ENV: VRTraceMonitorNSLog="1"
Aug 2 07:33:10 iMac.local <Debug>: 07:33:10.150429 com.apple.viceroytrace: ENV: VRTraceStreamOutputFormat="CSV"
Aug 2 07:33:10 iMac.local <Debug>: 07:33:10.150875 com.apple.viceroytrace: ENV: VRTraceLogToFile="-"
Aug 2 07:33:10 iMac.local <Debug>: 07:33:10.151312 com.apple.viceroytrace: ENV: VRTraceErrorLogLevel="ALL"
Aug 2 07:33:10 iMac.local <Debug>: 07:33:10.151768 com.apple.viceroytrace: ENV: VRTraceMonitorNSLog="1"
Aug 2 07:33:10 iMac.local <Debug>: 07:33:10.152211 com.apple.viceroytrace: ENV: VRTraceStreamOutputFormat="CSV"
Aug 2 07:33:10 iMac.local <Debug>: 07:33:10.152626 com.apple.viceroytrace: ENV: VRTraceLogToFile="-"
Aug 2 07:33:10 iMac.local <Debug>: 07:33:10.153060 com.apple.viceroytrace: ENV: VRTraceErrorLogLevel="ALL"
Aug 2 07:33:10 iMac.local <Debug>: 07:33:10.153489 com.apple.viceroytrace: ENV: VRTraceMonitorNSLog="1"
Aug 2 07:33:10 iMac.local <Debug>: 07:33:10.153925 com.apple.viceroytrace: ENV: VRTraceStreamOutputFormat="CSV"
Aug 2 07:33:10 iMac.local <Info>: 07:33:10.154140 com.apple.viceroytrace: [CHECKPOINT] logging-started
Aug 2 07:33:10 iMac.local <Notice>: 07:33:10.154146 com.apple.viceroytrace: gVRTraceErrorLogLevel initialized to ALL (9)
Aug 2 07:33:10 iMac.local <Info>: 07:33:10.144097 com.apple.AVConference: GKSConnSettings: set server: {
"gk-cdx" = "17.173.254.218:4398";
"gk-commnat-cohort" = "17.173.254.220:16386";
"gk-commnat-main0" = "17.173.254.219:16384";
"gk-commnat-main1" = "17.173.254.219:16385";
}
答案 0 :(得分:1)
如果您试图在Game Center编程指南中翻译Objective-C代码,请执行以下操作:&#34;验证本地播放器&#34; - &GT;
...然后你没有完全按照模式
您正在使用的地方:
if (viewController) {
...
} else {
if (localPlayer.authenticated) {
...
} else {
...
}
}
......他们的模式使用:
if (viewController) {
...
} else if (localPlayer.authenticated) {
...
} else {
...
}
尝试使用他们的模式重写代码 - 需要注意的一个重要事项是他们写的地方:
Game Kit会自动异步验证播放器,并根据需要调用您的身份验证处理程序以完成此过程。
......当他们尝试 或 多少次 时,他们并不专门说 验证 - 并且它反正异步发生,我完全可以想象,你的代码可能会以当前的形式打印到控制台&#34; User Not Not Authenticated&#34 ;,但是当您的应用程序的其他部分检查时,他们可能已经过身份验证并能够下载Game Center数据。
还有一点需要注意:您可能还会看到有缓存的Game Center数据的情况......请注意,在示例的条件分支的最后else
中{{1} 1}}),他们完全禁用了Game Center
让我知道结果如何!我有兴趣知道
答案 1 :(得分:1)
你可以使用它,我在github上为iOS游戏中心创建了一个简单的类 https://github.com/DaRkD0G/Easy-Game-Center-Swift
来自法国的消息,圣诞快乐
开始
import GameKit
/// The local player object.
let gameCenterPlayer = GKLocalPlayer.localPlayer()
在你的功能之后
self.gameCenterPlayer.authenticateHandler={(var gameCenterVC:UIViewController!, var gameCenterError:NSError!) -> Void in
if gameCenterVC != nil {
self.presentViewController(gameCenterVC, animated: true, completion: { () -> Void in
// no idea
})
}
}
答案 2 :(得分:0)
我一直在努力解决同样的问题。我有相同的验证结构。我认为Apple已经改变了他们的登录例程:如果你没有成为错误而没有LoginViewController就意味着你已经成功登录。由于他们删除了GKLocalPlayer.localPlayer属性,它可能是解决方案。但有一件事 - 他们没有删除GKLocalPlayer.authenticated标志,这使问题得不到解决。
编辑:我关于更改身份验证例程的假设是错误的:https://developer.apple.com/library/prerelease/iOS/documentation/GameKit/Reference/GKLocalPlayer_Ref/index.html#//apple_ref/occ/instp/GKLocalPlayer/authenticateHandler
他们实际上使用此标志来确认身份验证。问题仍未解决。
答案 3 :(得分:0)
这已在Xcode 6 Beta 6中得到修复 - 现在有GKLocalPlayer.localPlayer()
类func开展业务。
答案 4 :(得分:0)
从Xcode6开始,经过身份验证仍然是错误的。
答案 5 :(得分:0)
我最近遇到了这个问题,我通过设置启用沙盒模式解决了这个问题 - &gt;游戏中心 - &gt;开发者 - &gt;沙箱中。
希望它会帮助某人。