游密即时通讯SDK(IM SDK)为玩家提供完整的游戏内互动服务,游戏开发者无需关注IM通讯复杂的内部工作流程,只需调用IM SDK提供的接口,即可快速实现世界聊天、公会聊天、组队聊天、文字、表情、语音等多项功能。
在游密官网注册游密账号。
在控制台添加游戏,获得接入需要的Appkey、Appsecret。
将yim
复制到Cocos2d-x开发工具生成的游戏目录根目录下。
拷贝yim下的两个文件:jsb_youmeim.h,jsb_youmeim.cpp到Classes目录。
对proj.android/jni/Android.mk
文件进行如下修改,仅需修改标注部分,其余部分无需处理。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cocos2djs_shared
LOCAL_MODULE_FILENAME := libcocos2djs
ifeq ($(USE_ARM_MODE),1)
LOCAL_ARM_MODE := arm
endif
##########添加编译jsb_youmeim.cpp,注意上一行末尾添加‘\’####################
LOCAL_SRC_FILES := hellojavascript/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/jsb_youmeim.cpp
################################################################
##########添加如下代码,添加头文件路径yim/include .注意上一行结尾处添加换行符\########
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
$(LOCAL_PATH)/../../../../yim/include \
################################################################
# _COCOS_HEADER_ANDROID_BEGIN
# _COCOS_HEADER_ANDROID_END
LOCAL_STATIC_LIBRARIES := cocos2d_js_static
##############添加如下代码,链接动态库##############################
LOCAL_SHARED_LIBRARIES := YIM
################################################################
LOCAL_EXPORT_CFLAGS := -DCOCOS2D_DEBUG=2 -DCOCOS2D_JAVASCRIPT
include $(BUILD_SHARED_LIBRARY)
####################### 包含YMSDK子配置 #########################
include $(LOCAL_PATH)/../../../../yim/lib/android/Android.mk
################################################################
$(call import-module, scripting/js-bindings/proj.android)
若不需要语音转文字功能,需要对yim/lib/android/Android.mk
文件进行如下修改:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := YIM
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libyim.so \
include $(PREBUILT_SHARED_LIBRARY)
# ############# 不使用翻译可以删除下面内容 ##############
include $(CLEAR_VARS)
LOCAL_MODULE := YIMNLS
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libnlscppsdk.so \
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := YIMU
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)+/libuuid.so \
include $(PREBUILT_SHARED_LIBRARY)
# ###################################################
将 yim/lib/android/
目录中如下文件复制到proj.android/libs/
目录下。(其中alisr.jar和asr-v1.0.2.aar是语音识别包,如没有使用语音识别功能则不需要添加;如果项目之前已经有Android-support依赖,可以不用引入包内的android-support-v4.jar
。)
yim.jar
alisr.jar
asr-v1.0.2.aar
android-support-v4.jar
proj.android/AndroidManifest.xml
文件,确保声明了如下权限: <!-- 添加到application节点内 -->
<application xxxx>
<receiver android:name="com.youme.im.NetworkStatusReceiver" android:label="NetworkConnection" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
</application>
<!-- 添加到跟application平级 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 获取地理位置的权限,可选 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
打开Eclipse,导入上一步的Android工程,在项目中第一个启动的AppActivity
中的onCreate
中增加以下Java代码(默认在项目根目录/src目录下):
注意必须把游密的初始化加到第一行,否则可能出现部分机型加载so不正常
。
/**
如果没有onCreate方法,可以添加到onCreateView方法里
*/
@Override
protected void onCreate(Bundle bundle)
{
//下面的两个调用顺序不能错
com.youme.im.IMEngine.init(this);
super.onCreate(bundle); //super.onCreate是默认已经有的,不用再复制
}
如果打包或生成APK时需要混淆,则需要在proguard.cfg
文件中添加如下代码:
-keep class com.youme.** {*;}
-keep class com.iflytek.**
-keepattributes Signature
yim
复制到Cocos2d-x开发工具生成的游戏目录根目录下。Build Settings -> Search Paths -> Header Search Paths
中添加头文件路径:$(SRCROOT)/../../../yim/include/
。Build Settings -> Search Paths -> User Header Search Paths
中添加头文件路径:$(SRCROOT)/../../cocos2d-x/cocos/scripting/js-bindings/manual
。Build Settings -> Search Paths -> Framework Search Paths
中添加框架文件路径:$(SRCROOT)/../../../yim/lib/ios
。Build Settings -> Search Paths -> Library Search Paths
中添加库文件路径:$(SRCROOT)/../../../yim/lib/ios
。在Build Phases -> Link Binary With Libraries
添加如下依赖库:
libc++.1.tbd
libsqlite3.0.tbd
libresolv.9.tbd
SystemConfiguration.framework
libYouMeCommon.a
libyim.a
libz.tbd
CoreTelephony.framework
AliyunNlsSdk.framework
//如果是带语音转文字的sdk需要添加,该库是动态库,需要在General -> Frameworks,libraries,and Embedded Content
处将其改成Embed & Sign
。
AVFoundation.framework
AudioToolbox.framework
CoreLocation.framework
libBoringSSL.a
//如果是带google语音转文字的sdk需要
libgoogleapis.a
//如果是带google语音转文字的sdk需要
libgRPC-Core.a
//如果是带google语音转文字的sdk需要
libgRPC-ProtoRPC.a
//如果是带google语音转文字的sdk需要
libgRPC-RxLibrary.a
//如果是带google语音转文字的sdk需要
libgRPC.a
//如果是带google语音转文字的sdk需要
libnanopb.a
//如果是带google语音转文字的sdk需要
libProtobuf.a
//如果是带google语音转文字的sdk需要
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
里加入 gRPCCertificates.bundle
。
拷贝yim下的两个文件:jsb_youmeim.h,jsb_youmeim.cpp到Classes目录,并加入项目。
需要为iOS10以上版本添加录音权限配置
iOS 10 使用录音权限,需要在info
新加Privacy - Microphone Usage Description
键,值为字符串,比如“语音聊天需要录音权限”。
首次录音时会向用户申请权限。配置方式如图(选择Private-Microphone Usage Description)。
info
新加Privacy - Location Usage Description
键,值为字符串,比如“查看附近的玩家需要获取地理位置权限”。首次使用定位时会向用户申请权限,配置方式如上图录音权限。将yim
复制到Cocos2d-x开发工具生成的游戏目录根目录下。
拷贝yim下的两个文件:jsb_youmeim.h,jsb_youmeim.cpp到Classes目录,并加入项目。
拷贝yim/lib/x86 目录下的yim.dll , yim.lib, libusc.dll, jsoncpp-0.y.z.dll, libeay32.dll, nlscppsdk.dll, pthreadVC2.dll, ssleay32.dll
拷贝到执行目录(如果是64位机器,使用yim/lib/x64)。
在项目 -> 属性 -> C/C++ -> 常规 -> 附加包含目录 中添加
$(ProjectDir)..\..\..\yim\include
$(EngineRoot)cocos\scripting\js-bindings\manual
。
yim.lib
(该库是release模式下的 如果运行的时候是debug模式请添加yim_Debug.lib)。成功导入SDK后,应用启动的第一时间需要调用初始化接口。
引入C++接口文件
#include "jsb_youmeim.h"
为了方便说明如何调用接口,我们全文中都把youmeim作为YouMeIM的实例对象使用
接口和示例:
var youmeim = new YouMeIM
调用示例:
var errorcode = youmeim.IM_Init("strAppKey","strAppSecret")
参数:
返回值:
errorcode
:错误码,详细描述见错误码定义。IM引擎底层对于耗时操作都采用异步回调的方式,函数调用会立即返回,操作结果会同步回调。因此,用户必须实现相关接口并在初始化完成以后进行注册。常用功能需要登录回调,聊天室回调,消息回调,如需其它功能查看API接口。
调用示例:
//登录登出回调
youmeim.OnLogin = function (errorcode,youmeID)
{
cc.log("errorcode:" + errorcode + " youmeID:" + youmeID)
}
youmeim.OnLogout = function ()
{
cc.log("11: OnLogout")
}
//进入聊天频道的通知
youmeim.OnJoinChatroom = function(errorcode,groupid)
{
cc.log("OnJoinChatroom:" + groupid + " errorcode:" + errorcode)
}
//文本和自定义消息发送状态回调
youmeim.OnSendMessageStatus = function(serial,errorcode, sendTime, isForbidRoom, reasonType, endTime)
{
cc.log("OnSendMessageStatus" + serial + " errorcode:" + errorcode)
}
//自己的语音开始上传回调
youmeim.OnStartSendAudioMessage = function(serial,errorcode,content,localpath,duration)
{
cc.log("OnStartSendAudioMessage" + serial + " errorcode:" + errorcode + " content:" + content + " localpath:" + localpath +" duration:" + duration)
}
//自己的语音消息发送状态回调
youmeim.OnSendAudioMessageStatus = function(serial,errorcode,content,localpath,duration, sendTime, isForbidRoom, reasonType, endTime)
{
cc.log("OnSendAudioMessageStatus" + serial + " errorcode:" + errorcode + " content:" + content + " localpath:" + localpath +" duration:" + duration)
}
//接收到他人的消息回调
youmeim.OnRecvMessage = function(bodytype,chattype, serial,recvid,senderid,content,params,duration)
{
cc.log("OnRecvMessage" + bodytype + " chattype:" + chattype + " serial:" + serial + " recvid:" + recvid + " senderid:" + senderid + " content:" + content + " param:" + params )
if(bodytype==1){
//文本消息
}else if(bodytype==5){
//语音消息
}
}
//下载语音文件回调
youmeim.OnDownload = function( errorcode, strSavepath, bodytype,chattype,serial,recvid,senderid,content,params,duration,createtime ){
{
cc.log("OnDownload:" + serial + " errorcode:" + errorcode + " path:" + strSavepath)
}
成功初始化IM后,需要使用IM功能时,先调用IM SDK登录接口。
调用示例:
var errorcode = youmeim.IM_Login("userid","user_password","token")
参数:
userid
:由调⽤者分配,不可为空字符串,只可由字母或数字或下划线组成,用户首次登录会自动注册所用的用户ID和密码。user_password
:⽤户密码,不可为空字符串,由调用者分配,二次登录时需与首次登录一致,否则会报UsernamePasswordError。token
:用户验证token,可选,如不使用token验证传入:""。返回值:
errorcode
:错误码,详细描述见错误码定义。回调接口与参数:
登录接口是异步操作,登录成功的标识是OnLogin
回调的错误码是Success;调用IM_Login
同步返回值是Success才能收到OnLogin
回调;特别的如果调用IM_Login
多次,收到AlreadyLogin错误码也表示登录成功。
登录回调接口
:
youmeim.OnLogin = function(errorcode,userid)
userid
:用户ID。errorcode
:错误码。登录成功后,如果有群组聊天需要,比如游戏里面的世界、工会、区域等,需要进入聊天频道,调用方为聊天频道设置一个唯一的频道ID,可以进入多个频道。
调用示例:
var errorcode = youmeim.IM_JoinChatRoom("room_id")
参数
room_id
:请求加入的频道ID,仅支持数字、字母、下划线组成的字符串,区分大小写,长度限制为255字节。返回值:
errorcode
:错误码,详细描述见错误码定义。回调接口与参数:
进入频道接口是异步操作,进入频道成功的标识是OnJoinChatroom
回调的错误码是Success;调用IM_JoinChatRoom
同步返回值是Success才能收到OnJoinChatroom
回调。
进入频道回调接口
:
youmeim.OnJoinChatroom=function(errorcode,channelID)
errorcode
:错误码。channelID
:频道ID。在成功登录IM后,即可发送IM消息。
调用示例:
var requestID = youmeim.IM_SendTextMessage("str_reciver_id",iChatType,"message_content","attachMsg");
参数:
str_reciver_id
:接收者ID,私聊传入用户ID,频道聊天传入频道ID。iChatType
:聊天类型,私聊传1
,频道聊天传2
;需要频道聊天得先成功进入频道后发文本消息,此频道内的成员才能接收到消息。message_content
:聊天内容。attachParam
:发送文本附加信息。返回值:
requestID
:消息序列号,用于校验一条消息发送成功与否的标识,-1
表示调用失败,失败后不会有回调通知。回调接口与参数:
发送文本消息接口是异步操作,发送文本消息成功的标识是OnSendMessageStatus
回调的错误码是Success;调用IM_SendTextMessage
同步返回值是Success才能收到OnSendMessageStatus
回调;文本消息发送成功,接收方会收到OnRecvMessage
回调,能从该回调中取得消息内容,消息发送者等信息。
发送文本消息回调接口
:
youmeim.OnSendMessageStatus = function(serial,errorcode,sendTime,isForbidRoom,reasonType,forbidEndTime)
serial
:消息序列号,用于校验一条消息发送成功与否的标识。errorcode
:错误码。sendTime
:消息发送时间。isForbidRoom
:若发送的是频道消息,显示在此频道是否被禁言,true-被禁言,false-未被禁言。reasonType
:若在频道被禁言,禁言原因类型,0-未知,1-发广告,2-侮辱,3-政治敏感,4-恐怖主义,5-反动,6-色情,7-其它。forbidEndTime
:若在频道被禁言,禁言结束时间。 在成功登录IM后,可以发送语音消息。
- 按住语音按钮时,调用
IM_SendAudioMessage
启动录音。- 松开按钮,调用
IM_StopAudioMessage
接口,发送语音消息。- 按住过程若需要取消发送,调用
IM_CancleAudioMessage
取消本次语音发送。
调用示例:
// ========== 带文字识别的录音启动 ============
var requestID = youmeim.IM_SendAudioMessage("reciver_id",chatType)
// ========== 不带文字识别的录音启动(选其中一个) ============
var requestID = youmeim.IM_SendOnlyAudioMessage("reciver_id",chatType)
// 结束录音
var errorcode = youmeim.IM_StopAudioMessage("extra_param")
// 不需要本次的录音发送就调取消录音,此时不会收到发送语音消息的回调
var errorcode = youmeim.IM_CancleAudioMessage()
参数:
reciver_id
:接收者ID(⽤户ID或者频道ID)。chatType
:消息类型,表示私聊还是频道消息。extra_param
:发送语音消息附加信息,主要用于调用方特别需求。返回值:
requestID
:消息序列号,用于校验一条消息发送成功与否的标识,-1
表示调用失败,失败后不会有回调通知。
errorcode
:错误码,详细描述见错误码定义。回调接口与参数:
调用IM_StopAudioMessage
接口后,会收到发送语音的回调,如果录音成功会收到开始发送语音的回调OnStartSendAudioMessage
,无论录音是否成功都会收到发送语音消息结果的回调OnSendAudioMessageStatus
,OnStartSendAudioMessage
在接收时间上比OnSendAudioMessageStatus
快,常用于上屏显示。
发送语音消息回调接口
:
youmeim.OnStartSendAudioMessage = function(serial,errorcode,content,localpath,duration)
youmeim.OnSendAudioMessageStatus = function(serial, errorcode, content, localpath, duration, sendTime, isForbidRoom, reasonType, endTime)
serial
:消息序列号,用于校验一条消息发送成功与否的标识。errorcode
:错误码。content
:语音转文字识别的文本内容,如果没有用带语音转文字的接口,该字段为空字符串。localpath
:录音生成的wav文件的本地完整路径。duration
:录音时长(单位秒)。
sendTime
:消息发送时间。isForbidRoom
:若发送的是频道消息,显示在此频道是否被禁言,true-被禁言,false-未被禁言。reasonType
:若在频道被禁言,禁言原因类型,0-未知,1-发广告,2-侮辱,3-政治敏感,4-恐怖主义,5-反动,6-色情,7-其它。endTime
:若在频道被禁言,禁言结束时间。OnStartSendAudioMessage
,或者OnSendAudioMessageStatus
回调的错误码是Success;调用IM_StopAudioMessage
同步返回值是Success才能收到回调;语音消息发送成功,接收方会收到OnRecvMessage
回调,能从该回调中下载语音文件。
- 通过
OnRecvMessage
接口被动接收消息,需要开发者实现。
youmeim.OnRecvMessage = function(bodytype,chattype, serial,recvid,senderid,content,params,duration,createtime, giftID, giftCount,anchor )
{
cc.log("收到消息回调,消息ID:" + serial + ",发送者:"+senderid + ", 接受者:" + recvid );
if ( bodytype === 1 )//文本消息
{
cc.log("收到文本消息:"+content + ", attachParam:" + param);
}
else if ( bodytype === 5 )//语音消息
{
cc.log("收到语音消息,文本内容:"+content + ",附加参数:"+ params + ",语音时长:"+ duration );
//下载语音文件
var errorcode = youmeim.IM_DownloadAudioFile(serial,"save_path");
}
};
- 通过
bodyType
分拣出语音消息(5)
。- ⽤
serial
获得消息ID。- 点击语音气泡,调用
IM_DownloadAudioFile
接口下载语音消息。- 调用方调用
IM_StartPlayAudio
接口播放语音消息。
调用示例:
//下载语音
var errorcode = youmeim.IM_DownloadAudioFile("serial","save_path")
//可在下载成功的回调里调播放语音
var errorcode = youmeim.IM_StartPlayAudio("path")
参数:
serial
:消息ID,数字字符串。save_path
:语音文件保存路径。
path
:待播放文件路径。返回值:
errorcode
:错误码,详细描述见错误码定义。回调接口与参数:
下载语音接口是异步操作,下载语音成功的标识是OnDownload
回调的错误码为Success,调用IM_DownloadAudioFile
接口同步返回值是Success才能收到OnDownload
回调。成功下载语音消息后即可播放语音消息。
下载回调接口
:
youmeim.OnDownload = function(errorcode,savePath,bodyType,chatType,serial,recvID,senderID,content,param,audioTime,createTime)
errorcode
:错误码。savePath
:保存路径。bodyType
:消息类型,0-未知类型,1-文本消息,2-自定义消息,3-表情,4-图片,5-语音,6-视频,7-文件,8-礼物。chatType
:聊天类型,私聊/频道聊天。serial
:消息ID。recvID
:消息接收者ID。senderID
:消息发送者ID。content
:语音识别的文本内容。param
:发送语音消息的附加信息。audioTime
:语音时长(单位:秒)。createTime
:消息发送时间。
播放完成回调接口
:
youmeim.OnPlayCompletion = function ( errorcode, path)
errorcode
:错误码。path
:文件路径。注销账号时,调用登出接口IM_Logout
登出IM系统。
调用示例:
var errorcode = youmeim.IM_Logout()
返回值:
errorcode
:错误码,详细描述见错误码定义。 回调接口:
登出是异步操作,登出成功的标识是OnLogout
回调的错误码为Success,调用IM_Logout
接口同步返回值是Success才能收到OnLogout
回调。
登出回调接口
:
youmeim.OnLogout = function()
主要分为世界频道聊天,用户私聊,直播聊天室;集成的时都需要先初始化SDK,登录IM系统。
应用启动的第一时间需要调用初始化接口。
- 点击
登录
按钮时,调用IM SDK登录接口。
接口与参数:
IM_Login
:登录接口。userid
:由调⽤者分配,不可为空字符串,只可由字母或数字或下划线组成,用户首次登录会自动注册所用的用户ID和密码。user_password
:⽤户密码,不可为空字符串,由调用者分配,二次登录时需与首次登录一致,否则会报UsernamePasswordError。token
:用户验证token,可选,如不使用token验证传入:""。返回值:
errorcode
:错误码,详细描述见错误码定义。
- 进入应用后,调用加入频道接口,进入世界、公会、区域等需要进入的聊天频道。
- 应用需要为各个聊天频道设置一个唯一的频道ID。
- 成功进入频道后,发送频道消息,文本、语音消息等。
接口与参数
IM_JoinChatRoom
:加入频道。room_id
:请求加入的频道ID,仅支持数字、字母、下划线组成的字符串,区分大小写,长度限制为255字节。返回值:
errorcode
:错误码,详细描述见错误码定义。
- 用户集成直播SDK后,导入IM SDK。
- 初始化IM SDK。
- 登录IM 系统。
- 进入指定的聊天频道。
- 发送频道消息(例如:弹幕式),调用流程查看发送文本消息。
- 点击发送按钮,调用发消息接口,将输入框中的内容发送出去。
- 发送出的消息出现在聊天框右侧。
- 表情消息可以将表情信息打包成Json格式发送。
相关接口与参数:
IM_SendTextMessage
:发文字消息接口。str_reciver_id
:接收者ID,私聊传入用户ID,频道聊天传入频道ID。iChatType
:聊天类型,私聊传1
,频道聊天传2
;需要频道聊天得先成功进入频道后发文本消息,此频道内的成员才能接收到消息。message_content
:聊天内容。返回值:
errorcode
:错误码,详细描述见错误码定义。代码示例与详细说明:
- 按住语音按钮时,调用
IM_SendAudioMessage
。- 松开按钮,调用
IM_StopAudioMessage
接口,发送语音消息。- 按住过程若需要取消发送,调用
IM_CancleAudioMessage
取消发送。
相关接口与参数:
IM_SendAudioMessage
:发送语音消息接口。IM_StopAudioMessage
:结束录音接口。IM_CancleAudioMessage
:取消录音接口。
reciver_id
:接收者ID(⽤户ID或者群ID)。chatType
:消息类型,表示私聊还是频道消息。extra_param
:发送语音消息附加信息,主要用于调用方特别需求。返回值:
errorcode
:错误码,详细描述见错误码定义。
- 通过
OnRecvMessage
接口被动接收消息,需要开发者实现,接收消息进行相应的展示,如果是语音消息需要下载语音,以及下载完成后的语音播放。
相关接口与参数:
OnRecvMessage
:收消息接口。
- 通过
bodyType
分拣出语音消息(5)
。- ⽤
serial
获得消息ID。- 点击语音气泡,调用
IM_DownloadAudioFile
接口下载语音文件。- 调用方播放语音文件。
相关接口与参数:
IM_DownloadAudioFile
:下载语音文件接口。IM_StartPlayAudio
:播放语音文件接口。
serial
:消息ID,数字字符串。save_path
:语音文件保存路径。path
:待播放文件路径。返回值:
errorcode
:错误码,详细描述见错误码定义。
- 如下两种情况需要登出IM系统:
- 注销账号时,调用
IM_Logout
接口登出IM系统。- 退出应用时,调用
IM_Logout
接口登出IM系统。