假设您在应用中启用了 Game Center,并且还在 iTunes Connect 中添加了排行榜,那么您需要先验证您的玩家身份,然后才能显示 GC。此外,请确保您已在 iTunes Connect 中创建了一个测试用户,您可以在出现提示时使用该用户登录 Game Center。
您的MenuViewController 应该像这样在 viewDidLoad 中验证本地播放器:
class MenuViewController: UIViewController,
GKGameCenterControllerDelegate
{
var leaderboardIdentifier: String? = nil
var gameCenterEnabled: Bool = false
override func viewDidLoad()
{
super.viewDidLoad()
//Your code that sets up your scene or other set up code
//HERE IS WHERE YOU AUTHENTICATE
authenticateLocalPlayer()
}
func authenticateLocalPlayer()
{
var localPlayer = getLocalPlayer() // see GKLocalPlayerHack.h
localPlayer.authenticateHandler =
{ (viewController : UIViewController!, error : NSError!) -> Void in
if viewController != nil
{
self.presentViewController(viewController, animated:true, completion: nil)
}
else
{
if localPlayer.authenticated
{
self.gameCenterEnabled = true
localPlayer.loadDefaultLeaderboardIdentifierWithCompletionHandler
{ (leaderboardIdentifier, error) -> Void in
if error != nil
{
print("error")
}
else
{
self.leaderboardIdentifier = leaderboardIdentifier
print("\(self.leaderboardIdentifier)") //in your example "VHS" should be returned
}
}
}
else
{
print("not able to authenticate fail")
self.gameCenterEnabled = false
if error
{
print("\(error.description)")
}
else
{
print( "error is nil")
}
}
}
}
}
func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!)
{
gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)
}
}
在您成功通过身份验证后,您应该可以展示 Game Center。
注意这一行:
var localPlayer = getLocalPlayer() // see GKLocalPlayerHack.h
要让它工作,你需要做一些小技巧来让 GKLocalPlayer 在 Swift 中正确实例化。
在 Objective-C 中创建一个新类并将文件命名为 GKLocalPlayerHack.h/m
在标题中放置:
// GKLocalPlayerHack.h
// Issue with GameKit and Swift
// https://stackoverflow.com/questions/24045244/game-center-not-authenticating-using-swift
#import <GameKit/GameKit.h>
@interface GKLocalPlayerHack : NSObject
GKLocalPlayer *getLocalPlayer(void);
@end
在实现文件中放:
// GKLocalPlayerHack.m
// Issue with GameKit and Swift
// https://stackoverflow.com/questions/24045244/game-center-not-authenticating-using-swift
#import "GKLocalPlayerHack.h"
@implementation GKLocalPlayerHack
GKLocalPlayer *getLocalPlayer(void)
{
return [GKLocalPlayer localPlayer];
}
@end
一定要加上:
#import "GKLocalPlayerHack.h"
到您的桥接头。
感谢@marmph 对这个问题的回答:Game Center not authenticating using Swift