在我的iOS回合制比赛中,我尝试接收通知并获取
public func player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, didBecomeActive: Bool)
被称为,但没有成功。
我将我的视图模型注册到本地播放器
GKLocalPlayer.localPlayer().register(self)
我希望在其他玩家执行后开火
func endTurn(withNextParticipants nextParticipants: [GKTurnBasedParticipant], turnTimeout timeout: TimeInterval, match matchData: Data, completionHandler: ((Error?) -> Swift.Void)? = nil)
但没有成功。
如果我强制重新加载matchData,那么我将获得刚刚提交的第二个玩家的数据。所以endTurn工作正常。
我做错了吗?
更新: 所以我创建了一个新项目,复制了我的所有文件, 仅在功能中启用了Game Center。
当开发它完美时,我连接了两个设备(具有不同的苹果ID)。通知正在运行,Turnbasedlistener正在解雇。
我一发布内部测试就停止了工作!
答案 0 :(得分:1)
我有类似的问题。我的解决方案是在等待轮到我时手动重新检查我的状态。
首先,我定义了全局变量var gcBugTimer: Timer
在endTurn(withNextParticipants:turnTimeOut:match:completionHandler:)
完成处理程序中:
let interval = 5.0
self.gcBugTimer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(self.isMatchActive), userInfo: nil, repeats: true)
self.gcBugTimer.tolerance = 1.0
如果玩家在转弯中与新的比赛和其他玩家结婚,则应调用以上代码。
然后是计时器方法:
func isMatchActive() {
// currentMatch - global variable contains information about current match
GKTurnBasedMatch.load(withID: currentMatch.matchID!) { (match, error) in
if match != nil {
let participant = match?.currentParticipant
let localPlayer = GKLocalPlayer.localPlayer()
if localPlayer.playerID == participant?.player?.playerID {
self.player(localPlayer, receivedTurnEventFor: match!, didBecomeActive: false)
}
} else {
print(error?.localizedDescription ?? "")
}
}
}
我在player(_:receivedTurnEventFor:didBecomeActive)
的最开头添加了以下代码:
if gcBugTimer != nil && gcBugTimer.isValid {
gcBugTimer.invalidate()
}
答案 1 :(得分:0)
最终对我有用的是在实际设备上进行测试,而不是在模拟器中进行测试。 receiveTurnEvents函数似乎在模拟器中不起作用。
Grigory的工作非常适合使用模拟器进行测试。