Pull to refresh
0
Rating
Touch Instinct
Разрабатываем мобильные приложения

Multipeer connectivity framework в iOS7

Touch Instinct corporate blog Development for iOS *Development of mobile applications *
Translation
Original author: Mike Bluestein
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 на разных концах соединения. Не знаю зачем, но можно, например передавать поток аудио с микрофона одного устройства и проигрывать на другом.
Tags: multipeer connectivityios7bluetoothwifi
Hubs: Touch Instinct corporate blog Development for iOS Development of mobile applications
Total votes 16: ↑13 and ↓3 +10
Comments 6
Comments Comments 6

Information

Founded
Location
Россия
Website
touchin.ru
Employees
51–100 employees
Registered