使用Swift进行游戏中心认证

时间:2014-07-29 02:14:02

标签: authentication swift game-center ios8

使用以下代码,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";
    }

6 个答案:

答案 0 :(得分:1)

如果您试图在Game Center编程指南中翻译Objective-C代码,请执行以下操作:&#34;验证本地播放器&#34; - &GT;

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/Users/Users.html#//apple_ref/doc/uid/TP40008304-CH8-SW18

...然后你没有完全按照模式

您正在使用的地方:

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;沙箱中。

希望它会帮助某人。