Я создаю игру, в которой 2 устройства iOS должны подключаться через многопользовательский режим. Каждое устройство одновременно рекламирует и просматривает, и как только соединение установлено, оно скрывает все элементы пользовательского интерфейса. Это уже работает.

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

Чтобы уточнить, вот как это выглядит на моем iPad: «iPad Джонатана» - это устройство, с которого был сделан снимок экрана ...

enter image description here

Я использую плагин 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;
    }
0
joon 14 Авг 2014 в 21:18

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;
    }
0
joon 15 Авг 2014 в 14:59

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

Чтобы обойти проблему, вместо использования 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 {
    .....
    }
}
1
Keith Coughtrey 15 Авг 2014 в 07:36
Поскольку BrowserViewController кажется просто расширенным видом ViewController (я новичок в этом), можно ли / целесообразно зайти туда и удалить запись после того, как она была добавлена?
 – 
joon
15 Авг 2014 в 12:56