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\n1) \xe2\x80\x93authenticateWithCompletionHandler:在 iOS 6.0 中已弃用。\n如果你在 iOS 7 上测试,它可能根本不起作用。
\n\n2) 下面是通过 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
归档时间: |
|
查看次数: |
5356 次 |
最近记录: |