iOS 7 与 Xamarin - MultiPeer Connectivity (2)

总觉得设备之间通讯是一个比较有趣的玩意,在iOS 7之前你可以通过Bonjour协议去传输一些数据而更多用户希望新的iOS设备会有NFC 。但是苹果就是要与用户过不去就是没有。iOS 7就多了一种选择通过蓝牙或者Wifi 利用MultiPeerConnectivity上传输数据。你可以传文字,可以传图片,也可以传文件,当然你可以模拟三星的Galaxy 系列的Group Play去把声音同步。今天带大家看看代码,看看iOS 7是怎么在设备上传输简单文字的。由于之前的文章是基于beta的,在正式版本的时候又有些改变,这里我会重新描述一次。

首先创建一个点,每个设备在一个局域网/蓝牙环境都是一个点,这里为了辨认最好是用设备名字。

MCPeerID myPeer = new MCPeerID (UIDevice.CurrentDevice.Name);

第二步是创建会话,会话在通信过程中是一个非常重要的作用。它包括了数据的接收,设备状态改变的检测。

MCSession  mySession = new MCSession (myPeer);//这里与之前的设备作绑定

在先前文章都有提到过会话有两个重要的方法 :

//数据状态改变
DidChangeState (MCSession session, MCPeerID peerID, MCSessionState state);
//数据接收
DidReceiveData (MCSession session, NSData data, MCPeerID peerID) ; 

这两个方法都包含在MCSessionDelegate 中。除了这两个方法外,还有

//接收资源如图片开始 void DidStartReceivingResource (MCSession session, string resourceName, MCPeerID fromPeer, NSProgress progress);

//资源接收完成

void DidFinishReceivingResource (MCSession session, string resourceName, MCPeerID formPeer, NSUrl localUrl, out NSError error);

//二进制流文件传输
void DidReceiveStream (MCSession session, NSInputStream stream, string streamName, MCPeerID peerID);

这三个方法对于对应于不同场景使用。这里先提及文字的接收,对应的是DidReceiveData.其他在接下来的文章中会提及。
 
看看DidChangeState,这里可以检测自身有否被其他设备所链接。如下: 

public override void DidChangeState (MCSession session, MCPeerID peerID, MCSessionState state)
{
     if (state == MCSessionState.Connected) {
                    Console.WriteLine (UIDevice.CurrentDevice.Name + " is connected");
      } else {


                  Console.WriteLine (UIDevice.CurrentDevice.Name + " is disconnected");
      }
}


MCSessionState 有三个状态分别是被链接成功MCSessionState.Connected,链接中 MCSessionState.Connecting , 链接失败MCSessionState.NotConnected.

之后就是数据接收的操作,这里是文字所以我就直接调用DidReceiveData。

由于我要把接收到的字符现实出来所以别忘了 InvokeOnMainThread 。否则会有问题哦!!

会话准备建立好后,就是要把这个会话发出去,告诉周边我可以接收一个怎么样的会话服务。这个就是之前所提及的Advertiser

MCAdvertiserAssistant assistant = new MCAdvertiserAssistant ("sharingtext", new NSDictionary (), mySession);
assistant.Start ();

好现在就建立好一个支持MultiPeer Connectivity的设备了。那接下来又要做什么?我们先来看看一个简单的示例 

1.  模拟器上按下设备搜索“Find Fan's device”, 会显示周边支持sharingtext的设备

iOS 7 与 Xamarin - MultiPeer Connectivity (2)_第1张图片

2.  选择其中一个设备后,被选中设备会显示是否被链接


3. 当被选中设备选择允许连接后,模拟器设备就会提示链接成功

iOS 7 与 Xamarin - MultiPeer Connectivity (2)_第2张图片


4. 选择done后,选择send,被选择设备就会现实hi


我把上面的4补归纳为两部分,第一就是查找周边的设备,第二就是发送数据。

查找周边数据我们用到的是自带的MCBrowserViewController

MCBrowserViewController browserVC = new MCBrowserViewController ("sharingtext", mySession);
browserVC.Delegate=new MyBroswerDelegate();
PresentViewController (browserVC, true, null);

你可以通过实现MCBrowserViewControllerDelegate的DidFinish,WasCancelled去对done和cancel按钮进行定义。

而发送数据由于我在会话用的是DidReceiveData,所以这里我在发送端也要对应使用SendData

MCPeerID[] peerIDs=mySession.ConnectedPeers;
NSError error;
mySession.SendData(NSData.FromString("Hi"),peerIDs,MCSessionSendDataMode.Reliable,out error);

好这样一个简单的 MulitiPeer Connectivity文字通信就完成了。很简单吧!!


转自:卢建晖的技术博客

Xamarin中文网站,了解更多:http://xamarin.csdn.net

联系CSDN了解更多产品讯息:010-84783783



你可能感兴趣的:(C#,ios7,Xamarin,移动跨平台)