MCNearbyServiceBrowserDelegate foundPeer сообщает о другом PeerId для данного устройства рекламодателя при отключении, а затем снова включает просмотр устройства

Вопрос о многопользовательском подключении iOS...

Мое приложение использует MCNearbyServiceBrowser и MCNearbyServiceAdvertiser (но не одновременно на данном устройстве).

Мой MCNearbyServiceAdvertiser всегда использует один и тот же PeerId... Я храню его в NSUserDefaults в соответствии с рекомендациями сеанса WWDC 2014 года по этому поводу.

Когда другое устройство просматривает службы, просматривающее устройство получает обратный вызов делегата браузера foundPeer, как и ожидалось.

Однако, если на устройстве просмотра я выхожу из своего приложения (например, с помощью нажатия кнопки «Домой»), а затем переключаюсь обратно в свое приложение, я получаю еще один вызов foundPeer для рекламного устройства, но на этот раз PeerId отличается!

Это кажется странным, потому что мой рекламодатель всегда использует один и тот же PeerId.

Любые идеи, почему это может происходить? Непредвиденный?

(Я планировал посмотреть, есть ли недавно найденное рекламное устройство с заданным PeerId в моем табличном представлении рекламодателей, но вышеупомянутая проблема как бы портит этот план.)

Спасибо.

-Аллан


person lagouyn    schedule 30.06.2014    source источник
comment
Как проверить, отличается ли peerID? Отличается ли peerID.displayName?   -  person Peter Fennema    schedule 02.07.2014
comment
В браузере:foundPeer:withDiscoveryInfo: я получаю peerID найденного рекламодателя. Я держу массив NSDictionary... каждый словарь включает в себя peerID найденного рекламодателя. Если вызывается browser:foundPeer:withDiscoveryInfo: с идентификатором peerID, который уже есть в моей таблице, я его игнорирую. Но если я нажму кнопку «Домой» на своем устройстве для просмотра, а затем вернусь к своему приложению, браузер:foundPeer:withDiscoveryInfo: будет повторно вызван для того же рекламного устройства, но параметр peerID будет иметь другое значение, чем раньше. Имя однорангового узла одинаковое, но два устройства могут иметь одно и то же имя однорангового узла.   -  person lagouyn    schedule 03.07.2014
comment
Как вы создаете значения PeerID displayName? Соответствует ли таинственный PeerID вашему формату? MPC имеет привычку обнаруживать устройства, которые давно ушли в прошлое, особенно в симуляторе.   -  person ChrisH    schedule 03.07.2014


Ответы (3)


Из документации Apple: «Структура Multipeer Connectivity отвечает за создание одноранговых объектов, представляющих другие устройства».

После нажатия кнопки «Домой» и возврата к приложению фреймворк создал новый объект PeerID для представления рекламного устройства. Это другой объект, чем предыдущий, хотя он представляет собой то же рекламное устройство. Таким образом, вы не можете полагаться на равенство объектов PeerID.

person Peter Fennema    schedule 03.07.2014
comment
Спасибо. Поэтому я думаю, что мой вопрос заключается в следующем: после выхода из моего приложения на устройстве просмотра, а затем обратного переключения в мое приложение, какие действия я должен предпринять, чтобы показать обновленный/правильный список рекламодателей? Я показываю их в UITableView, поддерживаемом источником данных, состоящим из peerID. Должен ли я удалить все объекты в источнике данных моей таблицы и ожидать, что MPC повторно отправит browser:foundPeer:withDiscoveryInfo: для всех найденных рекламодателей? - person lagouyn; 03.07.2014
comment
Добавлю еще немного к моему последнему вопросу... Мне также интересно, если после отключения, а затем обратного включения устройства для рекламы или просмотра, мне нужно аннулировать собственный MCNearbyServiceAdvertiser* устройства или MCNearbyServiceBrowser* ? В принципе, делает ли отключение, а затем обратное переключение недействительными найденные пиры, а также ваш собственный пир? (Я не обнаружил, что мне это нужно, но, возможно, мне повезет.) - person lagouyn; 03.07.2014
comment
И еще немного… Есть ли у Apple эталонное приложение, демонстрирующее правильное использование MCNearbyServiceAdvertiser и MCNearbyServiceBrowser? (Я вижу, что у них есть пример приложения, использующего MCBrowserViewController и MCAdvertiserAssistant.) - person lagouyn; 03.07.2014

Чтобы правильно определить одноранговый узел, я предлагаю вам создать строку NSUUID, заархивировать ее на диск и использовать повторно. Когда вы инициализируете объект McPeerID, отображаемое имя, которое вы должны передать, будет displayName+UUID. Используйте отображаемое имя для элементов пользовательского интерфейса и UUID для идентификации однорангового узла.

Я надеюсь, что это помогает.

person dev gr    schedule 06.12.2014

Вы не получите один и тот же идентификатор McPeerID, если создадите два с одним и тем же отображаемым именем. Это гарантирует уникальность при возникновении конфликта имен. Обычно в качестве отображаемого имени используется имя устройства. Не все персонализируют свое.

Если вы хотите, чтобы вас узнавали и узнавали ранее подключенные одноранговые узлы, вы должны сохранить и получить фактический идентификатор McPeerID.

Чтобы понять, что я имею в виду, вставьте следующий код в игровую площадку и запустите его.

import MultipeerConnectivity

let hostName = "TestPlaygroundHostName"

let firstPeerID = MCPeerID(displayName: hostName)
let secondPeerID = MCPeerID(displayName: hostName)

firstPeerID.hashValue == secondPeerID.hashValue
person Bob Wakefield    schedule 06.04.2019