【问题标题】:GKMatchmaker findMatchForRequest invite never receivedGKMatchmaker findMatchForRequest 邀请从未收到
【发布时间】:2016-04-19 20:13:04
【问题描述】:

我正在尝试邀请附近的玩家参加比赛,但邀请要么从未发送,要么从未收到。

GKMatchMaker startBrowsingForNearbyPlayersWithHandler 工作并返回在同一 wifi 上的附近玩家,但随后我使用 findMatchForRequest 并返回没有任何玩家的比赛,并且我尝试邀请的玩家永远不会收到邀请通知。这是我的代码。

我首先验证本地播放器:

GKLocalPlayer.localPlayer.authenticateHandler= ^(UIViewController *controller, NSError *error)
{
    if (error)
    {
        NSLog(@"%s:: Error authenticating: %@", __PRETTY_FUNCTION__, error.localizedDescription);
        return;
    }
    if(controller)
    {
        // User has not yet authenticated
        [pViewController presentViewController:controller animated:YES completion:^(void)
         {
             [self lookForNearbyPlayers];
         }];
        return;
    }
    [self lookForNearbyPlayers];
};

-(void)lookForNearbyPlayers
{
    if(!GKLocalPlayer.localPlayer.authenticated)
    {
        NSLog(@"%s:: User not authenticated", __PRETTY_FUNCTION__);
        return;
    }

我将我的视图控制器注册为 GKLocalPlayerListener 的代理:

    [GKLocalPlayer.localPlayer registerListener:self]; // self is a view controller.

    // This works. My test local player which is a second device and appleID I setup shows up when this handler is called.
    [GKMatchmaker.sharedMatchmaker startBrowsingForNearbyPlayersWithHandler:^(GKPlayer *player, BOOL reachable)
    {
         NSArray * paPlayers= [NSArray arrayWithObject:player];
         _pMatchRequest= [[GKMatchRequest alloc] init];
         _pMatchRequest.minPlayers= 2;
         _pMatchRequest.maxPlayers= 4;
         _pMatchRequest.recipients = paPlayers;
         _pMatchRequest.inviteMessage = @"Join our match!";
         _pMatchRequest.recipientResponseHandler = ^(GKPlayer *player, GKInviteeResponse response)
         {
             // This is never called.
             NSLog((response == GKInviteeResponseAccepted) ? @"Player %@ Accepted" : @"Player %@ Declined", player.alias);
         };

         // This returns with a match without any players.
         [GKMatchmaker.sharedMatchmaker findMatchForRequest:_pMatchRequest withCompletionHandler:^(GKMatch *match, NSError *error)
          {
              if(error)
              {
                  NSLog(@"%s:: %@", __PRETTY_FUNCTION__, error.localizedDescription);
                  return;
              }
              else if(match != nil)
              {
                  _pMatch= match;
                  match.delegate = self;
                  NSLog(@"players count= %lu", (unsigned long)_pMatch.players.count); // Always returns 0
              }
          }];
     }
}

我有 GKLocalPlayerListener 设置的委托方法,但它们从未被调用:

- (void)player:(GKPlayer *)player didRequestMatchWithRecipients:(NSArray<GKPlayer *> *)recipientPlayers
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
}

- (void)player:(GKPlayer *)player didAcceptInvite:(GKInvite *)invite
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
}

有谁知道如何在没有 GKMatchmakerViewController 和 iOS9 的情况下使其工作?我能找到的唯一示例有已弃用的 -inviteHandler 方法。

【问题讨论】:

  • 您已验证您的开发环境已设置所有权利?并且其他设备使用相同的证书等编译?
  • @Larusso,是的,我有,我只是再次确认。有什么想法吗?感谢您的意见!
  • 不,对不起。我检查了我上次玩游戏中心时使用的一些代码。它很快并使用了旧的api。由于证书而不是编码本身,我很难让它工作。
  • 您可能只是想在一台设备中找到匹配项。基本上这个函数“findMatchRequest”应该在两个不同的设备/模拟器中同时调用,然后你会收到一个成功的响应。

标签: ios objective-c ios9 game-center gamekit


【解决方案1】:

如果您知道如何将它转换为 Objective-C 并尝试一下,那么这段代码在 Swift 中工作。

GKMatchmaker.sharedMatchmaker().findMatchForRequest(
    request,
    withCompletionHandler: {(match : GKMatch!, error: NSError!) -> Void in
        NSLog("This works")
})

【讨论】:

  • 感谢您的回答。我很快就会在这里试一试。也许苹果最近在推动我们使用 Swift。
【解决方案2】:

基于 SO 上的多个问题,Game Center 似乎时常卡住。在最好的情况下,它会返回“游戏无法识别”错误。在最坏的情况下,它只是愉快地将 nil 返回给 GC 调用。有时它会自行恢复工作,有时则不会。但您似乎可以通过登录 iTunesConnect 并执行以下任何操作来重新启动它:

  1. 添加排行榜
  2. 更改默认排行榜
  3. 添加成就

我已将此添加到我的调试程序中。如果 GC 的某些方面停止工作或返回 nil,我会尝试在 iTunesConnect 中进行上述更改之一,然后再继续。就我而言,我每周都会收到几次“游戏无法识别”,但其他几个人已经注意到“零返回值”。

【讨论】:

    【解决方案3】:

    我知道这是一篇较早的帖子,但在尝试通过 Internet 在多个应用程序实例之间建立连接时遇到了它。我相信您缺少的部分是在注册侦听器后,您需要接收连接状态

        - (void)match:(GKMatch *)match
            player:(GKPlayer *)player
            didChangeConnectionState:(GKPlayerConnectionState)state
     {
         NSLog(@">>> did change state");
    
         if (state == GKPlayerStateConnected)
         {
             NSLog(@">>>> match:%@ did change to Connected for player %@ ",match, player.displayName);
    
         }
       else if (state == GKPlayerStateDisconnected)
       {
        NSLog(@">>>> match:%@ disconnected for player %@ ",match, player.displayName);
       }
    

    当从 findMatchForRequest: 调用 completionHandler 时,我发现比赛有 0 个玩家,但是我可以成功使用 didChangeConnectionState 中返回的 GKMatch 和 GKPlayer: 希望对在 OP 之后很长时间阅读本文的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多