iOS中提供了4個(gè)框架用于實(shí)現(xiàn)藍(lán)牙連接
GameKit.framework(用法簡(jiǎn)單)
只能用于iOS設(shè)備之間的連接军援,多用于游戲(比如五子棋對(duì)戰(zhàn))楣导,從iOS7開始過期MultipeerConnectivity.framework
只能用于iOS設(shè)備之間的連接,從iOS7開始引入ExternalAccessory.framework
可用于第三方藍(lán)牙設(shè)備交互猬错,但是藍(lán)牙設(shè)備必須經(jīng)過蘋果MFi認(rèn)證(國(guó)內(nèi)較少)CoreBluetooth.framework(時(shí)下熱門)
可用于第三方藍(lán)牙設(shè)備交互歹撒,必須要支持藍(lán)牙4.0
硬件至少是4s应役,系統(tǒng)至少是iOS6
藍(lán)牙4.0以低功耗著稱梯找,一般也叫BLE(BluetoothLowEnergy)
目前應(yīng)用比較多的案例:運(yùn)動(dòng)手壞唆阿、嵌入式設(shè)備、智能家居
代碼實(shí)現(xiàn)
#import "ViewController.h"
#import <GameKit/GameKit.h>
@interface ViewController ()<GKPeerPickerControllerDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
/** 會(huì)話 */
@property (strong, nonatomic) GKSession *session;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
#pragma mark - 連接設(shè)備
- (IBAction)connectDevice{
// 1.創(chuàng)建連接設(shè)備的控制器
GKPeerPickerController *ppc = [[GKPeerPickerController alloc] init];
// 2.設(shè)置代理(在代理中可以監(jiān)聽是否連接成功)
ppc.delegate = self;
// 3.彈出控制器
[ppc show];
}
/**
* 當(dāng)建立連接成功時(shí),會(huì)調(diào)用該方法
*
* @param picker 連接設(shè)備的控制器
* @param peerID 節(jié)點(diǎn)ID,每一個(gè)藍(lán)牙設(shè)備就是一個(gè)節(jié)點(diǎn),都有一個(gè)對(duì)應(yīng)的節(jié)點(diǎn)ID
* @param session 會(huì)話,建立連接之后相當(dāng)于兩個(gè)藍(lán)牙之間建立一個(gè)會(huì)話,之后可以通過會(huì)話相互之間傳輸數(shù)據(jù)
*/
- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session{
// 保留會(huì)話
self.session = session;
// 設(shè)置句柄(誰來接收數(shù)據(jù))
[self.session setDataReceiveHandler:self withContext:nil];
// 退出控制器
[picker dismiss];
}
#pragma mark - 選擇照片
- (IBAction)pickImage{
// 1.判斷照片源是否可用
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){
return;
}
// 2.創(chuàng)建照片選擇控制器
UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
// 3.設(shè)置代理
ipc.delegate = self;
// 4.設(shè)置照片源
ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
// 5.彈出控制器
[self presentViewController:ipc animated:YES completion:nil];
}
/**
* 選擇了照片庫(kù)的某一張照片
*/
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
// 1.獲取照片,并且設(shè)置到imageView上
self.imageView.image = info[UIImagePickerControllerOriginalImage];
// 2.退出控制器
[picker dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark - 發(fā)送照片
- (IBAction)sendImage {
// 1.將圖片轉(zhuǎn)成NSData, 1 圖片壓縮比
NSData *imageData = UIImageJPEGRepresentation(self.imageView.image, 1);
// 2.發(fā)送照片
/*
GKSendDataReliable, 可到達(dá),發(fā)送數(shù)據(jù)保證可以到達(dá).
GKSendDataUnreliable, 不可達(dá)到,數(shù)據(jù)只會(huì)發(fā)送一次.
*/
[self.session sendDataToAllPeers:imageData withDataMode:GKSendDataReliable error:nil];
}
/**
* 接收數(shù)據(jù)必須要實(shí)現(xiàn)的方法
*/
- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context {
// 1.直接轉(zhuǎn)成Image,并且設(shè)置到ImageView
self.imageView.image = [UIImage imageWithData:data];
}