IM SDK for iOS 开发指引
概述
游密即时通讯SDK(IM SDK)为玩家提供完整的游戏内互动服务,游戏开发者无需关注IM通讯复杂的内部工作流程,只需调用IM SDK提供的接口,即可快速实现世界聊天、公会聊天、组队聊天、文字、表情、语音等多项功能。
IM SDK接口调用顺序

四步集成IM SDK
第一步 注册账号
在游密官网注册游密账号。
第二步 添加游戏,获取Appkey
在控制台添加游戏,获得接入需要的Appkey、Appsecret。
第三步 下载IM SDK包体
第四步 开发环境配置
快速接入
1. 导入IM SDK
- 将
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
- 在"Add Other"处选择SDK-lib文件夹,选择以下文件添加:
libYouMeCommon.a
libyim.a
-
需要为iOS10以上版本添加录音权限配置 iOS 10 使用录音权限,需要在
info新加Privacy - Microphone Usage Description键,值为字符串,比如“语音聊天需要录音权限”。 首次录音时会向用户申请权限。配置方式如图(选择Private-Microphone Usage Description)。
-
LBS添加获取地理位置权限 若使用LBS,需要在
info新加Privacy - Location Usage Description键,值为字符串,比如“查看附近的玩家需要获取地理位置权限”。首次使用定位时会向用户申请权限,配置方式如上图录音权限。
2. 初始化
成功导入SDK后,应用启动的第一时间需要调用初始化接口。
引入SDK头文件
#import "YIMClient.h"这是一个单例类,可以通过GetInstance获取到它的实例。通过它就可以调用IM SDK的API接口。
初始化IM SDK(以下流程是参考2.3.0.11036版本及之前的流程新版sdk的接口流程请查询API Guides)
-
调用示例:
TEXT YIMErrorcodeOC err = [[YIMClient GetInstance] InitWithAppKey:@"appkey" appSecurityKey:@"secretkey" serverZone:YouMeIMServerZone_China]; -
相关接口与参数:
-
返回值:
YIMErrorcodeOC:错误码,详细描述见错误码定义。
-
备注:
此接口本是异步操作,未给出异步回调,一般返回的错误码是Success即表示初始化成功。
3. 设置回调监听
IM引擎底层对于耗时操作都采用异步回调的方式,函数调用会立即返回,操作结果OC层会同步回调。因此,用户必须实现相关接口并在初始化完成以后进行注册。
回调代理类需实现 protocol <YoumeIMCallbackProtocol>
-
调用示例:
TEXT //.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
4. 登录IM系统

成功初始化IM后,需要使用IM功能时,先调用IM SDK登录接口。
-
调用示例:
TEXT [[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类型定义:
TEXT typedef void(^loginCBType)(YIMErrorcodeOC errorcode, NSString* userID);userID:用户ID。errorcode:错误码。
5. 进入聊天频道

登录成功后,如果有群组聊天需要,比如游戏里面的世界、工会、区域等,需要进入聊天频道,调用方为聊天频道设置一个唯一的频道ID,可以进入多个频道。
-
调用示例:
TEXT // 可在登录成功回调里调进入频道 [[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类型定义:
TEXT typedef void(^joinRoomCBType)(YIMErrorcodeOC errorcode, NSString* roomID);errorcode:错误码。roomID:频道ID。
6. 发送文本消息

在成功登录IM后,即可发送IM消息。
-
调用示例:
TEXT 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类型定义:
TEXT 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。
-
拓展功能: 发送消息时,可以将玩家头像、昵称、角色等级、vip等级等要素打包成json格式发送。
7. 发送语音消息

在成功登录IM后,可以发送语音消息。
- 按住语音按钮时,调用
StartRecordAudioMessage启动录音。- 松开按钮,调用
StopAndSendAudioMessage接口,发送语音消息。- 按住过程若需要取消发送,调用
CancleAudioMessage取消本次语音发送。
-
调用示例:
TEXT 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类型定义如下:
TEXT // 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` 后先检查同步错误码;同步调用成功表示请求已受理,仍需等待最终结果回调。接收方通过 `OnRecvMessage` 获取语音消息并下载语音文件。
<a id="接收消息"></a>
### 8. 接收消息

>- 通过`OnRecvMessage`接口被动接收消息,需要开发者实现
- **调用示例:**
```obj-c
- (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) {
//播放语音
}];
}
}9. 接收语音消息并播放

- 通过
messageBody.messageType分拣出语音消息(YIMMessageBodyType_Voice)。- ⽤
messageID获得消息ID。- 点击语音气泡,调用函数
DownloadAudio下载语音消息。- 调用方调用函数
StartPlayAudio播放语音消息。
-
调用示例:
TEXT // 下载语音文件 [[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)callbackulSerial:消息ID。strSavePath:语音文件保存路径。path:待播放文件路径。callback:回调。
-
-
回调接口与参数:
下载语音接口是异步操作,下载语音成功的标识是downloadCBType类型回调的错误码为Success。成功下载语音消息后即可播放语音消息。downloadCBType类型定义如下:
TEXT typedef void(^downloadCBType)(YIMErrorcodeOC errorcode, YIMMessage* msg, NSString* savePath);-
errorcode:错误码。 -
msg:消息基类。 -
savePath:保存路径。 -
playCompleteCBType类型定义如下:
TEXT typedef void(^playCompleteCBType)(YIMErrorcodeOC errorcode, NSString* path);errorcode:错误码。path:文件路径。
10. 登出IM系统
注销账号时,调用登出接口Logout登出IM系统。
-
调用示例:
TEXT [[YIMClient GetInstance] Logout:^(YIMErrorcodeOC errorcode) { if(errorcode == YouMeIMCode_Success) { NSLog(@"登出成功"); } else { NSLog(@"登出失败,err: ",errorcode); } }]; -
回调接口与参数:
登出是异步操作,登出成功的标识是回调的错误码为Success。logoutCBType类型定义如下:
TEXT typedef void(^logoutCBType)(YIMErrorcodeOC errorcode);errorcode:错误码。
典型场景集成方案
主要分为世界频道聊天,用户私聊,直播聊天室;集成的时都需要先初始化SDK,登录IM系统。
启动应用,初始化IM SDK
应用启动的第一时间需要调用初始化接口。
-
接口与参数:
-
返回值:
YIMErrorcodeOC:错误码,详细描述见错误码定义。
-
代码示例与详细说明:
登录应用时,登录IM系统

- 点击
登录按钮时,调用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: 发送文本消息回调。
-
返回值: 消息序列号,用于校验一条消息发送成功与否的标识。
-
代码示例与详细说明:
-
拓展功能: 发送消息时,可以将玩家头像、昵称、角色等级、vip等级等要素打包成json格式发送。
发送语音消息

- 按住语音按钮时,调用
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系统

- 如下两种情况需要登出IM系统:
- 注销账号时,调用
Logout接口登出IM系统。- 退出应用时,调用
Logout接口登出IM系统。
-
相关接口:
Logout:登出接口。
-
代码示例与详细说明:
