游密即时通讯SDK(IM SDK)为玩家提供完整的游戏内互动服务,游戏开发者无需关注IM通讯复杂的内部工作流程,只需调用IM SDK提供的接口,即可快速实现世界聊天、公会聊天、组队聊天、文字、表情、语音等多项功能。
在游密官网注册游密账号。
在控制台添加游戏,获得接入需要的Appkey、Appsecret。
im_ios
复制到工程的根目录下。Build Settings -> Search Paths -> Header Search Paths
中添加头文件路径:projectRoot/im_ios/include/
(建议直接将此include文件夹拖到xcode需要填入的位置,自动生成路径)。Build Settings -> Search Paths -> Framework Search Paths
中添加框架文件路径:projectRoot/im_ios/lib/
(建议直接将此lib文件夹拖到xcode需要填入的位置,自动生成路径)。Build Settings -> Search Paths -> Library Search Paths
中添加库文件路径:projectRoot/im_ios/lib/
(建议直接将此lib文件夹拖到xcode需要填入的位置,自动生成路径)。Build phases ->Complle Sources
中将SDK中include文件夹里面的所有.m和.mm文件添加进来。Build Setting->Build Options->Enable Bitcode
,将默认的选择Yes改为No。在Build Phases -> Link Binary With Libraries
添加如下依赖库:
libc++.1.tbd
libsqlite3.0.tbd
libresolv.9.tbd
SystemConfiguration.framework
libz.tbd
CoreTelephony.framework
AVFoundation.framework
AudioToolbox.framework
CoreLocation.framework
libYouMeCommon.a
libyim.a
AliyunNlsSdk.framework
//如果是带语音转文字的sdk需要添加,该库是动态库,需要在General -> Frameworks,libraries,and Embedded Content
处将其改成Embed & Sign
。
libBoringSSL.a
libgoogleapis.a
libgRPC-Core.a
libgRPC-ProtoRPC.a
libgRPC-RxLibrary.a
libgRPC.a
libnanopb.a
libProtobuf.a
UniSoundSDKDynamic.xcframework
//如果是带云知声语音转文字的sdk需要添加,该库是动态库,需要在General -> Frameworks,libraries,and Embedded Content
处将其改成Embed & Sign
。
CFNetwork.framework
//如果是带云知声语音转文字的sdk需要。
Security.framework
//如果是带云知声语音转文字的sdk需要。
libicucore.A.tbd
//如果是带云知声语音转文字的sdk需要。
如果接入的是带google语音识别的版本,在Build Phases->Copy Bundle Resources
的"Add Other"处选择SDK-lib文件夹,选择 gRPCCertificates.bundle
进行添加。
需要为iOS10以上版本添加录音权限配置
iOS 10 使用录音权限,需要在info
新加Privacy - Microphone Usage Description
键,值为字符串,比如“语音聊天需要录音权限”。
首次录音时会向用户申请权限。配置方式如图(选择Private-Microphone Usage Description)。
info
新加Privacy - Location Usage Description
键,值为字符串,比如“查看附近的玩家需要获取地理位置权限”。首次使用定位时会向用户申请权限,配置方式如上图录音权限。成功导入SDK后,应用启动的第一时间需要调用初始化接口。
#import "YIMClient.h"
这是一个单例类,可以通过GetInstance
获取到它的实例。通过它就可以调用IM SDK的API接口。
调用示例:
YIMErrorcodeOC err = [[YIMClient GetInstance] InitWithAppKey:@"appkey" appSecurityKey:@"secretkey" serverZone:YouMeIMServerZone_China];
相关接口与参数:
返回值:
YIMErrorcodeOC
:错误码,详细描述见错误码定义。IM引擎底层对于耗时操作都采用异步回调的方式,函数调用会立即返回,操作结果OC层会同步回调。因此,用户必须实现相关接口并在初始化完成以后进行注册。
回调代理类需实现 protocol <YoumeIMCallbackProtocol>
调用示例:
//.h 文件
#import "im_ios/include/YIMClient.h"
#import "im_ios/include/YIMCallbackProtocol.h"
@interface ViewController : UIViewController <YIMCallbackProtocol>
//回调函数
- (void) OnLogin:(YIMErrorcodeOC) errorcode userID:(NSString*) userID;
...
//.mm 文件
...
@implementation ViewController
...
- (void)viewDidLoad {
[super viewDidLoad];
// 可在调初始化之前设置监听
[[YIMClient GetInstance] SetDelegate:self];
YIMErrorcodeOC err = [[YIMClient GetInstance] InitWithAppKey:@"appkey" appSecurityKey:@"secretkey" serverZone:YouMeIMServerZone_China];
...
}
...
- (void) OnLogin:(YIMErrorcodeOC) errorcode userID:(NSString*) userID
{
NSLog(@"login callback,errorcode: %d, userID: %@",errorcode,userID);
}
...
// 其余回调接口实现
回调注册接口
:
-(void)SetDelegate:(id<YIMCallbackProtocol>) outDelegate
成功初始化IM后,需要使用IM功能时,先调用IM SDK登录接口。
调用示例:
[[YIMClient GetInstance] Login:@"1001" password:@"123456" token:@"" callback:^(YIMErrorcodeOC errorcode, NSString *userID) {
if(errorcode == YouMeIMCode_Success){
NSLog(@"登录成功,现在进入房间");
}else{
NSLog(@"登录失败,可以视情况重试登录");
}
}];
相关接口与参数:
登录接口
:
-(void) Login:(NSString *)userName password:(NSString *)password token:(NSString*) token callback:(loginCBType) callback
userName
:由调⽤者分配,不可为空字符串,只可由字母或数字或下划线组成,用户首次登录会自动注册所用的用户ID和密码。password
:⽤户密码,不可为空字符串,由调用者分配,二次登录时需与首次登录一致,否则会报UsernamePasswordError。token
:用户验证token,可选,如不使用token验证传入:""。callback
: 登录回调。回调接口与参数:
登录接口是异步操作,登录成功的标识是回调的错误码是Success;特别的如果调用Login
多次,收到AlreadyLogin错误码也表示登录成功。
loginCBType
类型定义:typedef void(^loginCBType)(YIMErrorcodeOC errorcode, NSString* userID);
userID
:用户ID。 errorcode
:错误码。 登录成功后,如果有群组聊天需要,比如游戏里面的世界、工会、区域等,需要进入聊天频道,调用方为聊天频道设置一个唯一的频道ID,可以进入多个频道。
调用示例:
// 可在登录成功回调里调进入频道
[[YIMClient GetInstance] JoinChatRoom:@"room_w123" callback:^(YIMErrorcodeOC errorcode, NSString *roomID) {
if(errorcode == YouMeIMCode_Success){
NSLog(@"进入房间成功");
}else{
NSLog(@"进入房间失败:%d",errorcode);
}
}];
相关接口与参数
进入频道接口
:
-(void) JoinChatRoom:(NSString *)roomID callback:(joinRoomCBType)callback
roomID
:请求加入的频道ID,仅支持数字、字母、下划线组成的字符串,区分大小写,长度限制为255字节。callback
: 加入频道回调。回调接口与参数:
进入频道接口是异步操作,进入频道成功的标识是回调的错误码是Success。
joinRoomCBType
类型定义:typedef void(^joinRoomCBType)(YIMErrorcodeOC errorcode, NSString* roomID);
errorcode
:错误码。roomID
:频道ID。在成功登录IM后,即可发送IM消息。
调用示例:
unsigned long long requestID;
//发私聊文本消息
requestID = [[YIMClient GetInstance] SendTextMessage:@"1001" chatType:YIMChatType_PrivateChat msgContent:@"天气真好!" attachParam:@"attachMsg" callback:^(YIMErrorcodeOC errorcode, unsigned int sendTime, bool isForbidRoom, int reasonType, unsigned long long forbidEndTime) {
if(errorcode ==YouMeIMCode_Success){
NSLog(@"消息id:%lld 发送成功",requestID);
}else{
NSLog(@"发送文本消息失败,一般是没有登录:%d",errorcode);
}
}];
相关接口与参数:
发文本消息接口
:
-(unsigned long long) SendTextMessage:(NSString *)receiverID chatType:(YIMChatTypeOC)chatType msgContent:(NSString *) msgContent attachParam:(NSString *)attachParam callback:(sendMessageStatusCBType)callback
receiverID
:接收者ID,私聊传入用户ID,频道聊天传入频道ID。chatType
:聊天类型,私聊传1
,频道聊天传2
;需要频道聊天得先成功进入频道后发文本消息,此频道内的成员才能接收到消息。msgContent
:聊天内容。attachParam
:发送文本附加信息。callback
: 发送文本消息回调。返回值: 消息序列号,用于校验一条消息发送成功与否的标识。
回调接口与参数:
发送文本消息接口是异步操作,发送文本消息成功的标识是回调的错误码是Success;文本消息发送成功,接收方会收到OnRecvMessage
回调,能从该回调中取得消息内容,消息发送者等信息。
sendMessageStatusCBType
类型定义:typedef void(^sendMessageStatusCBType)(YIMErrorcodeOC errorcode, unsigned int sendTime, bool isForbidRoom,int reasonType,unsigned long long forbidEndTime,unsigned long long messageID);
errorcode
:错误码。sendTime
:消息发送时间。isForbidRoom
:若发送的是频道消息,显示在此频道是否被禁言,true-被禁言,false-未被禁言。reasonType
:若在频道被禁言,禁言原因类型,0-未知,1-发广告,2-侮辱,3-政治敏感,4-恐怖主义,5-反动,6-色情,7-其它。forbidEndTime
:若在频道被禁言,禁言结束时间。 messageID
: 服务器返回的消息id。 在成功登录IM后,可以发送语音消息。
- 按住语音按钮时,调用
StartRecordAudioMessage
启动录音。- 松开按钮,调用
StopAndSendAudioMessage
接口,发送语音消息。- 按住过程若需要取消发送,调用
CancleAudioMessage
取消本次语音发送。
调用示例:
unsigned long long requestID;
//开始语音
requestID = [[YIMClient GetInstance] StartRecordAudioMessage:@"uid_1234567" chatType:YIMChatType_PrivateChat recognizeText:true isOpenOnlyRecognizeText:false callback:^(YIMErrorcodeOC errorcode, NSString *text, NSString *audioPath, unsigned int audioTime, unsigned int sendTime, bool isForbidRoom, int reasonType, unsigned long long forbidEndTime) {
if(errorcode == YouMeIMCode_Success){
_lastSendAudioPath = audioPath;
NSLog(@"语音发送成功");
}else{
NSLog(@"语音发送失败:%d",errorcode);
}
} startSendCallback:^(YIMErrorcodeOC errorcode, NSString *text, NSString *audioPath, unsigned int audioTime) {
}];
// 结束并发送语音
YIMErrorcodeOC err_stop = [[YIMClient GetInstance] StopAndSendAudioMessage:@""];
// 如果不想发送语音,调取消本次语音,调取消后收不到消息的发送回调
YIMErrorcodeOC err_stop = [[YIMClient GetInstance] CancleAudioMessage];
相关接口与参数:
发送语音消息接口
:
-(unsigned long long) StartRecordAudioMessage:(NSString *)receiverID chatType:(YIMChatTypeOC)chatType recognizeText:(bool)recognizeText isOpenOnlyRecognizeText:(bool)isOpenOnlyRecognizeText callback:(sendAudioMsgStatusCBType)callback startSendCallback:(startSendAudioMsgCBType)startSendCallback
结束录音接口
:
-(YIMErrorcodeOC) StopAndSendAudioMessage:(NSString *)attachMsg
取消录音接口
:
-(YIMErrorcodeOC) CancleAudioMessage
receiverID
:接收者ID(⽤户ID或者频道ID)。chatType
:消息类型,表示私聊还是频道消息。recognizeText
:是否带文字识别。IsOpenOnlyRecognizeText
:是否开启仅识别语音文本,不发送语音消息。callback
: 录音回调。attachMsg
:发送语音消息附加信息,主要用于调用方特别需求。返回值:
YIMErrorcodeOC
:错误码,详细描述见错误码定义。回调接口与参数:
调用StopAndSendAudioMessage
接口后,会收到发送语音的回调,如果录音成功会收到开始发送语音startSendAudioMsgCBType
类型的回调,无论录音是否成功都会收到发送语音消息结果sendAudioMsgStatusCBType
类型的回调,startSendAudioMsgCBType
类型的回调在接收时间上比sendAudioMsgStatusCBType
类型的回调快,常用于上屏显示。
sendAudioMsgStatusCBType
和startSendAudioMsgCBType
类型定义如下:// sendAudioMsgStatusCBType 发送语音结果回调,自己的语音消息发送成功或者失败的通知。
typedef void(^sendAudioMsgStatusCBType)(YIMErrorcodeOC errorcode, NSString* text, NSString* audioPath, unsigned int audioTime, unsigned int sendTime, bool isForbidRoom, int reasonType, unsigned long long forbidEndTime,unsigned long long messageID);
// startSendAudioMsgCBType 开始上传语音回调
typedef void(^startSendAudioMsgCBType)(YIMErrorcodeOC errorcode, NSString* text, NSString* audioPath, unsigned int audioTime);
errorcode
:错误码。text
:语音转文字识别的文本内容,如果没有用带语音转文字的接口,该字段为空字符串。audioPath
:录音生成的wav文件的本地完整路径。audioTime
:录音时长(单位秒)。
sendTime
:消息发送时间。isForbidRoom
:若发送的是频道消息,显示在此频道是否被禁言,true-被禁言,false-未被禁言。reasonType
:若在频道被禁言,禁言原因类型,0-未知,1-发广告,2-侮辱,3-政治敏感,4-恐怖主义,5-反动,6-色情,7-其它。forbidEndTime
:若在频道被禁言,禁言结束时间。 messageID
:返回服务器messageID,与接收消息时的getMessageID()是统一的。 startSendAudioMsgCBType
类型的回调,或者sendAudioMsgStatusCBType
类型的回调的错误码是Success;调用StopAndSendAudioMessage
同步返回值是Success才能收到回调;语音消息发送成功,接收方会收到OnRecvMessage
回调,能从该回调中下载语音文件。
- 通过
OnRecvMessage
接口被动接收消息,需要开发者实现
- (void) OnRecvMessage:(YIMMessage*) pMessage{
NSLog(@"收到消息,senderID:%@,recvID:%@",pMessage.senderID,pMessage.receiverID);
if(pMessage.messageBody.messageType == YIMMessageBodyType_TXT){
//收到的是文本消息
YIMMessageBodyText *tMessage = (YIMMessageBodyText *)pMessage.messageBody;
NSLog(@"文本消息:%@",[tMessage messageContent]);
}else if(pMessage.messageBody.messageType == YIMMessageBodyType_Voice){
//收到的是语音消息
YIMMessageBodyAudio *vMessage = (YIMMessageBodyAudio *)pMessage.messageBody;
NSLog(@"文字识别结果:%@,fileSize:%d,audioTime:%d",[vMessage textContent], [vMessage fileSize], [vMessage audioTime] );
//下载语音文件
[[YIMClient GetInstance] DownloadAudio:pMessage.messageID strSavePath:[ViewController createUniqFilePath] callback:^(YIMErrorcodeOC errorcode, YIMMessage *msg, NSString *savePath) {
//播放语音
}];
}
}
- 通过
messageBody.messageType
分拣出语音消息(YIMMessageBodyType_Voice)
。- ⽤
messageID
获得消息ID。- 点击语音气泡,调用函数
DownloadAudio
下载语音消息。- 调用方调用函数
StartPlayAudio
播放语音消息。
调用示例:
// 下载语音文件
[[YIMClient GetInstance] DownloadAudio:pMessage.messageID strSavePath:@"savePath" callback:^(YIMErrorcodeOC errorcode, YIMMessage *msg, NSString *savePath) {
}];
相关接口和参数:
下载语音消息接口
:
-(void) DownloadAudio:(unsigned long long) ulSerial strSavePath:(NSString*)strSavePath callback:(downloadCBType)callback
播放语音消息接口
:
- (void) StartPlayAudio:(NSString* ) path callback:(playCompleteCBType)callback
ulSerial
:消息ID。strSavePath
:语音文件保存路径。path
:待播放文件路径。callback
:回调。回调接口与参数:
下载语音接口是异步操作,下载语音成功的标识是downloadCBType
类型回调的错误码为Success。成功下载语音消息后即可播放语音消息。
downloadCBType
类型定义如下:typedef void(^downloadCBType)(YIMErrorcodeOC errorcode, YIMMessage* msg, NSString* savePath);
errorcode
:错误码。msg
:消息基类。savePath
:保存路径。
playCompleteCBType
类型定义如下:typedef void(^playCompleteCBType)(YIMErrorcodeOC errorcode, NSString* path);
errorcode
:错误码。path
:文件路径。注销账号时,调用登出接口Logout
登出IM系统。
调用示例:
[[YIMClient GetInstance] Logout:^(YIMErrorcodeOC errorcode) {
if(errorcode == YouMeIMCode_Success)
{
NSLog(@"登出成功");
}
else
{
NSLog(@"登出失败,err: ",errorcode);
}
}];
回调接口与参数:
登出是异步操作,登出成功的标识是回调的错误码为Success。
logoutCBType
类型定义如下:typedef void(^logoutCBType)(YIMErrorcodeOC errorcode);
errorcode
:错误码。主要分为世界频道聊天,用户私聊,直播聊天室;集成的时都需要先初始化SDK,登录IM系统。
应用启动的第一时间需要调用初始化接口。
接口与参数:
返回值:
YIMErrorcodeOC
:错误码,详细描述见错误码定义。
- 点击
登录
按钮时,调用IM SDK登录接口。
接口与参数:
Login
:登录接口。userName
:由调⽤者分配,不可为空字符串,只可由字母或数字或下划线组成,用户首次登录会自动注册所用的用户ID和密码。password
:⽤户密码,不可为空字符串,由调用者分配,二次登录时需与首次登录一致,否则会报UsernamePasswordError。token
:用户验证token,可选,如不使用token验证传入:""。返回值:
YIMErrorcodeOC
:错误码,详细描述见错误码定义。
- 进入应用后,调用加入频道接口,进入世界、公会、区域等需要进入的聊天频道。
- 应用需要为各个聊天频道设置一个唯一的频道ID。
- 成功进入频道后,发送频道消息,文本、语音消息等。
接口与参数
JoinChatRoom
:加入频道。roomID
:请求加入的频道ID,仅支持数字、字母、下划线组成的字符串,区分大小写,长度限制为255字节。返回值:
YIMErrorcodeOC
:错误码,详细描述见错误码定义。
- 用户集成直播SDK后,导入IM SDK。
- 初始化IM SDK。
- 登录IM 系统。
- 进入指定的聊天频道。
- 发送频道消息(例如:弹幕式),调用流程查看发送文本消息。
- 点击发送按钮,调用发消息接口,将输入框中的内容发送出去。
- 发送出的消息出现在聊天框右侧。
- 表情消息可以将表情信息打包成Json格式发送。
相关接口与参数:
SendTextMessage
:发文字消息接口。receiverID
:接收者ID,私聊传入用户ID,频道聊天传入频道ID。chatType
:聊天类型,私聊传1
,频道聊天传2
;需要频道聊天得先成功进入频道后发文本消息,此频道内的成员才能接收到消息。msgContent
:聊天内容。attachParam
:发送文本附加信息。callback
: 发送文本消息回调。返回值: 消息序列号,用于校验一条消息发送成功与否的标识。
代码示例与详细说明:
- 按住语音按钮时,调用
StartRecordAudioMessage
。- 松开按钮,调用
StopAndSendAudioMessage
接口,发送语音消息。- 按住过程若需要取消发送,调用
CancleAudioMessage
取消发送。
相关接口与参数:
StartRecordAudioMessage
:发送语音消息接口。StopAndSendAudioMessage
:结束录音接口。CancleAudioMessage
:取消录音接口。
receiverID
:接收者ID(⽤户ID或者群ID)。chatType
:消息类型,表示私聊还是频道消息。recognizeText
:是否带文字识别。IsOpenOnlyRecognizeText
:是否开启仅识别语音文本,不发送语音消息。callback
: 录音回调。attachMsg
:发送语音消息附加信息,主要用于调用方特别需求。返回值:
YIMErrorcodeOC
:错误码,详细描述见错误码定义。
- 通过
OnRecvMessage
接口被动接收消息,需要开发者实现,接收消息进行相应的展示,如果是语音消息需要下载语音,以及下载完成后的语音播放。
相关接口与参数:
OnRecvMessage
:收消息接口。
- 通过
messageBody.messageType
分拣出语音消息(YIMMessageBodyType_Voice)
。- ⽤
messageID
获得消息ID。- 点击语音气泡,调用
DownloadAudio
接口下载语音文件。- 调用方播放语音文件。
相关接口与参数:
DownloadAudio
:下载语音文件接口。StartPlayAudio
:播放语音文件接口。
ulSerial
:消息ID。strSavePath
:语音文件保存路径。path
:待播放文件路径。callback
:回调。
- 如下两种情况需要登出IM系统:
- 注销账号时,调用
Logout
接口登出IM系统。- 退出应用时,调用
Logout
接口登出IM系统。
相关接口:
Logout
:登出接口。