iOS转向匹配,推送通知无效,GKTurnBasedEventListener函数未调用

时间:2017-06-17 21:01:52

标签: ios swift gamekit gkturnbasedmatch

在我的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正在解雇。

我一发布内部测试就停止了工作!

2 个答案:

答案 0 :(得分:1)

我有类似的问题。我的解决方案是在等待轮到我时手动重新检查我的状态。 首先,我定义了全局变量var gcBugTimer: Timer

endTurn(withNextParticipants:turnTimeOut:match:completionHan‌​dler:)完成处理程序中:

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的工作非常适合使用模拟器进行测试。