* FireChat
* See You Around
* 以上近場聊天App都是基於mutipeerConnectivity框架
* 搜索和傳輸的方式
* 單方WIFI和藍牙都沒有翻開:無法完成
* 單方都開啟藍牙:經過藍牙發現和傳輸
* 單方都開啟WIFI:經過WIFI Direct發現和傳輸,速度接近AirDrop
* 單方同時開啟了WIFI和藍牙:模仿AirDrop,經過低功耗藍牙技術掃描發現握手,然後經過WIFI Direct傳輸
案例界面搭建
銜接設備
創立MCSession對象用於寄存以後銜接的會話
// 創立MCSession對象
// initWithPeer:設備的ID
// 用於寄存以後的銜接的會話
self.mc_Session = [ [MCSession alloc]initWithPeer:[[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name]];
開啟播送對象,告訴正在搜索的設備他們是可用的
/**
* 只需開啟了可被搜索的播送,那麼銜接藍牙按鈕就不可點
*/
- (IBAction)foundConnect:(id)sender {
UISwitch *switchBtn = (UISwitch *)sender;
if (switchBtn.isOn) {
// 播送對象,通知其它的設備他們是可用的
if (self.advertiserAssistant == nil) {
// 創立播送對象
// initWithServiceType: 播送類型的標示(由於播送能夠比擬多,所以最好每個播送綁定一個獨一標示)
// session:以後會話
// discoveryInfo: 播送信息
self.advertiserAssistant = [[MCAdvertiserAssistant alloc] initWithServiceType:SERVICE_TYPE discoveryInfo:nil session:self.mc_Session];
}
// 開啟播送
[self.advertiserAssistant start];
self.connectBT.enabled = NO;
}else{
self.connectBT.enabled = YES;
}
}
開端搜索藍牙設備
- (IBAction)connectBlueTooth {
// 創立搜索藍牙設備控制器
MCBrowserViewController *mbVC = [[MCBrowserViewController alloc]initWithServiceType:SERVICE_TYPE session:self.mc_Session];
// 設置控制器代理
mbVC.delegate = self;
// 跳轉到搜索控制器
[self presentViewController:mbVC animated:YES completion:nil];
}
選擇數據
- (IBAction)selectImage {
// 1. 創立圖片選擇器
UIImagePickerController *imgPicker = [[UIImagePickerController alloc]init];
// 2. 判別圖片選擇器能否可用
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) {
// 選擇器翻開的類型
imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
// 設置代理
imgPicker.delegate = self;
// 翻開圖片選擇器
[self presentViewController:imgPicker animated:YES completion:nil];
}
}
圖片選擇器代理中獲取數據
// 選擇終了調用
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
// NSLog(@"info == %@",info);
// 設置顯示圖片
self.showImage.image = info[UIImagePickerControllerOriginalImage];
// 隱藏圖片顯示器
[picker dismissViewControllerAnimated:YES completion:nil];
}
在搜索控制器的銜接完成的代理辦法中隱藏搜索控制器
/**
* 銜接完成
*
* @param browserViewController 搜索控制器
*/
- (void)browserViewControllerDidFinish:(MCBrowserViewController *)browserViewController
{
[browserViewController dismissViewControllerAnimated:YES completion:nil];
NSLog(@"%s %d",__func__,__LINE__);
}
發送數據
完成搜索控制器的代理辦法,獲取銜接上的設備ID
#pragma mark - MCBrowserViewControllerDelegate
/**
* 銜接成功
*
* @param browserViewController 搜索控制器
* @param peerID 銜接上的設備ID
* @param info 銜接的信息
*
* @return YES : 只發送銜接上的用戶
*/
- (BOOL)browserViewController:(MCBrowserViewController *)browserViewController
shouldPresentNearbyPeer:(MCPeerID *)peerID
withDiscoveryInfo:(nullable NSDictionary<NSString *, NSString *> *)info
{
self.peerID = peerID;
NSLog(@"info == %@ peer = %@",info, peerID);
return YES;
}
將圖片發送給銜接上的ID
- (IBAction)sendImage {
// 獲取圖片
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];
}
}
接納數據
完成MCSession的代理辦法承受數據
- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID
{
NSLog(@"%s %d",__func__,__LINE__);
NSLog(@"data = %@ , peer = %@",data,peerID);
}
顯示數據
在MCSeesion代理辦法中設置獲取過去的數據
// 接納的數據
- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID
{
NSLog(@"%s %d",__func__,__LINE__);
// NSLog(@"data = %@ , peer = %@",data,peerID);
UIImage *image = [[UIImage alloc]initWithData:data];
if(image != nil){
// 設置數據
dispatch_async(dispatch_get_main_queue(), ^{
self.showImage.image = image;
});
}
}
【iOS之藍牙簡介和運用(二):MutipeerConnectivity】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!