GameKit, GKGameSession, как добавить игроков в сессию и отправить данные?
Я создал сессию, поделился ею с другим игроком, и теперь я хочу начать игру. Я вижу сеанс с двумя игроками на обоих устройствах. Итак, похоже, что мы готовы к игре, но мне нужно изменить статус подключения перед игрой, и я могу сделать это на обоих устройствах.
Но... когда я делаю это на устройстве A, я вижу, что пользователь A подключен, а пользователь B - нет. И после этого, когда я повторяю процесс на устройстве B, я вижу обратную ситуацию. B подключен, а A нет.
Вот мой код, который подключает плеер и отправляет данные:
session.setConnectionState(.connected) { (error) in
if let err = error {
assertionFailure(err.localizedDescription)
}
else {
print("NC:",session.players(with: .notConnected))
print(" C:",session.players(with: .connected))
let m = MoveTransfer(move:1) // test struct to send/receive data
session.send(m.data(), with: .reliable) { (error) in
if let err = error {
assertionFailure(err.localizedDescription)
}
}
}
}
Я получаю ошибку:
The requested operation could not be completed because there are no recipients connected to the session
Кстати, я не могу изменить состояние подключения на симуляторе (iCloud вошел в систему).
Я забыл упомянуть, что я работаю над пошаговой игрой.
редактировать
Попробовал снова и теперь после нескольких итераций я получил это:
У меня оба игрока подключены к сессии. Но отправка данных по-прежнему не работает.
Вот вывод консоли:
NC: [] // not connected array and connected array below
C: [<GKCloudPlayer: 0x17402e700>, id: playerID1, name: Player1,<GKCloudPlayer: 0x17402e900>, id: playerID2, name: Player2]
fatal error: The requested operation could not be completed because there are no recipients connected to the session.
Получил это на двух реальных устройствах.
1 ответ
Я смог отправить данные и получить их на другом устройстве. Я использовал функцию loadSessions для загрузки всего сеанса (я думаю, что loadSession по id тоже подойдет). Я сделал следующее, D1 - это устройство 1, а D2 - устройство 2:
1. D1: load all sessions and set player state to connected
2. D2: load all sessions and set player state to connected
3. D1: load all sessions again and set player state to connected
4. D1 || D2: send data
5. D2 || D1: data 256 bytes from player: <GKCloudPlayer: 0x1c022b380>, id: playerID, name: (null)
Хотя я не мог передавать данные туда и обратно на обоих устройствах, поскольку, если мы добавим шаг 6., который отправляет данные с устройства, которое только что получило их, мы получим ошибку: The requested operation could not be completed because there are no recipients connected to the session
,
Я не уверен, в чем причина этого, но я прекращаю свои усилия на этом этапе, так как теперь я думаю, что мне не нужно подключаться к сессии, чтобы играть в пошаговую игру.
Я нашел этот "новый" iOS 10 API заброшенным. Apple и разработчики, следовательно. Если вы один из тех, кто все еще пытается использовать его, напишите мне в своем твиттере (ссылка в моей биографии), если вы хотите обсудить GKGameSession и смежные темы.