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文字通信就完成了。很简单吧!!

时间: 2024-11-02 19:37:54

iOS 7 与 Xamarin - MultiPeer Connectivity(转载)的相关文章

利用Multipeer Connectivity框架进行WiFi传输-b

什么是Multipeer Connectivity? 在iOS7中,引入了一个全新的框架——Multipeer Connectivity(多点连接).利用Multipeer Connectivity框架,即使在没有连接到WiFi(WLAN)或移动网络(xG)的情况下,距离较近的Apple设备(iMac/iPad/iPhone)之间可基于蓝牙和WiFi(P2P WiFi)技术进行发现和连接实现近场通信. Multipeer Connectivity扩充的功能与利用AirDrop传输文件非常类似,可

Xcode4.6创建和使用iOS的dylib动态库(转载)

此为xcode4的方法,xcode3的方法请查看 Xcode3创建和使用iOS的dylib动态库 找到两个目录,最好用两个finder窗口分别打开: 目录一: [plain] view plaincopy /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications/ 目录二: [plain] view plaincopy /Applica

iOS APP 发布 上线完整教程 转载

iOS应用上线--从证书申请到打包上线 转载自http://blog.csdn.net/jingyipo/article/details/51596135 本文只针对应用上线来写,其他与上线无关的证书都不在考虑范围内.考虑到第一次接触开发者账号并申请证书的童鞋,本文采取傻瓜式书写流程(即按照流程无脑操作即可),文章末尾会给予一定的概念描述.话不多说,下面将详细介绍流程. 一.在申请证书前,我们需要做一些准备工作: 1.首先你要准备好"苹果全球开发者关系证书"即AppleWWDRCA.c

iOS 知识 - 常用小技巧大杂烩 - 转载

1,打印View所有子视图 po [[self view]recursiveDescription] 2,layoutSubviews调用的调用时机 * 当视图第一次显示的时候会被调用. * 添加子视图也会调用这个方法. * 当本视图的大小发生改变的时候是会调用的. * 当子视图的frame发生改变的时候是会调用的. * 当删除子视图的时候是会调用的. 3,NSString过滤特殊字符 // 定义一个特殊字符的集合 NSCharacterSet *set = [NSCharacterSet ch

iOS路径沙盒文件管理(转载)

iOS路径沙盒文件管理,看到博主总结的很好,转载过来,原文:http://www.aichengxu.com/view/35264 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文件,这个独立.封闭.安全的空间,叫做沙盒.它一般存放着程序包文件(可执行文件).图片.音频.视频.plist文件.sqlite数据库以及其他文件. 每个应用程序都有自己的独立的存储空间(沙盒) 一般来说应用程序之间是不可以互相访问 模拟器沙盒的位置 /User/userName/Library/Ap

iOS ---UIWebView 默认交互行为---【转载】-------未完待续

转载自:http://my.oschina.net/hmj/blog/111344 UIKit提供UIWebView组件,允许开发者在App中嵌入Web页面.通过UIWebView组件,我们可以在应用中很方便的嵌入HTML页面.在利用IOS原生的组件进行界面开发时,界面UI元素的布局需要我们去一点点的计算,尤其是对于复杂点的图文混排的内容来说,这种计算有时很让人头痛.与原生组件相比,HTML本身的结构性语义性较强,利用CSS能更加方便快捷的进行内容布局和美化,同时Javascript可以为页面添

iOS开发之多媒体API (转载)

视频格式可以分为适合本地播放的本地影像视频和适合在网络中播放的网络流媒体影像视频两大类.尽管后者在播放的稳定性和播放画面质量上可能没有前者 优秀,但网络流媒体影像视频的广泛传播性使之正被广泛应用于视频点播.网络演示.远程教育.网络视频广告等等互联网信息服务领域. AD:WOT2015 互联网运维与开发者大会 热销抢票 播放视频 视频文件介绍 视频格式可以分为适合本地播放的本地影像视频和适合在网络中播放的网络流媒体影像视频两大类.尽管后者在播放的稳定性和播放画面质量上可能没有前者 优秀,但网络流媒

iOS证书详解--转载

一.成员介绍1.    Certification(证书)证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种:1)    Developer Certification(开发证书)安装在电脑上提供权限:开发人员通过设备进行真机测试.可以生成副本供多台电脑安装:2)      Distribution Certification(发布证书)安装在电脑上提供发布iOS程序的权限:开发人员可以制做测试版和发布版的程序.不可生成副本,仅有配置该证书的电脑才可使用:(副本制做介绍在下面Keycha

iOS 友盟第三方登录分享(转载)

原文地址:http://www.360doc.com/content/15/0121/14/20919452_442560039.shtml // 需要引入框架 // 1. SystemConfiguration.framework // 2. CoreGraphics.framework // 3. libsqlite3.dylib // 4. CoreTelephony.framework // 5. libstdc++.dylib, // 6. libz.dylib // 下载最新的SDK