так что я занимался этим уже несколько недель и так и не нашел ответа нигде в сети.В комментариях к исходному коду, в различной документации и в различных источниках утверждается, что функция ReceivedExchangeReplies(GKPlayer, GKTurnBasedExchangeReply[], GKTurnBasedExchange, GKTurnBasedMatch)
должна вызываться, когда все Получатели обмена отвечают или получают тайм-аут.Предполагается, что он вызывается как для инициатора обмена, так и для текущего участника.
Но в моем приложении он вызывается только для инициатора обмена, а не для владельца.Я не могу приступить к своему кодированию, так как текущий держатель должен объединить и разрешить обмены, как только они будут завершены.Но он не может этого сделать, поскольку никогда не получает уведомления о завершении обмена.
AuthenticationHandler работает нормально и не имеет значения для проблемы:
func authenticateLocalPlayer() {
let localPlayer: GKLocalPlayer = GKLocalPlayer.localPlayer()
localPlayer.authenticateHandler = {(ViewController, error) -> Void in
if((ViewController) != nil) {
self.underlyingViewController.present(ViewController!, animated: true, completion: nil)
} else if (localPlayer.isAuthenticated) {
self.gamecenterEnabled = true
localPlayer.unregisterAllListeners()
localPlayer.register(self)
self.findBattleMatch()
} else {
self.gamecenterEnabled = false
print(error as Any)
}
}
}
Вот как отправляется Запрос обмена :
currentMatch.sendExchange(to: [nextParticipant], data: GameState.encodeStruct(structToEncode: structToSend), localizableMessageKey: messageKey, arguments: ["X","Y"], timeout: TimeInterval(timeOutDebug), completionHandler: {(exchangeReq: GKTurnBasedExchange?,error: Error?) -> Void in
if(error == nil ) {
print("Operation successfull")
} else {
print(error as Any)
}
})
Ответ Ответ :
exchange.reply(withLocalizableMessageKey: exchange.message! , arguments: ["XY","Y"], data: GameState.encodeStruct(structToEncode: exchangeReply), completionHandler: {(error: Error?) -> Void in
if(error == nil ) {
print("ExchangeReply sent successfully")
} else {
print(error as Any)
}
})
После этого по завершении обмена, следующая переопределенная функция должна вызываться автоматически .Для обоих для инициатор обмена и для текущий поворотный элемент :
func player(_ player: GKPlayer, receivedExchangeReplies replies: [GKTurnBasedExchangeReply], forCompletedExchange exchange: GKTurnBasedExchange, for match: GKTurnBasedMatch){
print("Exchange was completed, turnholder and Exchange-initiator should act on that in following code.")
...code...
}
Это Swift-версия вышеупомянутой функции ObjectiveC.
Теперь проблема Как сказано, что вышеуказанная функция вызывается только для инициатор обмена, в то время как не вызывается для текущего держателя (как и должно быть).Предполагается, что текущий получатель данных объединит изменения, внесенные биржами, в данные сохраненной игры.Его не уведомляют, как будто он должен оставить проблему и проблему, потому что он не может действовать без уведомления.Я мог бы сделать так, чтобы он был уведомлен вручную другим дополнительным обменом (это обходной путь, которым я сейчас пользуюсь), но это как-то не относится к делу, так как ему пришлось бы слепо объединить новый обмен без какой-либо уверенности в его завершении.
Первые 3 шага работают нормально, так как я вижу, что инициатор обмена уведомляется.Единственная проблема заключается в том, что четвертая функция не вызывается автоматически, как описано в Документациях и руководствах.
Одна из моих последних интерпретаций заключалась в том, что обмен завершается слишком быстро, и слушатель даже не осознает, что он когда-либо был активен (обмен получен ответом)немедленно на получение);но это просто дикое предположение.Даже если бы я хотел ... что бы я ни делал, чтобы отложить ответ на обмен (например, сохранение ссылки на обмен, использование DispatchQueue
для отложенного вызова функции или аналогичного), это приведет либо к тому, что обмен не получится, либо к ошибкам связи(сообщение было отправлено из-за другой ошибки прокси-сервера).
В основном мне интересно, действительно ли получатель должен получать уведомления при вызове вышеуказанной функции или если он мог быть изменен.
Я быочень ценю помощь здесь, я был в этом в течение нескольких недель и нигде не получил.Все остальное работает нормально.Я использую последнюю версию Swift с самым последним подходом использования GKLocalPlayer вместо прямой реализации Listener (как это рекомендуется везде).
С уважением, Skeltek