NO1.首先前往融云官網(wǎng)申請(qǐng)應(yīng)用apk
NO2.下載SDK
大家注意一下融云有兩種SDK
我們下載第二種就可以了仗颈,包比較小走贪,節(jié)約空間
接著我們把包拖到工程
然后我們添加相應(yīng)的庫(kù)
您除了在工程中導(dǎo)入 SDK 之前吏恭,還需要添加如下系統(tǒng)庫(kù)的引用。
AssetsLibrary.framework
AudioToolbox.framework
AVFoundation.framework
CFNetwork.framework
CoreAudio.framework
CoreGraphics.framework
CoreLocation.framework
CoreMedia.framework
CoreTelephony.framework
CoreVideo.framework
ImageIO.framework
libc++.tbd
libc++abi.tbd
libsqlite3.tbd
libstdc++.tbd
libxml2.tbd
libz.tbd
MapKit.framework
OpenGLES.framework
QuartzCore.framework
SystemConfiguration.framework
UIKit.framework
Photos.framework
SafariServices.framework
NO3.注冊(cè)融云
在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions里面添加
[[RCIMClient sharedRCIMClient] initWithAppKey:zyAppKey];
[[RCIMClient sharedRCIMClient] connectWithToken:zyc_IM_Token
success:^(NSString *userId) {
NSLog(@"登陸成功喉钢。當(dāng)前登錄的用戶ID:%@", userId);
} error:^(RCConnectErrorCode status) {
NSLog(@"登陸的錯(cuò)誤碼為:%d", status);
} tokenIncorrect:^{
//token過(guò)期或者不正確。
//如果設(shè)置了token有效期并且token過(guò)期,請(qǐng)重新請(qǐng)求您的服務(wù)器獲取新的token
//如果沒(méi)有設(shè)置token有效期卻提示token錯(cuò)誤温艇,請(qǐng)檢查您客戶端和服務(wù)器的appkey是否匹配,還有檢查您獲取token的流程堕汞。
NSLog(@"token錯(cuò)誤");
}];
appkey? ? zyc_IM_Token就是上面我們獲取的key 和 Token
NO4.實(shí)現(xiàn)錄音
導(dǎo)入 AVFoundation/AVFoundation.h
我們用系統(tǒng)的AVAudioSession來(lái)實(shí)現(xiàn)錄音勺爱,官方建議使用wav格式
-(void)zyplay{
NSLog(@"開(kāi)始錄音");
AVAudioSession *session =[AVAudioSession sharedInstance];
NSError *sessionError;
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
if (session == nil) {
NSLog(@"Error creating session: %@",[sessionError description]);
}else{
[session setActive:YES error:nil];
}
self.session = session;
//1.獲取沙盒地址
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
filePath = [path stringByAppendingString:@"/RRecord.wav"];
//2.獲取文件路徑
self.recordFileUrl = [NSURL fileURLWithPath:filePath];
//設(shè)置參數(shù)
NSDictionary *settings = @{AVFormatIDKey: @(kAudioFormatLinearPCM),
AVSampleRateKey: @8000.00f,
AVNumberOfChannelsKey: @1,
AVLinearPCMBitDepthKey: @16,
AVLinearPCMIsNonInterleaved: @NO,
AVLinearPCMIsFloatKey: @NO,
AVLinearPCMIsBigEndianKey: @NO};
_recorder = [[AVAudioRecorder alloc] initWithURL:self.recordFileUrl settings:settings error:nil];
if (_recorder) {
_recorder.meteringEnabled = YES;
[_recorder prepareToRecord];
[_recorder record];
}else{
NSLog(@"音頻格式和文件存儲(chǔ)格式不匹配,無(wú)法初始化Recorder");
}
}
這樣我們就錄制了RRecord.wav這個(gè)語(yǔ)音
NO4.發(fā)送語(yǔ)音
我們先轉(zhuǎn)換上面我們的wav數(shù)據(jù)
NSData *kk = [NSData dataWithContentsOfURL:self.recordFileUrl];
self.recordFileUrl是上面RRecord.wav的地址
- (void)sendVoiceMessage:(NSData *)wavData duration:(long)duration targetId:(NSString *)targetId conversationType:(RCConversationType)conversationType {
//語(yǔ)音消息實(shí)體
RCVoiceMessage *voiceMessage = [RCVoiceMessage messageWithAudio:wavData duration:duration];
//? ? [self.player play];
[[RCIMClient sharedRCIMClient] sendMessage:conversationType targetId:targetId content:voiceMessage pushContent:nil pushData:nil success:^(long messageId) {
NSLog(@"發(fā)送語(yǔ)音消息成功");
} error:^(RCErrorCode nErrorCode, long messageId) {
NSLog(@"發(fā)送語(yǔ)音消息失敗,錯(cuò)誤碼是(%ld)", (long)nErrorCode);
}];
}
RCVoiceMessage是語(yǔ)音消息體? wavData是Data化的wav
NO5.接收語(yǔ)音
我們先實(shí)現(xiàn)代理
RCIMClientReceiveMessageDelegate 代理
[[RCIMClient sharedRCIMClient] setReceiveMessageDelegate:self object:nil];
- (void)onReceived:(RCMessage *)message
left:(int)nLeft
object:(id)object {
if ([message.content isMemberOfClass:[RCVoiceMessage class]]) {
NSLog(@"收到語(yǔ)音消息");
RCVoiceMessage *voiceMsg = (RCVoiceMessage *)message.content;
self.wavAudioData = voiceMsg.wavAudioData;
[self voicePressed];
}
NSLog(@"還剩余的未接收的消息數(shù):%d", nLeft);
}
- (void)setWavAudioData:(NSData *)wavAudioData {
_wavAudioData = wavAudioData;
NSError *error;
AVAudioPlayer *player =
[[AVAudioPlayer alloc] initWithData:wavAudioData error:&error];
self.player = player;
self.player.delegate = self;
}
NO6.播放語(yǔ)音
- (void)voicePressed {
NSLog(@"pressed");
if (self.isPlaying) {
[self stop];
} else {
[self playing];
}
}
- (void)playing {
self.isPlaying = YES;
[self.player prepareToPlay];
[self.player play];
}
- (void)stop {
self.isPlaying = NO;
[self.player stop];
}
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player
successfully:(BOOL)flag {
self.isPlaying = NO;
}
NO7.我們加入一個(gè)聊天室來(lái)測(cè)試一哈
- (void)zyaddID:(NSString *)ID{
//
[[RCIMClient sharedRCIMClient] joinChatRoom:ID messageCount:1 success:^{
NSLog(@"加入聊天室");
} error:^(RCErrorCode status) {
NSLog(@"加入聊天室失敗");
}];
[[RCIMClient sharedRCIMClient] setReceiveMessageDelegate:self object:nil];
}
-(void)zyquitID:(NSString *)ID{
[[RCIMClient sharedRCIMClient] quitChatRoom:ID success:^{
NSLog(@"退出聊天室");
} error:^(RCErrorCode status) {
NSLog(@"退出聊天室失敗");
}];
}