首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GKMatchmaker findMatchForRequest邀请从未收到

GKMatchmaker findMatchForRequest邀请从未收到
EN

Stack Overflow用户
提问于 2016-04-19 20:13:04
回答 3查看 549关注 0票数 5

我正试着邀请附近的球员参加比赛,但是邀请不是从来没有发送,就是没有收到。

GKMatchMaker startBrowsingForNearbyPlayersWithHandler在同一个wifi上工作并返回附近的玩家,但是我使用findMatchForRequest,它返回没有任何玩家的比赛,而我试图邀请的球员从未收到邀请通知。这是我的密码。

我首先验证本地玩家的身份:

代码语言:javascript
复制
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的委托:

代码语言:javascript
复制
    [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设置的委托方法,但它们从未被调用:

代码语言:javascript
复制
- (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方法。

EN

回答 3

Stack Overflow用户

发布于 2016-04-28 21:31:44

如果您知道如何将其转换为Objective并进行尝试,这段代码将在Swift中工作。

代码语言:javascript
复制
GKMatchmaker.sharedMatchmaker().findMatchForRequest(
    request,
    withCompletionHandler: {(match : GKMatch!, error: NSError!) -> Void in
        NSLog("This works")
})
票数 0
EN

Stack Overflow用户

发布于 2016-05-22 19:42:25

基于这里的多个问题,游戏中心似乎不时陷入困境。在最好的情况下,它返回“未识别的游戏”错误。在最坏的情况下,它只是愉快地返回零到GC调用。有时它会自行恢复工作,有时则不会。但是,您似乎可以通过登录iTunesConnect重新启动它,并执行以下任何操作:

  1. 添加一个主板
  2. 更改默认的领导板
  3. 增加一项成就

我已经将它添加到我的调试例程中。如果GC的某些方面停止工作,或返回零,则在继续之前,我尝试在iTunesConnect中进行上述更改之一。在我的例子中,我每周几次得到“未被识别的游戏”,但其他几个人注意到了“零返回值”。

票数 0
EN

Stack Overflow用户

发布于 2020-04-27 12:12:45

我知道这是一个较旧的帖子,但当我试图在互联网上建立几个应用程序实例之间的连接时,我遇到了它。我认为您缺少的部分是,在为侦听器注册之后,您需要接收连接状态

代码语言:javascript
复制
    - (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);
   }

我发现当completionHandler从findMatchForRequest:调用时,比赛中有0名玩家,但是我可以成功地使用GKMatch和GKPlayer作为didChangeConnectionState: Hope中返回的内容,这有助于那些在OP之后阅读了这么长时间的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36728503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档