GameKit GKMatchMaker inviteHandler deprecated in iOS7, what is the replacement?

房东的猫 提交于 2019-12-12 15:13:27

问题


[GKMatchmaker sharedMatchmaker].inviteHandler is deprecated in iOS 7, yet the GameKit guides still say to set it up that way. Does anyone know what we're supposed to be using for iOS 7 real time game invites? There are new classes / methods for several listener classes, but none address this specifically that I have seen.

'inviteHandler' is deprecated: first deprecated in iOS 7.0

回答1:


It looks like the intended replacement is the GKInviteEventListener protocol. You can see a reference to it in GKLocalPlayer.h; the GKLocalPlayerListener protocol extends it.

However, there's limited documentation on this protocol (you can search for it in the documentation window of Xcode 5, but I don't see it on the web).

Given the lack of documentation, it's probably safest to continue using the deprecated method for now. You'll need to continue using it anyway for iOS6.




回答2:


So I was starting to get really frustrated with this (almost magically, the deprecation warnings started showing up in my console yesterday). Apple doesn't seem to spell out how an object can be set as the thing that implements the new GKLocalPlayerListener protocol.

Here's how I did it. Just after authenticating my local player, I registered the object that implements the GKLocalPlayerListener protocol (in this case self) as the Listener. I tested how my app responds to the same Game Center events, and it has responded accordingly. I believe this is the proper way to do it, although I am still questioning which place is the best for registering the listener. I believe it makes sense to do it after the player is authenticated, but it may be more subtle than that.

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 {


    }
};

You also want to avoid registering the listener more than once. It's kinda like registering an observer for a local notification. If you do it more than once, your listener methods end up getting called more than once.

I believe the method that replaces:

-(void)handleInviteFromGameCenter:(NSArray *)playersToInvite;

Is the following:

-(void)player:(GKPlayer *)player didRequestMatchWithPlayers:(NSArray *)playerIDsToInvite;

From reading the documentation, there is mention of creating a GKMatchMakerViewController (or something similar that's a little more bespoke) when this is called. I know that's what I was doing in previous versions of my app, so it can't be that far off. The structure of the method is also quite similar.

More testing will confirm if this is indeed the right way of approaching the new protocol, but so far it seems to be correct. I'm gonna continue with this until directed otherwise.




回答3:


If you're running a GKTurnBasedMatch, it's a special case. For a GKTurnBasedMatch, invites are considered turn events, and are recieved by the registered GKLocalPlayerListener in the function:

player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, didBecomeActive: Bool)

I'm trying to run a GKTurnBasedMatch and it took me days to find this information, so I hope I've helped someone else out by posting this here.



来源:https://stackoverflow.com/questions/18904588/gamekit-gkmatchmaker-invitehandler-deprecated-in-ios7-what-is-the-replacement

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!