溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

IOS 藍牙語音通信

發(fā)布時間:2020-08-04 09:52:17 來源:網(wǎng)絡(luò) 閱讀:1164 作者:zfajqp 欄目:移動開發(fā)

 最近看了不少關(guān)于ios藍牙語音通信的文章,網(wǎng)上錯誤不少。最近自己寫了個小Demo。

具體的每個函數(shù)干什么的請自行查詢。都是Gamekit框架的api。

代碼實現(xiàn)如下

- (void)viewDidLoad

{

    [super viewDidLoad];

    CGSize size=[[UIScreen mainScreen] bounds].size;

    

    UIButton *muteBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];

    [muteBtn setTitle:@"聊天中" forState:UIControlStateHighlighted];

    [muteBtn setTitle:@"聊天" forState:UIControlStateNormal];

    [muteBtn setFrame:CGRectMake(size.width/2.0-140.0, 20, 280, 280)];

    [muteBtn addTarget:self action:@selector(muteAction:) forControlEvents:UIControlEventTouchDown];

    [muteBtn addTarget:self action:@selector(UnmuteAction:) forControlEvents:UIControlEventTouchUpInside];

    

    UIButton *connectBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];

    [connectBtn setTitle:@"連接" forState:UIControlStateNormal];

    [connectBtn setFrame:CGRectMake(size.width/2.0-50.0, 320, 100, 40)];

    [connectBtn addTarget:self action:@selector(connectAction:) forControlEvents:UIControlEventTouchUpInside];

    

    

    UIButton *disConnectBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];

    [disConnectBtn setTitle:@"斷開連接" forState:UIControlStateNormal];

    [disConnectBtn setFrame:CGRectMake(size.width/2.0-50.0, 380, 100, 40)];

    [disConnectBtn addTarget:self action:@selector(disConnectAction:) forControlEvents:UIControlEventTouchUpInside];

     [self.view addSubview:muteBtn];

    [self.view addSubview:connectBtn];

    [self.view addSubview:disConnectBtn];

}

 

-(void)connectAction:(id)sender{

    if (!picker) {

        picker=[[GKPeerPickerController alloc] init];

        picker.connectionTypesMask=GKPeerPickerConnectionTypeNearby;

        picker.delegate=self;

    }

    if (!isConnect) {

        [picker show];

    }

}

 

-(GKSession *)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type{

    if (!_session) {

        _session=[[GKSession alloc] initWithSessionID:(_sessionID ? _sessionID : @"Sample Session") displayName:nil sessionMode:GKSessionModePeer];

        _session.delegate=self;

    }

return _session;

}

 

-(void)peerPickerController:(GKPeerPickerController *)picker1 didConnectPeer:(NSString *)peerID toSession:(GKSession *)session{

    

    [picker dismiss];

    isConnect=YES;

    [_session setDataReceiveHandler:self withContext:nil];

    NSError *error;

    

    AVAudioSession *audioSession=[AVAudioSession sharedInstance];

    

    if (![audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]) {

        NSLog(@"設(shè)置播放記錄錯誤:%@",[error localizedDescription]);

        return;

    }

    if (![audioSession setActive:YES error:&error]) {

        NSLog(@"激活失敗:%@",[error localizedDescription]);

        return;

    }

    

    [GKVoiceChatService defaultVoiceChatService].client=self;

    if (![[GKVoiceChatService defaultVoiceChatService] startVoiceChatWithParticipantID:peerID error:&error]) {

        NSLog(@"開啟語音失敗 :%@",[error userInfo]);

    }

}

-(void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker1{

    picker.delegate=nil;

     picker=nil;

}

-(void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state{

    

    if (state==GKPeerStateConnected) {

        isConnect=YES;

    

    }

    

    if (state==GKPeerStateDisconnected) {

        

        [[GKVoiceChatService defaultVoiceChatService] stopVoiceChatWithParticipantID:peerID];

        //[self disConnectAction:nil];

    }

 

}

-(void)disConnectAction:(id)sender{

    [_session disconnectFromAllPeers];

    _session.available=NO;

    _session.delegate=nil;

    [_session setDataReceiveHandler:nil withContext:nil];

    _session=nil;

    isConnect=NO;

}

-(void)muteAction:(id)sender{

    [GKVoiceChatService defaultVoiceChatService].microphoneMuted=YES;

}

-(void)UnmuteAction:(id)sender{

    [GKVoiceChatService defaultVoiceChatService].microphoneMuted=NO;

}

-(NSString *)participantID{

    

    return _session.peerID;

}

 

-(void)voiceChatService:(GKVoiceChatService *)voiceChatService sendData:(NSData *)data toParticipantID:(NSString *)participantID{

   

    [_session sendData:data toPeers:[NSArray arrayWithObject:participantID] withDataMode:GKSendDataReliable error:nil];

}

- (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context

{

[[GKVoiceChatService defaultVoiceChatService] receivedData:data fromParticipantID:peer];

}

 

加紅的方法大家注意下。第一個加紅的方法如果不寫可能也能實現(xiàn),但會有一些內(nèi)存上的錯誤。關(guān)閉藍牙連接不是簡單的   [_session disconnectFromAllPeers];就行的  要像第二個紅色方法里那寫全才能真正正確關(guān)閉。(水平有限歡迎拍磚)。源碼至http://down.51cto.com/data/703329下載?;蚵?lián)系478043385@qq.com免費索取。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI