GKLocalPlayer 身份验证不起作用,但 isAuthenticated 返回 YES(游戏中心沙箱)

Fab*_*ser 7 objective-c gamekit ios game-center

我正在努力在我的游戏中集成基于回合的比赛,几天前我开始从 GameKit API 收到奇怪的错误,说本地玩家没有经过身份验证,即使他是。

当我启动应用程序时,将authenticateHandler调用 ,显示视图控制器,输入密码后,authenticaHandler再次调用 并且本地播放器似乎已通过身份验证。isAuthenticated返回YES

但是一旦我开始使用任何 GameKit API,比如loadFriendsWithCompletionHandler:,就会返回一个错误,指出玩家尚未通过身份验证。

这是用于处理身份验证更改的代码。

[[GKLocalPlayer localPlayer] setAuthenticateHandler:^(UIViewController *viewController, NSError *error) {
    if ([[GKLocalPlayer localPlayer] isAuthenticated]) {
        // Player authenticated
    } else {
        // Player not authenticated

        if (viewController != nil) {
            // Present view controller
        }
    }
}];
Run Code Online (Sandbox Code Playgroud)

这是我在调用任何 GameKit 方法时收到的错误消息。请注意,-isAuthenticated返回错误时仍然返回YES。

查找匹配时出错:Error Domain=GKErrorDomain Code=6 “请求的操作无法完成,因为本地播放器尚未通过身份验证。” UserInfo=0x14e9f950 {NSLocalizedDescription=请求的操作无法完成,因为本地播放器尚未通过身份验证。}
(lldb) print (BOOL) [[GKLocalPlayer localPlayer] isAuthenticated] (BOOL) $3 = YES

我正在 Game Center 沙箱中进行测试,几天前它开始发生。以前,我根本没有遇到这个问题。
当应用程序启动时,它只会发生大约 3 次之一。我试过删除应用程序,重新启动我的设备,清理构建文件夹以及我能想到的所有其他内容。

我是否遗漏了什么或其他人是否遇到过类似的问题?

Mis*_*rko -1

为什么使用 Game Kit Framework?\n从 iOS 7 开始,您应该使用 MultipeerConnectivity。

\n\n

1) \xe2\x80\x93authenticateWithCompletionHandler:在 iOS 6.0 中已弃用。\n如果你在 iOS 7 上测试,它可能根本不起作用。

\n\n

2) 下面是通过 MultipeerConnectivity 创建连接的示例

\n\n

客户:

\n\n
- (id)init {\nself = [super init];\n    if (self) {\n        NSString *peerName = [NSString stringWithFormat:@"%@-%@", @"Client", [[UIDevice currentDevice] identifierForVendor].UUIDString];\n        self.myPeerID = [[MCPeerID alloc] initWithDisplayName:peerName];\n\n        self.servers = [NSMutableArray array];\n\n        self.session = [[MCSession alloc] initWithPeer:self.myPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone];\n        self.session.delegate = self;\n        self.browser = [[MCNearbyServiceBrowser alloc] initWithPeer:self.myPeerID serviceType:@"Connect"];\n        self.browser.delegate = self;\n        [self.browser startBrowsingForPeers];\n  }\n  return self;\n}\n//-----\n- (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info {\n        NSLog(@"client: found a server: %@", peerID);\n        [self.browser invitePeer:peerID toSession:self.session withContext:nil timeout:10];\n\n}\n\n- (void)browser:(MCNearbyServiceBrowser *)browser lostPeer:(MCPeerID *)peerID {\n        NSLog(@"client: lost server: %@", peerID);\n}\n\n#pragma mark - MCSessionDelegate\n- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state {\n        NSLog(@"client: status changed to %d for server: %@", state, peerID.displayName);\n\n        switch (state) {\n         case MCSessionStateNotConnected: {\n\n        }\n             break;\n         case MCSessionStateConnected: {\n\n        }\n             break;\n         default:\n             break;\n        }\n  }\n\n   - (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {\n        NSLog(@"client: received data (len = %lu) from server %@",(unsigned long)[data length], peerID.displayName);\n        NSDictionary *receiveDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:data];\n\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

服务器:

\n\n
- (id)init {\n    self = [super init];\n        if (self) {\n            NSString *peerName = [NSString stringWithFormat:@"%@-%@", @"Server", [[UIDevice currentDevice] identifierForVendor].UUIDString];\n            self.myPeerID = [[MCPeerID alloc] initWithDisplayName:peerName];\n\n            self.session = [[MCSession alloc] initWithPeer:self.myPeerID];\n            self.session.delegate = self;\n\n            self.advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:self.myPeerID\n                                                                discoveryInfo:nil\n                                                                  serviceType:@"Connect"];\n            self.advertiser.delegate = self;\n           [self.advertiser startAdvertisingPeer];\n         }\n     return self;\n}\n\n#pragma mark - MCNearbyServiceAdvertiserDelegate\n\n- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler {\n     NSLog(@"server: did receive invitation from peer %@", peerID.displayName);\n     invitationHandler(YES, self.session);\n }\n\n- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didNotStartAdvertisingPeer:(NSError *)error {\n      NSLog(@"server: error %@", error);\n }\n\n #pragma mark - MCSessionDelegate\n\n - (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state {\n      NSLog(@"server: status changed to %ld for client: %@", state, peerID.displayName);\n\n      switch (state) {\n       case MCSessionStateConnected: {   \n           NSMutableDictionary *sendDict = [NSMutableDictionary dictionary];\n           NSError *error = nil;\n           [self.session sendData:[NSKeyedArchiver archivedDataWithRootObject:sendDict]\n                           toPeers:@[peerID]\n                          withMode:MCSessionSendDataReliable\n                             error:&error];\n         }\n           break;\n        case MCSessionStateNotConnected:\n         break;\n        default:\n         break;\n       }\n       NSLog(@"connectedPeers %@", self.session.connectedPeers);\n   }\n\n   - (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {\n       NSLog(@"server: received data (len = %lu) from client %@", (unsigned long)[data length], peerID.displayName);\n\n       NSDictionary *dictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:data];\n\n    }\n\n    - (void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID {\n    }\n\n    - (void)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress {\n    }\n\n    - (void)session:(MCSession *)session didFinishReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID atURL:(NSURL *)localURL withError:(NSError *)error {\n    }\n\n    - (void)session:(MCSession*)session didReceiveCertificate:(NSArray*)certificate fromPeer:(MCPeerID*)peerID certificateHandler:(void (^)(BOOL accept))certificateHandler {\n          certificateHandler(YES);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我使用 GameKit 来获取成就和排行榜,使用 MultipeerConnectivity 不是一个选项。 (2认同)