我使用 GameKit 和 GKMatch 在两个 iOS 设备之间建立连接以进行同步游戏。当一名玩家进入后台时,连接将断开。我怎样才能避免这种行为?当一位用户确实将应用程序暂停到后台时,是否可以通过 GKMatch 保持连接?
2 回答
根据苹果的文档:
一旦您的游戏移到后台,本地玩家对象的已验证属性的值就会变为无效,直到您的游戏移回前台。在 Game Kit 重新对玩家进行身份验证并调用您的身份验证处理程序之前,您无法读取该值以确定玩家是否仍然通过身份验证。在调用完成处理程序之前,您的游戏必须表现得好像没有经过身份验证的玩家一样。调用处理程序后,已验证属性中存储的值将再次有效。
资料来源:Game Center 编程指南,第 1 页。39 .
除非您的应用程序使用 VOIP 或特殊情况适用,否则您不应该真正在后台保持网络连接打开。(如果您有兴趣,请查看这个 SO question以了解黑客式的解决方法)。由于您的播放器身份验证在进入后台时失效,另一台设备(如果它确实设法从后台应用程序接收网络数据)将不会(可靠地)知道哪个 GKPlayer 发送了信息。
因此,虽然 Apple 没有明确表示,但所有 Game Center 功能通常应在应用程序进入后台时取消,并在重新启动时重新验证玩家身份后恢复。
作为旁注,当应用程序退出后台时(通常,取决于后台任务)被视为“有资格暂停”。这是多任务执行存在此类限制的原因之一 - 您的应用程序可能随时被终止以释放内存,而您真的不希望在发生这种情况时进行繁重的数据传输!如果您想了解有关网络和多任务处理的更多信息,请参阅TN227 。
编辑:另一种方法:
虽然在后台运行应用程序时无法保持 GKMatch 处于活动状态,但模拟此行为的另一种方法是将游戏状态保存到您自己的服务器。要求用户在离开游戏之前与一些 UI 交互(可能按下按钮),这会将当前游戏状态保存到您自己的服务器并通知其他玩家您即将离开游戏。重新启动后,查询您的服务器以查看您是否有任何已保存的游戏,如果有,则加载游戏状态并向其他玩家发送通知。这并不严格维持相同的游戏,而是一种近似您所追求的行为的方法。
这是不可能的
当一名玩家进入后台时,您可以这样做
在这种情况下 - (void) applicationDidEnterBackground:(UIApplication *)application { } 在第一个玩家进入后台的数据包数据中将消息发送给第二个玩家
然后在 - (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context; { } 当数据得到停止您的应用程序并弹出到上一个视图时