游戏中心断线检查漏洞

Game Center disconnection check flaw

我有一个游戏中心实时多人游戏应用程序,在检查玩家何时断开连接时存在漏洞利用。我有这个代码:

func match(match: GKMatch!, player player: GKPlayer!, didChangeConnectionState state: GKPlayerConnectionState){
    println("called")
    if(state==GKPlayerConnectionState.StateConnected){
        println("connected")
    }
    if(state==GKPlayerConnectionState.StateDisconnected){
        println("Disconnected")
    }
    if(state==GKPlayerConnectionState.StateUnknown){
        println("unknown")
    }
    println(player.displayName)
    if(state == GKPlayerConnectionState.StateDisconnected){
        if(player.playerID == GKLocalPlayer.localPlayer().playerID){
            Label.text = "You Disconnected"
        }
        else{
            Label.text = "Your opponent disconnected"
        }
    }


}

发生的情况是,如果一名玩家进入控制中心并打开飞行模式,则 returns 对手已断开连接。有什么办法可以解决这个问题吗?

任何反馈将不胜感激

没关系,我以为调出控制中心没有调用app delegate applicationDidEnterBackground函数,应用在控制中心的时候还是运行,结果是控制中心把它放到了处于非活动状态,所以我能够处理它

我使用 iOS 可达性代码解决了这个问题。

didChangeConnectionState 只为远程连接调用。如果你断开连接(要么进入飞行模式,要么合法地失去 WIFI 连接),那么与游戏的连接就会断开,didChangeConnectionState 被称为传递给对手玩家。

使用可访问性代码,您可以查询此回调触发时您是否处于离线状态。然后你可以知道回调正在触发是因为你离线,而不是对手失去连接。

一个小问题是,有时 Reachability 调用需要一小段时间来评估,从而允许 didChangeConnectionState 调用先调用 return。为此,请在 didChangeConnectionState 呼叫触发后等待几秒钟,然后检查您的可达性结果。

史蒂夫