iPhone - как передаются данные в P2P
-
23-08-2019 - |
Вопрос
Я пытаюсь реализовать P2P-приложение.То, что я пытаюсь сделать, это передать данные пользовательского класса NSObject между устройствами.Я не могу определить, когда метод "receivedData" вызывается GKSession.
Вот что я сделал
Обычное подключение и отображение диалогового окна с одноранговыми узлами
Когда приложение получает изменение состояния для однорангового узла и состояние подключено, я отправляю данные всем одноранговым узлам (в идеале это должно вызываться, когда каждый одноранговый узел принимает соединение), используя методы NSCoding
В receivedData я декодирую NSData и возвращаю экземпляр NSObject
Проблема заключается в том, что сессия: одноранговый узел:didChangeState: метод не вызывается на обоих устройствах.Он просто вызывается на устройстве, которое нажало кнопку "Подключиться" в предупреждении PeerPicker.
Вопросы
Когда вызывается didChangeState и для кого?Разве это не должно вызываться для каждого однорангового узла, когда они подключены?
Когда будут получены данные:метод вызван и для кого?Вызывается ли он для подтверждения получения сообщения (рукопожатие) или просто для передачи данных, отправленных другими одноранговыми узлами?
Спасибо за любую помощь.
Решение
Думайте об этом скорее как о "master / slave", а не как о "peer-to-peer". Предположительно, обе стороны были настроены с помощью GameKit и назначили своих делегатов.Та сторона, которая инициирует соединение, получает уведомление через GKPeerStateConnected
укажите значение изменения, что получатель принял приглашение и установлено соединение, чтобы он мог начать отправку материала.
Принимающая сторона, однако, получает свое первое уведомление о том, что кто-то хочет поговорить с ней через didReceiveConnectionRequestFromPeer
метод делегирования.Он сохраняет сеанс для последующего использования, затем разворачивается и вызывает acceptConnectionFromPeer
принять это.С этого момента он получает все, что отправляется через receiveData
способ.
Лучший способ сделать это - иметь небольшую государственную машину, которая управляет тем, в каком состоянии находится каждая сторона.Отправитель отправляет только тогда, когда он получил GKPeerStateConnected
событие.Приемник вставляется в connected
укажите, как только он примет запрос на подключение, чтобы он мог выполнить любую настройку, которую ему необходимо выполнить, прежде чем он начнет получать данные.
Поскольку сетевая абстракция является GKSession
затем получатель может развернуться и использовать тот же экземпляр сеанса, в который он попал didReceiveConnectionRequestFromPeer
и используйте его, чтобы написать ответ отправителю (у которого должен быть свой собственный receiveData
метод, вызываемый с ответами от получателя).
Единственное, что следует иметь в виду, это то, что существует неявное ограничение на размер данных в буфере, который вы можете отправлять через GameKit.Возможно, вы захотите поэкспериментировать, чтобы выяснить, что это такое для вашей системы (я получаю что-то между 5K и 10K - по какой-то причине это варьируется).Возможно, вам захочется иметь код для разделения ваших NSData на фрагменты и управления упаковкой / депакетизацией данных.