Вопрос

Я пытаюсь реализовать P2P-приложение.То, что я пытаюсь сделать, это передать данные пользовательского класса NSObject между устройствами.Я не могу определить, когда метод "receivedData" вызывается GKSession.

Вот что я сделал

  1. Обычное подключение и отображение диалогового окна с одноранговыми узлами

  2. Когда приложение получает изменение состояния для однорангового узла и состояние подключено, я отправляю данные всем одноранговым узлам (в идеале это должно вызываться, когда каждый одноранговый узел принимает соединение), используя методы NSCoding

  3. В receivedData я декодирую NSData и возвращаю экземпляр NSObject

Проблема заключается в том, что сессия: одноранговый узел:didChangeState: метод не вызывается на обоих устройствах.Он просто вызывается на устройстве, которое нажало кнопку "Подключиться" в предупреждении PeerPicker.

Вопросы

  1. Когда вызывается didChangeState и для кого?Разве это не должно вызываться для каждого однорангового узла, когда они подключены?

  2. Когда будут получены данные:метод вызван и для кого?Вызывается ли он для подтверждения получения сообщения (рукопожатие) или просто для передачи данных, отправленных другими одноранговыми узлами?

Спасибо за любую помощь.

Это было полезно?

Решение

Думайте об этом скорее как о "master / slave", а не как о "peer-to-peer". Предположительно, обе стороны были настроены с помощью GameKit и назначили своих делегатов.Та сторона, которая инициирует соединение, получает уведомление через GKPeerStateConnected укажите значение изменения, что получатель принял приглашение и установлено соединение, чтобы он мог начать отправку материала.

Принимающая сторона, однако, получает свое первое уведомление о том, что кто-то хочет поговорить с ней через didReceiveConnectionRequestFromPeer метод делегирования.Он сохраняет сеанс для последующего использования, затем разворачивается и вызывает acceptConnectionFromPeer принять это.С этого момента он получает все, что отправляется через receiveData способ.

Лучший способ сделать это - иметь небольшую государственную машину, которая управляет тем, в каком состоянии находится каждая сторона.Отправитель отправляет только тогда, когда он получил GKPeerStateConnected событие.Приемник вставляется в connected укажите, как только он примет запрос на подключение, чтобы он мог выполнить любую настройку, которую ему необходимо выполнить, прежде чем он начнет получать данные.

Поскольку сетевая абстракция является GKSession затем получатель может развернуться и использовать тот же экземпляр сеанса, в который он попал didReceiveConnectionRequestFromPeer и используйте его, чтобы написать ответ отправителю (у которого должен быть свой собственный receiveData метод, вызываемый с ответами от получателя).

Единственное, что следует иметь в виду, это то, что существует неявное ограничение на размер данных в буфере, который вы можете отправлять через GameKit.Возможно, вы захотите поэкспериментировать, чтобы выяснить, что это такое для вашей системы (я получаю что-то между 5K и 10K - по какой-то причине это варьируется).Возможно, вам захочется иметь код для разделения ваших NSData на фрагменты и управления упаковкой / депакетизацией данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top