蓝牙
mutipeerConnectivity
iOS7 引入的一个全新框架
替代GameKit框架
多用于文件传输
iOS设备不联网也能给附近的人聊天
搜索和传输的方式
* 双方WIFI和蓝牙都没有打开:无法实现 * 双方都开启蓝牙:通过蓝牙发现和传输 * 双方都开启WIFI:通过WIFI Direct发现和传输,速度接近AirDrop * 双方同时开启了WIFI和蓝牙:模拟AirDrop,通过低功耗蓝牙技术扫描发现握手,然后通过WIFI Direct传输
示例代码
步骤
1.注册一个广播 告诉别人 我的设备是可以被发现的 2.扫描蓝牙设备 需要实现代理方法 3.使用一个MCSession对象 存储当前的会话 需要实现代理方法 4.使用MCSession对象 发送和接收数据
连接设备
创建MCSession对象用于存放当前连接的会话
//初始化会话 MCPeerID *peerId = [[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name];
self.mySession = [[MCSession alloc] initWithPeer:peerId];
开启广播对象,通知正在搜索的设备他们是可用的
//设置可被发现 - (IBAction)fount:(id)sender { UISwitch *s = (UISwitch *)sender; if (s.isOn) { //注册广告 /* 服务类型 可能一个app发送了多个广告 所以需要给广告绑定一个唯一标识
session:当前会话 */ _assistant = [[MCAdvertiserAssistant alloc]initWithServiceType:SERVICE_TYPE discoveryInfo:nil session:_mySession]; //开启广播 [_assistant start]; } }
开始搜索蓝牙设备
- (IBAction)lianjieshebei:(id)sender { //创建搜索蓝牙设备设备控制器 MCBrowserViewController *browser = [[MCBrowserViewController alloc] initWithServiceType:SERVICE_TYPE session:_mySession]; browser.delegate = self; [self presentViewController:browser animated:YES completion:nil]; }
连接以后选择数据发送
- (IBAction)xuanzewenjian:(id)sender { UIImagePickerController *imagepicker = [[UIImagePickerController alloc] init]; imagepicker.delegate = self; imagepicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; [self presentViewController:imagepicker animated:YES completion:nil]; } - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionaryid> *)info { self.imageView.image = info[UIImagePickerControllerOriginalImage]; [picker dismissViewControllerAnimated:YES completion:nil]; }
在搜索控制器的连接完成代理方法中隐藏搜索设备控制器
#pragma mark - 扫描设备的代理 //发现设备以后可以通过代理方法来实现传送数据 扫描设备的代理 //链接成功 - (void)browserViewControllerDidFinish:(MCBrowserViewController *)browserViewController{ [browserViewController dismissViewControllerAnimated:YES completion:nil]; }
实现搜索控制器的代理方法,获取连接上的设备ID
#pragma mark - MCBrowserViewControllerDelegate /** * 连接成功 * * @param browserViewController 搜索控制器 * @param peerID 连接上的设备ID * @param info 连接的信息 * * @return YES : 只发送连接上的用户 */ - (BOOL)browserViewController:(MCBrowserViewController *)browserViewController shouldPresentNearbyPeer:(MCPeerID *)peerID withDiscoveryInfo:(nullable NSDictionary*)info { self.peerID = peerID; NSLog(@"info == %@ peer = %@",info, peerID); return YES; }
将选择好的文件发送到连接到的设备ID上
- (IBAction)sendImage { // 判断是否有图片 if (!self.showImage.image) return; // 获取图片 UIImage *image = self.showImage.image; // 将图片转换成NSData类型 NSData *data = UIImagePNGRepresentation(image); /** * 发送数据 * toPeers : 发给的设备ID的数组 * withMode: 发送模式,是否是安全模式 */ if (self.peerID != nil) { [self.mc_Session sendData:data toPeers:@[self.peerID] withMode:MCSessionSendDataUnreliable error:nil]; } }
接收数据
#pragma mark MCSessionDelegate //接收到数据 - (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID { dispatch_async(dispatch_get_main_queue(), ^{ self.imageView.image = [UIImage imageWithData:data]; }); } //必须实现的 - (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state { }