iOS開發拓展篇—藍牙之GameKit使用

藍牙

GameKit

簡介:

* 實現藍牙設備之間的通信

* 只能使用在iOS設備之間同一個應用內鏈接

* 從iOS7開始過時了

* 可是GameKit是最基本的藍牙通信框架

* 經過藍牙能夠實現文件的共享(僅限設備沙盒中的文件)

* 此框架通常用於遊戲開發(好比五子棋對戰)

開始案例

簡介:

* 使用藍牙將兩個iOS設備鏈接起來

* 搜索對方的設備

* 實現將手機中的圖片發送給對方

界面的搭建:

藍牙互連:

  • 搜索藍牙設備
// 初始化連接藍牙控制器
    GKPeerPickerController *peerCtr = [[GKPeerPickerController alloc] init];
    // 顯示匹配到的藍牙設備
    [peerCtr show];
  • GKPeerPickerController最重要的兩個代理
/**
 *  連接成功
 *
 *  @param picker  藍牙控制器
 *  @param peerID  鏈接藍牙的設備id
 *  @param session 鏈接藍牙的會話(通信)用來傳數據
 */
- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session
{
    NSLog(@"%s %d",__func__,__LINE__);
    // 隱藏藍牙控制器
    [picker dismiss];
}

// 退出鏈接
- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker
{
    NSLog(@"%s %d",__func__,__LINE__);
}

選擇圖片:

  • 選擇圖片方法
// 選擇圖片
- (IBAction)chooseImage {
    // 1.初始化圖片選擇控制器
    UIImagePickerController *imgPicker = [[UIImagePickerController alloc]init];
    // 2.判斷圖庫是否可用
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) {
        // 3.設置圖庫打開的類型
        imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
        // 4. 設置代理
        imgPicker.delegate = self;
        // 5. 打開圖庫
        [self presentViewController:imgPicker animated:YES completion:nil];
    }
}
  • 選擇圖片控制器的代理方法
/**
 *  圖片選擇完成調用
 *
 *  @param picker 圖片選擇控制器
 *  @param info   選擇的信息
 */
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
    NSLog(@"info == %@",info);
    // 設置選擇的圖片爲當前的顯示圖片
    self.showImageView.image = info[UIImagePickerControllerOriginalImage];
    // 隱藏當前選擇圖片控制器
    [picker dismissViewControllerAnimated:YES completion:nil];
}

圖片相互發送:

  • 須要在鏈接成功代理方法中存儲當前的會話
// 保存當前回話
    self.m_Session = session;
  • 發送圖片方法
// 發送圖片
- (IBAction)sendImage {
    
    // 判斷圖片是否存在
    if (!self.showImageView.image) return;
    
    // 拿到須要發送出去的圖片
    UIImage *image = self.showImageView.image;
    // 將圖片轉換成NSData類型
    NSData *imgData = UIImagePNGRepresentation(image);
    
    /**
     *  發送數據給全部匹配上的用戶
     *
     *  @param GKSendDataMode 數據發送的模式:(安全/不安全模式)
     *                        GKSendDataUnreliable : 不安全模式:就像發10個傳單,傳單直接往人羣中砸過去,能不能收到無論
     *                        GKSendDataReliable:安全模式:就像發10個傳單,每個傳單都得發到路人的手上,纔再發下一個傳單
     *  @return
     */
    [self.m_Session sendDataToAllPeers:imgData withDataMode:GKSendDataUnreliable error:nil];
}

設置圖片:

  • GameKit提供的接受數據是方法的回調
    • 須要監聽接收傳遞過來的數據
      • 在鏈接成功代理方法中設置監聽
    /** 監聽傳遞過來的數據
         *  setDataReceiveHandler: 由哪一個對象來監聽數據的接受
         *  withContext : 監聽須要傳遞的參數
         */
        [session setDataReceiveHandler:self withContext:nil];
    • 實現監聽方法
      • 只設置由誰監聽傳遞過來的數據仍是不足的,由於咱們仍是不能拿到傳遞過來的數據,進入監聽方法的頭文件能夠看到
      // SEL = -receiveData:fromPeer:inSession:context:
      • 因此咱們必須實現這個方法才能拿到接收到的數據,這個回調方法方法在Xcode 7以前的版本的解釋如圖:
/**
 *  實現接收數據的回調方法
 *
 *  @param data    接收到的數據
 *  @param peer    傳遞數據的設備ID
 *  @param session 當前回話
 *  @param context 註冊監聽傳遞過來的數據
 */
- (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context
{
    // 判斷是否有數據進來
    if (!data) return;

    // 由於傳遞過來的是圖片,因此咱們直接使用UIImage來接受
    UIImage *image = [UIImage imageWithData:data];
    // 設置圖片
    self.showImageView.image = image;
}
相關文章
相關標籤/搜索