Gamekit在进入后台时继续进行会话

时间:2012-04-27 14:43:40

标签: iphone ios networking gamekit

我建立了两个iOS设备之间的连接,使用GameKit和GKMatch进行同步游戏。当一个玩家进入后台时,连接将断开连接。我该如何避免这种行为?当一个用户将应用程序暂停到后台时,是否可以通过GKMatch保持连接?

2 个答案:

答案 0 :(得分:2)

根据Apple的文档:

  

当您的游戏移动到后台时,本地玩家对象的经过身份验证的属性的值将变为并且在游戏移回前景之前保持无效。在Game Kit重新验证播放器并调用您的身份验证处理程序之前,您无法读取该值以确定播放器是否仍处于身份验证状态。在调用完成处理程序之前,您的游戏必须表现得好像没有经过身份验证的玩家。调用处理程序后,存储在authenticated属性中的值将再次有效。

来源:Game Center Programming Guide, pg. 39

除非您的应用程序使用VOIP或特殊情况适用,否则您不应该在后台打开网络连接。 (如果您有兴趣,请查看this SO question了解黑客的方式。 由于您的玩家身份验证在进入后台时无效,另一台设备(如果它设法从后台应用程序接收网络数据)将无法(可靠地)知道哪个GKPlayer发送了该信息。

因此,虽然Apple没有明确表示,但是当应用程序进入后台时,通常应取消所有Game Center功能,并在重新启动后重新验证播放器后恢复。

作为附注,当应用程序撤回到后台时(通常,取决于后台任务)被视为“有资格暂停”。这是多任务处理执行此类限制的一个原因 - 您的应用程序可能随时被释放以释放内存,并且您真的不希望在发生这种情况时进行重型数据传输! 如果您想了解有关网络和多任务处理的更多信息,请参阅TN227

编辑:另一种方法:

虽然在后台运行应用程序时无法保持GKMatch处于活动状态,但另一种模拟此行为的方法是将游戏状态保存到您自己的服务器。在用户离开游戏之前要求用户与某些UI(可能按下按钮)进行交互,这会将当前游戏状态保存到您自己的服务器并通知其他玩家您即将离开游戏。重新启动后,查询您的服务器以查看您是否有任何已保存的游戏,如果有,请加载游戏状态并向其他玩家发送通知。这不是严格保持相同的游戏,而是一种近似你所追求的行为的方式。

答案 1 :(得分:1)

这是不可能的

当一名玩家进入后台时,你可以这样做

在这个事件中 - (void)applicationDidEnterBackground:(UIApplication *)application {}  将消息发送给第一个玩家进入后台的数据包数据中的第二个玩家

然后在 - (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context; { } 当perticuler数据停止你的应用程序并弹出到上一个视图