Компания
46,28
рейтинг
13 ноября 2013 в 16:28

Разработка → Multipeer connectivity framework в iOS7 перевод

Multipeer Connectivity Framework передает текстовые сообщения, потоки и файлы между iOS устройствами, находящимися рядом. Для этого используются WiFi сети, прямое WiFI соединение и Bluetooth. То есть интернет не требуется.

Фреймворк позволяет взаимодействовать устройствам из разных сетей, например у смартфона №2 включен только WiFi, а у №3 только Bluetooth. Если в радиусе доступности этих устройств будет третий смартфон с включенным Wifi и Bluetooth, смартфоны №2 и №3 смогут прозрачно обмениваться
данными.




Класс MCAdvertiserAssistant делает устройство обнаруживаемым, а класс MCBrowserViewController позволяет устройства искать. Эти классы реализуют стандартный интерфейс поиска устройств и установления сессии, если вы хотите реализовать свой, используйте классы MCNearbyServiceAdvertiser и MCNearbyServiceBrowser.

Передадим сообщение между устройствами. Первое устройство будет искать.
void StartMultipeerBrowser ()
{
  peer = new MCPeerID ("Monkey");
  session = new MCSession (peer);
  session.Delegate = sessionDelegate;
  browser = new MCBrowserViewController (serviceType, session);
  browser.Delegate = browserDelegate;
  browser.ModalPresentationStyle = UIModalPresentationStyle.FormSheet;
  PresentViewController (browser, true, null);
}


MVBrowserViewController отображает окно с найденными устройствами. По тапу на одно из них, на удаленном устройстве появляется приглашение обменяться данными.


Делегат класса MCSession получает события о соединении, отключении устройств и о полученных данных.

class MySessionDelegate : MCSessionDelegate
{
  public override void DidChangeState (MCSession session, MCPeerID peerID, MCSessionState state)
  {
    switch (state) {
    case MCSessionState.Connected:
      Console.WriteLine ("Connected: {0}", peerID.DisplayName);
      break;
    case MCSessionState.Connecting:
      Console.WriteLine ("Connecting: {0}", peerID.DisplayName);
      break;
    case MCSessionState.NotConnected:
      Console.WriteLine ("Not Connected: {0}", peerID.DisplayName);
      break;
    }
  }
  public override void DidReceiveData (MCSession session, NSData data, MCPeerID peerID)
  {
    InvokeOnMainThread (() => {
      var alert = new UIAlertView ("", data.ToString (), null, "OK");
      alert.Show ();
    });
  }
  ...
}


Когда пользователь закроет окно поиска устройств делегат класса MCBrowserViewController получит событие. Окно поиска устройств необходимо скрывать вручную.
class MyBrowserDelegate : MCBrowserViewControllerDelegate
{
  public override void DidFinish (MCBrowserViewController browserViewController)
  {
    InvokeOnMainThread (() => {
      browserViewController.DismissViewController (true, null);
    });
  }
  public override void WasCancelled (MCBrowserViewController browserViewController)
  {
    InvokeOnMainThread (() => {
      browserViewController.DismissViewController (true, null);
    });
  }
}


Второе устройство сделаем обнаруживаемым:
void StartMultipeerAdvertiser ()
{
  peer = new MCPeerID ("Player1");
  session = new MCSession (peer);
  session.Delegate = sessionDelegate;
  assistant = new MCAdvertiserAssistant (serviceType, dict, session);
  assistant.Start ();
}


Когда приходит приглашение на обмен данными MCAdvertiserAssistant спросит согласия пользователя.


Как только сессия установлена можно передать сообщение, поток или ресурс. Пример передачи сообщения
void SendMessage ()
{
  var message = NSData.FromString (
    String.Format ("{0} found the monkey", peer.DisplayName));
  NSError error;
  session.SendData (message, session.ConnectedPeers,
  MCSessionSendDataMode.Reliable, out error);
}


Для передачи ресурса используется метод sendResourceAtUrl. Объект для передачи указывается через NSUrl это может быть локальный файл или сетевой ресурс.

Для установления байтового потока между устройствами используется метод startStreamWithName, он создает NSOutputStream и NSInputStream на разных концах соединения. Не знаю зачем, но можно, например передавать поток аудио с микрофона одного устройства и проигрывать на другом.
Автор: @junk Mike Bluestein
Touch Instinct
рейтинг 46,28
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Комментарии (6)

  • +3
    Вот смотрел в код и как-то рвало шаблоны, это ж не Objective-C :)
    Прошел по ссылке, а там написано, что это Xamarin.
  • 0
    Уже вижу небольшое приложение, которое будет прогонять рандомный трафик через доступные рядом устройства, тем самым разряжая их.
    • 0
      там же окно подтвердения на синхронизацию?
  • 0
    1. References все указывают на Objective-C код, а в примерах используется C#, как-то не true.
    2. Забыли указать, что все это будет работать в iOS версии 7 и выше.
    А вообще framework полезный, спасибо за информацию…
  • 0
    Под Андроид есть аналог?
  • 0
    По первой ссылке Page not found. Вот рабочая: Multipeer Connectivity Framework Reference

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

Самое читаемое Разработка