- PVSM.RU - https://www.pvsm.ru -

Multipeer connectivity framework в iOS7

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

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

Multipeer connectivity framework в iOS7

Класс MCAdvertiserAssistant [2] делает устройство обнаруживаемым, а класс MCBrowserViewController [3] позволяет устройства искать. Эти классы реализуют стандартный интерфейс поиска устройств и установления сессии, если вы хотите реализовать свой, используйте классы 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 отображает окно с найденными устройствами. По тапу на одно из них, на удаленном устройстве появляется приглашение обменяться данными.
Multipeer connectivity framework в iOS7

Делегат класса 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 спросит согласия пользователя.
Multipeer connectivity framework в iOS7

Как только сессия установлена можно передать сообщение, поток или ресурс. Пример передачи сообщения

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 [4]. Объект для передачи указывается через NSUrl это может быть локальный файл или сетевой ресурс.

Для установления байтового потока между устройствами используется метод startStreamWithName [5], он создает NSOutputStream и NSInputStream на разных концах соединения. Не знаю зачем, но можно, например передавать поток аудио с микрофона одного устройства и проигрывать на другом.

Автор: junk

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/wifi/48233

Ссылки в тексте:

[1] Multipeer Connectivity Framework: https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MultipeerConnectivityFramework/Introduction/Introduction.html

[2] MCAdvertiserAssistant: https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MCAdvertiserAssistant_class/Reference/Reference.html#//apple_ref/occ/cl/MCAdvertiserAssistant

[3] MCBrowserViewController: https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MCBrowserViewController_class/Reference/Reference.html#//apple_ref/occ/cl/MCBrowserViewController

[4] sendResourceAtUrl: https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MCSessionClassRef/Reference/Reference.html#//apple_ref/occ/instm/MCSession/sendResourceAtURL:withName:toPeer:withCompletionHandler:

[5] startStreamWithName: https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MCSessionClassRef/Reference/Reference.html#//apple_ref/occ/instm/MCSession/startStreamWithName:toPeer:error:

[6] Источник: http://habrahabr.ru/post/198814/