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 и смежные темы.

Другие вопросы по тегам