iOS 7 与 Xamarin - MultiPeer Connectivity(转载)
随着时代的改变,移动设备在生活工作都开始取代原有的pc。设备间的数据交互就成为了必备可少的功能。比较成熟的产品有NFC。这个啪啪的操作很流行,例如分享图片,分享文件等 。但是在iOS设备中还没有NFC 的功能。那有什么替代的解决方案?比较常见的是利用socket ,bonjour等协议去实现。在iOS 7中有了新的方法去做就是接下来要介绍的MultiPeer Connectivity .
MultiPeer Connectivity
就是一种方便发现周边设备,并可以进行交互的一种方式。通常情况下只需要打开Wifi,或者蓝牙设备就可以进行。
应用场景有交互式辅助,文件共享,协同工作等。
在实现MultiPeer Connectivity中有几个关键的术语需要注意
NearBy
指的是类似wifi,蓝牙的无线近墙技术
Peer
周边设备
Advertiser
信号发出者,使设备在一定距离被发现
Browser
搜索信号发出者,可以连接
一个重要疑问就是这个技术安全吗? 这方面iOS 7考虑很多。提供了验证和加密。所以你放心使用。
今天我们就先用简单的方法实现设备之间是怎样通过MultiPeer Connectivity进行通信,当然我是用Xamarin .
在Xcode 5 中 ,我们需要添加MultiPeerConnectivity.Framework . 而在Xamarin 中我们也需要,但是是在类文件中 ,
using MonoTouch.MultipeerConnectivity;
接下来就需要使你的设备支持MultiPeerConnectivity,也就是Advertiser 。
首先我们要建立一个PeerID, 这个作为被发现后的唯一标识。通常我习惯用设备的名字
MCPeerID myPeerID = new MCPeerID (UIDevice.CurrentDevice.Name);
接着的事情是建立一个会话session去与 这个PeeID 绑定, 因为在接收数据,和发送数据都是通过这个会话去完成,并可以检测连接的状态。你还可以对会话进行加密等。
MCSession session = new MCSession (myPeerID,new NSObject[]{},MCEncryptionPreference.None);
最后一步是添加Advertiser
MCAdvertiserAssistant assistant = new MCAdvertiserAssistant ("service", new NSDictionary (), session);
assistant.Start ();
好这样就可以简单地实现信号发出端的基本设置。
这里我需要重复强调下MCSession。
它有一个Delegate MCSessionDelegate 当需要接收数据时就要用到。
如这里我要接收 数据就需要重定义接受的方法
public virtual void DidReceiveData (MCSession session, NSData data, MCPeerID peerID)
如果需要检测会话状态就需要重新定义
public virtual void DidChangeState (MCSession session, MCPeerID peerID, MCSessionState state)
检测端browser .
MCBrowserViewController 就是搜索端,这个界面可以检测发送信号的设备,并连接。
MCBrowserViewController browserVC = new MCBrowserViewController ("service", session);
PresentViewController (browserVC, true, null);
这里也有一个delegate 方法去对检测功能进行一些方法进行定义如done,如cancel等操作。
好这样就可以建立好一个基本的MultiPeer Connectivity的基本环境了。
总觉得设备之间通讯是一个比较有趣的玩意,在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的设备

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

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

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文字通信就完成了。很简单吧!!
iOS 7 与 Xamarin - MultiPeer Connectivity(转载)的更多相关文章
- 利用Multipeer Connectivity框架进行WiFi传输
什么是Multipeer Connectivity? 在iOS7中,引入了一个全新的框架——Multipeer Connectivity(多点连接).利用Multipeer Connectivity框 ...
- 利用Multipeer Connectivity框架进行WiFi传输-b
什么是Multipeer Connectivity? 在iOS7中,引入了一个全新的框架——Multipeer Connectivity(多点连接).利用Multipeer Connectivity框 ...
- iOS路径沙盒文件管理(转载)
iOS路径沙盒文件管理,看到博主总结的很好,转载过来,原文:http://www.aichengxu.com/view/35264 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文 ...
- JS判断客户端是否是iOS或者Android手机移动端(转载)
前言: 上午有一个移动端的项目负责人问我,在ios系统上样式出现问题,因为内核原因,我改来改去,在ios弄好了,但在安卓有问题了,突然想到了一种办法,既然ios是一种机型,安卓是一种机型,可以检测用户 ...
- Exiting an iOS App with Xamarin
referenced from: http://www.redbitdev.com/exiting-ios-app-with-xamarin-ios/ The team is in the middl ...
- iOS开发之多媒体API (转载)
视频格式可以分为适合本地播放的本地影像视频和适合在网络中播放的网络流媒体影像视频两大类.尽管后者在播放的稳定性和播放画面质量上可能没有前者 优秀,但网络流媒体影像视频的广泛传播性使之正被广泛应用于视频 ...
- iOS 发布遇到的问题 (转载)
1.ios图片命名Icon-120.png – 120×120 iphone & ipod touch(ios7) http://blog.csdn.net/xyxjn/article/de ...
- iOS 9之适配ATS(转载)
iOS 9系统已经出来了,而网络方面的ATS(App Transport Security)特性可以说每个人都要经历.而我这篇博客,就是结合我最近几天的经历,来谈谈从服务器到iOS客户端对ATS的适配 ...
- iOS开发主要参考文档(转载)
Objective-C,语言的系统详细资料.这是做iOS开发的前题与基础.https://developer.apple.com/library/ios/#documentation/Cocoa/Co ...
随机推荐
- Lambda表达式演变
Lambda表达式是一种匿名函数. 演变步骤: 一般的方法委托 => 匿名函数委托 => Lambda表达式 Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈La ...
- js正则中的贪婪和非贪婪模式问题总结
var b="abeeee:eeeee:eeeeeab"; console.log(b.match(/e+\:e+/g));//["eeee:eeeee"]贪婪 ...
- 插入排序---直接插入排序算法(Javascript版)
将n个元素的数列分为已有序和无序两个部分. 数列:{a1,a2,a3,a4,…,an} 将该数列的第一元素视为有序数列,后面都视为无序数列: {{a1},{a2,a3,a4,…,an}} 将无序数列中 ...
- C/C++程序员必须熟练应用的开源项目
作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应 ...
- 由一个异常开始思考springmvc参数解析
首先记录一下异常,以及异常出现的原因和解决方案 异常主要信息: -- ::, ERROR [.jsp] - Name for argument type [java.lang.String] not ...
- Hibernate原生SQL查询
最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...
- HDU 1131 Count the Trees 大数计算
题目是说给出一个数字,然后以1到这个数为序号当做二叉树的结点,问总共有几种组成二叉树的方式.这个题就是用卡特兰数算出个数,然后因为有编号,不同的编号对应不同的方式,所以结果是卡特兰数乘这个数的阶乘种方 ...
- js undefine,null 和NaN
undefined 类型只有一个值,即 undefined. null 类型也只有一个值,即 null. null 指空值(empty value)或指曾赋过值,但是目前没有值 undefined 指 ...
- 【转】MyEclipse快捷键大全
常用快捷键 -------------------------------------MyEclipse 快捷键1(CTRL)------------------------------------- ...
- 为vs2012添加背景和皮肤
每天对着电脑用VS进行编码开发,难免有点单调.我们可以试着像设置电脑桌面壁纸一样设置VS皮肤. 先看下效果 1.打开vs2012,工具——扩展和更新 2.选择联机,搜索并分别安装如下两个插件 3.安装 ...