Я создаю игру, в которой 2 устройства iOS должны подключаться через многопользовательский режим. Каждое устройство одновременно рекламирует и просматривает, и как только соединение установлено, оно скрывает все элементы пользовательского интерфейса. Это уже работает.
Проблема, с которой я столкнулся, заключается в том, что устройство отображается в собственном браузере, и на самом деле можно создавать петлевые соединения. Есть ли какой-либо параметр свойства или конструктора, который мне нужно изменить, чтобы этого не произошло?
Чтобы уточнить, вот как это выглядит на моем iPad: «iPad Джонатана» - это устройство, с которого был сделан снимок экрана ...
Я использую плагин Unity от U3DXT, который предоставляет встроенные функции iOS на C #, но до сих пор большая часть информации могла быть напрямую переведена из материала xcode в плагин C #. Вот код, который я использую:
public static void ShowBrowser(string displayName, string serviceType)
{
_peerId = new MCPeerID(displayName);
_session = new MCSession(_peerId);
_browserVC = new MCBrowserViewController(serviceType, _session);
_browserVC.Delegate = BrowserViewControllerDelegate.instance;
_session.Delegate = SessionDelegate.instance;
UIApplication.deviceRootViewController.PresentViewController(_browserVC, false, null);
}
public static void StartAdvertiserAssistant(string displayName, string serviceType)
{
_peerId = new MCPeerID(displayName);
_session = new MCSession(_peerId);
_advertiserAssistant = new MCAdvertiserAssistant(serviceType, null, _session);
_advertiserAssistant.Start();
_session.Delegate = SessionDelegate.instance;
_advertiserAssistant.Delegate = AdvertiserAssistantDelegate.instance;
}
2 ответа
На самом деле я что-то делал не так. Посмотрев видеоролики WWDC о Multipeer на веб-сайте Apple, я понял, что мне нужно создавать экземпляр однорангового узла только один раз. Поэтому я создал для этого метод инициализации. Локальное устройство отображалось в списке, потому что у него был другой peerID.
private static void InitPeerAndSession(string displayName)
{
if(_peerId == null)
{
_peerId = new MCPeerID(displayName);
_session = new MCSession(_peerId);
}
}
public static void ShowBrowser(string displayName, string serviceType)
{
InitPeerAndSession(displayName);
_browserVC = new MCBrowserViewController(serviceType, _session);
_browserVC.Delegate = BrowserViewControllerDelegate.instance;
_session.Delegate = SessionDelegate.instance;
UIApplication.deviceRootViewController.PresentViewController(_browserVC, false, null);
}
public static void StartAdvertiserAssistant(string displayName, string serviceType)
{
InitPeerAndSession(displayName);
_advertiserAssistant = new MCAdvertiserAssistant(serviceType, null, _session);
_advertiserAssistant.Start();
_session.Delegate = SessionDelegate.instance;
_advertiserAssistant.Delegate = AdvertiserAssistantDelegate.instance;
}
Когда устройство рекламирует и просматривает один и тот же тип услуг, они будут слышать себя так, как вы описываете. Я считаю, что это невозможно предотвратить.
Чтобы обойти проблему, вместо использования MCBrowserViewController, который будет отображать всех одноранговых узлов, которые он слышит, вы можете использовать MCNearbyServiceBrowser. Это позволяет вашему приложению программно искать устройства поблизости. Затем вы можете отобразить одноранговые узлы в своем собственном UITableView, имитируя макет MCBrowserViewController, если хотите.
Преимущество заключается в том, что, когда вы слышите ближайшего однорангового узла, вы можете игнорировать его, если имя однорангового узла совпадает с вашим собственным именем, и, таким образом, не отображать его в таблице. Например:
// Found a nearby advertising peer
- (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info {
NSLog(@"Found a nearby advertising peer %@", peerID);
if ([peerID.displayName isEqualToString:self.thisPeer.displayName]) {
NSLog(@"Ignoring nearby advertising peer as it has my display name");
} else {
.....
}
}
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.