[GKMatchmaker sharedMatchmaker].inviteHandler 在 iOS 7 中已弃用,但 GameKit 指南仍然说要这样设置。有谁知道我们应该为 iOS 7 实时游戏邀请使用什么?有几个侦听器类的新类/方法,但没有一个专门解决我所看到的这个问题。
'inviteHandler' is deprecated: first deprecated in iOS 7.0
[GKMatchmaker sharedMatchmaker].inviteHandler 在 iOS 7 中已弃用,但 GameKit 指南仍然说要这样设置。有谁知道我们应该为 iOS 7 实时游戏邀请使用什么?有几个侦听器类的新类/方法,但没有一个专门解决我所看到的这个问题。
'inviteHandler' is deprecated: first deprecated in iOS 7.0
所以我开始对此感到非常沮丧(几乎神奇的是,昨天我的控制台中开始出现弃用警告)。Apple 似乎没有说明如何将对象设置为实现新 GKLocalPlayerListener 协议的对象。
这就是我的做法。就在验证我的本地播放器之后,我将实现 GKLocalPlayerListener 协议的对象(在本例中为 self)注册为侦听器。我测试了我的应用程序如何响应相同的 Game Center 事件,并做出了相应的响应。我相信这是正确的做法,尽管我仍在质疑哪个地方最适合注册听众。我认为在播放器经过身份验证后这样做是有道理的,但它可能比这更微妙。
NSLog(@"Authenticating local user...");
__weak GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
localPlayer.authenticateHandler =
^(UIViewController *viewController,
NSError *error) {
[self setLastError:error];
if (localPlayer.isAuthenticated) {
[localPlayer registerListener:self];
} else if(viewController) {
[self presentViewController:viewController];
} else {
}
};
您还希望避免多次注册侦听器。这有点像为本地通知注册观察者。如果您不止一次这样做,您的侦听器方法最终会被多次调用。
我相信取代的方法:
-(void)handleInviteFromGameCenter:(NSArray *)playersToInvite;
是否如下:
-(void)player:(GKPlayer *)player didRequestMatchWithPlayers:(NSArray *)playerIDsToInvite;
从阅读文档中,提到了在调用它时创建一个 GKMatchMakerViewController (或类似的更定制的东西)。我知道这就是我在以前版本的应用程序中所做的事情,所以不会那么遥远。该方法的结构也非常相似。
更多的测试将确认这是否确实是接近新协议的正确方法,但到目前为止它似乎是正确的。我会继续这样做,直到另有指示。
看起来预期的替换是GKInviteEventListener
协议。您可以在 GKLocalPlayer.h 中看到对它的引用;该GKLocalPlayerListener
协议对其进行了扩展。
但是,关于此协议的文档有限(您可以在 Xcode 5 的文档窗口中搜索它,但我在网络上没有看到它)。
鉴于缺乏文档,现在继续使用已弃用的方法可能是最安全的。无论如何,您都需要在 iOS6 上继续使用它。
如果您正在运行 a GKTurnBasedMatch
,这是一种特殊情况。对于 a GKTurnBasedMatch
,邀请被视为回合事件,并由GKLocalPlayerListener
函数中的注册者接收:
player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, didBecomeActive: Bool)
我正在尝试运行GKTurnBasedMatch
,我花了几天时间才找到这些信息,所以我希望通过在此处发布此信息来帮助其他人。