iOS游戏中心GKLocalPlayerListener

10

我尝试在回合制游戏中实现事件监听器,以便玩家可以接收到他的回合何时处于活动状态或何时被朋友邀请。在 iOS 7 中,GKTurnBasedEventHandler已被弃用,并且我在文档中阅读到应该使用GKLocalPlayerListener。但这就是全部信息了。是否有人已经使用它?因为任何地方都没有相关信息。

这是我之前尝试过的,但不起作用。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
    [localPlayer authenticateWithCompletionHandler:^(NSError *error)
     {
         if (localPlayer.isAuthenticated)
         { 
             GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
             [localPlayer registerListener:self];
         }
     }];

    return YES;
}

-(void)handleInviteFromGameCenter:(NSArray *)playersToInvite
{
    NSLog(@"test");
}

- (void)player:(GKPlayer *)player receivedTurnEventForMatch:(GKTurnBasedMatch *)match didBecomeActive:(BOOL)didBecomeActive
{
    NSLog(@"test");
}

你有找到其他相关信息吗?我在使用GKLocalPlayerListener方面遇到了困难,很难找到相关资料。现有的文档和示例仍然使用已弃用的API。 - iksnae
还没有,有其他紧急的事情出现了,但如果我做了,我会发布解决方案。 - Macaret
它在某种程度上对我有效。这些方法类似于现已弃用的方法,只是当前播放器也被传递了。然而,我遇到的问题是如何确定何时取消/重新注册侦听器,例如当应用程序在bg / fg之间切换时。这也是iOS 6中邀请侦听器的问题。 - Drux
1
我遇到了相同的不稳定行为。有时候监听器会收到回合或保存回合事件,但大部分时间什么都没有。我必须重新启动游戏才能使比赛信息同步。此外,Game Center 中的信息并没有显示为最新的。除非我重新加载游戏,否则轮到谁的回合是不正确的。我正在使用沙盒 Game Center。 - AutomatonTec
3个回答

2

这是我用来注册GKLocalPlayerListener的一些代码:

__weak GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) {
   if (viewController) {
         [authenticateFromViewController presentViewController:viewController animated:YES completion:^{
          [localPlayer registerListener:self];
          NSLog(@"Authenticated. Registering Turn Based Events listener");
        }];
  } else if (localPlayer.authenticated) {
         [localPlayer registerListener:self];
         NSLog(@"User Already Authenticated. Registering Turn Based Events listener");
  } else {
         NSLog(@"Unable to Authenticate with Game Center: %@", [error localizedDescription]);
  }
};

文档指出,你只应该注册一个GKLocalPlayerEventListener,因此你可以通过检查是否已经注册来改进这段代码。

请注意,在iOS 6中,authenticateWithCompletionHandler已被弃用,他们建议像我上面所做的那样设置authenticateHandler属性。


1

我可能有点晚,但希望能帮到某些人...

这是我的做法。根据苹果文档,我创建了自己的方法,在[我的]应用程序适当时显示认证视图。

    - (void)authenticateLocalUser
    {
        if ([GKLocalPlayer localPlayer].authenticated == NO) {
            __weak typeof(self) weakSelf = self;
            __weak GKLocalPlayer *weakPlayer = [GKLocalPlayer localPlayer];

            weakPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) {
                if (viewController != nil) {
                    [weakSelf showAuthenticationDialogWhenReasonable:viewController];
                } else if (weakPlayer.isAuthenticated) {
                    // Player has been authenticated!
                    [weakPlayer registerListener:weakSelf];
                } else {
                    // Should disable Game Center?
                }
            };

        } else {
            // Already authenticated
            [[GKLocalPlayer localPlayer] registerListener:self];
        }
    }


    -(void)showAuthenticationDialogWhenReasonable:(UIViewController *)controller
    {
        [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:controller animated:YES completion:nil];
    }

这段代码位于单例帮助类中,如果您有自己的类,它可能会更简化。


非常感谢,这个问题困扰了我15个小时,到处都提到了委托,但正确的语法却不可用。我真的为了自己的目的将其转换为Swift。https://stackoverflow.com/questions/44889019/gkturnbasedeventlistener-could-not-be-set-to-delegate-of-my-viewcontroller - Asim Khan

1
我相信你在那里。这一次请做几件事情。确保您不会添加多个监听器,在添加监听器之前,请先注销所有监听器,以防万一。
我确保在整个项目中只执行了一次此操作,但我会多次获取本地播放器。
-(void) onLocalPlayerAuthChanged:(GKLocalPlayer*)authPlayer {

    [authPlayer unregisterAllListeners];
    [authPlayer registerListener:_Whatever_];

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接