IM SDK 事件回调
TIMRecvNewMsgCallback
新消息回调。
原型
typedef void (*TIMRecvNewMsgCallback)(const char* json_msg_array, const void* user_data);
参数
参数 | 类型 | 含义 |
json_msg_array | const char* | 新消息数组 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
说明
此回调可以获取新接收的消息数组。注意消息内的元素也是一个数组。每个元素的定义由
elem_type
字段决定。示例一、消息数组解析示例
Json::Value json_value_msgs; // 解析消息Json::Reader reader;if (!reader.parse(json_msg_array, json_value_msgs)) {printf("reader parse failure!%s", reader.getFormattedErrorMessages().c_str());return;}for (Json::ArrayIndex i = 0; i < json_value_msgs.size(); i++) { // 遍历 MessageJson::Value& json_value_msg = json_value_msgs[i];Json::Value& elems = json_value_msg[kTIMMsgElemArray];for (Json::ArrayIndex m = 0; m < elems.size(); m++) { // 遍历 ElemJson::Value& elem = elems[i];uint32_t elem_type = elem[kTIMElemType].asUInt();if (elem_type == TIMElemType::kTIMElem_Text) { // 文本} else if (elem_type == TIMElemType::kTIMElem_Sound) { // 声音} else if (elem_type == TIMElemType::kTIMElem_File) { // 文件} else if (elem_type == TIMElemType::kTIMElem_Image) { // 图片} else if (elem_type == TIMElemType::kTIMElem_Custom) { // 自定义元素} else if (elem_type == TIMElemType::kTIMElem_GroupTips) { // 群组系统消息} else if (elem_type == TIMElemType::kTIMElem_Face) { // 表情} else if (elem_type == TIMElemType::kTIMElem_Location) { // 位置} else if (elem_type == TIMElemType::kTIMElem_GroupReport) { // 群组系统通知} else if (elem_type == TIMElemType::kTIMElem_Video) { // 视频}}}
[{"message_client_time" : 1551080111,"message_conv_id" : "user2","message_conv_type" : 1,"message_elem_array" : [{"elem_type" : 0,"text_elem_content" : "123213213"}],"message_is_from_self" : true,"message_is_read" : true,"message_rand" : 2130485001,"message_sender" : "user1","message_seq" : 1,"message_server_time" : 1551080111,"message_status" : 2}]
[{"message_client_time" : 1551344977,"message_conv_id" : "","message_conv_type" : 3,"message_elem_array" : [{"elem_type" : 9,"group_report_elem_group_id" : "first group id","group_report_elem_group_name" : "first group name","group_report_elem_msg" : "","group_report_elem_op_group_memberinfo" : {"group_member_info_custom_info" : {},"group_member_info_identifier" : "user1","group_member_info_join_time" : 0,"group_member_info_member_role" : 0,"group_member_info_msg_flag" : 0,"group_member_info_msg_seq" : 0,"group_member_info_name_card" : "","group_member_info_shutup_time" : 0},"group_report_elem_op_user" : "","group_report_elem_platform" : "Windows","group_report_elem_report_type" : 6,"group_report_elem_user_data" : ""}],"message_is_from_self" : false,"message_is_read" : true,"message_rand" : 2207687390,"message_sender" : "@TIM#SYSTEM","message_seq" : 1,"message_server_time" : 1551344977,"message_status" : 2}]
[{"message_client_time" : 1551412814,"message_conv_id" : "first group id","message_conv_type" : 2,"message_elem_array" : [{"elem_type" : 6,"group_tips_elem_changed_group_memberinfo_array" : [],"group_tips_elem_group_change_info_array" : [{"group_tips_group_change_info_flag" : 10,"group_tips_group_change_info_value" : "first group name to other name"}],"group_tips_elem_group_id" : "first group id","group_tips_elem_group_name" : "first group name to other name","group_tips_elem_member_change_info_array" : [],"group_tips_elem_member_num" : 0,"group_tips_elem_op_group_memberinfo" : {"group_member_info_custom_info" : {},"group_member_info_identifier" : "user1","group_member_info_join_time" : 0,"group_member_info_member_role" : 0,"group_member_info_msg_flag" : 0,"group_member_info_msg_seq" : 0,"group_member_info_name_card" : "","group_member_info_shutup_time" : 0},"group_tips_elem_op_user" : "user1","group_tips_elem_platform" : "Windows","group_tips_elem_time" : 0,"group_tips_elem_tip_type" : 6,"group_tips_elem_user_array" : []}],"message_is_from_self" : false,"message_is_read" : true,"message_rand" : 1,"message_sender" : "@TIM#SYSTEM","message_seq" : 1,"message_server_time" : 1551412814,"message_status" : 2},]
TIMMsgReadedReceiptCallback
消息已读回执回调。
原型
typedef void (*TIMMsgReadedReceiptCallback)(const char* json_msg_readed_receipt_array, const void* user_data);
参数
参数 | 类型 | 含义 |
json_msg_readed_receipt_array | const char* | 消息已读回执数组 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
示例
void MsgReadedReceiptCallback(const char* json_msg_readed_receipt_array, const void* user_data) {Json::Value json_value_receipts;Json::Reader reader;if (!reader.parse(json_msg_readed_receipt_array, json_value_receipts)) {// JSON 解析失败return;}for (Json::ArrayIndex i = 0; i < json_value_receipts.size(); i++) {Json::Value& json_value_receipt = json_value_receipts[i];std::string convid = json_value_receipt[kTIMMsgReceiptConvId].asString();uint32_t conv_type = json_value_receipt[kTIMMsgReceiptConvType].asUInt();uint64_t timestamp = json_value_receipt[kTIMMsgReceiptTimeStamp].asUInt64();// 消息已读逻辑}}
TIMMsgRevokeCallback
接收的消息被撤回回调。
原型
typedef void (*TIMMsgRevokeCallback)(const char* json_msg_locator_array, const void* user_data);
参数
参数 | 类型 | 含义 |
json_msg_locator_array | const char* | 消息定位符数组 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
示例
void MsgRevokeCallback(const char* json_msg_locator_array, const void* user_data) {Json::Value json_value_locators;Json::Reader reader;if (!reader.parse(json_msg_locator_array, json_value_locators)) {// JSON 解析失败return;}for (Json::ArrayIndex i = 0; i < json_value_locators.size(); i++) {Json::Value& json_value_locator = json_value_locators[i];std::string convid = json_value_locator[kTIMMsgLocatorConvId].asString();uint32_t conv_type = json_value_locator[kTIMMsgLocatorConvType].asUInt();bool isrevoke = json_value_locator[kTIMMsgLocatorIsRevoked].asBool();uint64_t time = json_value_locator[kTIMMsgLocatorTime].asUInt64();uint64_t seq = json_value_locator[kTIMMsgLocatorSeq].asUInt64();uint64_t rand = json_value_locator[kTIMMsgLocatorRand].asUInt64();bool isself = json_value_locator[kTIMMsgLocatorIsSelf].asBool();// 消息撤回逻辑}}
TIMMsgExtensionsChangedCallback
消息扩展信息更新回调。
原型
typedef void (*TIMMsgExtensionsChangedCallback)(const char* message_id, const char* json_message_extension_array, const void* user_data);
参数
参数 | 类型 | 含义 |
message_id | const char* | 消息 ID |
json_message_extension_array | const char* | 扩展信息列表 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
示例: json_message_extension_array 示例
[{"message_extension_key":"extension_key_1","message_extension_value":"extension_value_1"},{"message_extension_key":"extension_key_2","message_extension_value":"extension_value_2"}]
TIMMsgExtensionsDeletedCallback
消息扩展信息删除回调
原型
typedef void (*TIMMsgExtensionsDeletedCallback)(const char* message_id, const char* json_message_extension_key_array, const void* user_data);
参数
参数 | 类型 | 含义 |
message_id | const char* | 消息 ID |
json_message_extension_key_array | const char* | 扩展信息的关键字列表 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
示例: json_message_extension_key_array 示例
[{"message_extension_key":"extension_key_1",}]
TIMMsgReactionsChangedCallback
消息回应信息更新回调
原型
typedef void (*TIMMsgReactionsChangedCallback)(const char* message_reaction_change_info_array, const void* user_data);
参数
参数 | 类型 | 含义 |
message_reaction_change_info_array | const char* | 消息回应信息变更列表 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
示例: message_reaction_change_info_array 示例
[{"message_reaction_change_info_msg_id":"12345678910-1689942227-1328217716","message_reaction_change_info_reaction_list":[{"message_reaction_id":"emoji1","message_reaction_total_user_count":1,"message_reaction_user_info_array":[{"user_profile_face_url":"www.google.com","user_profile_identifier":"kkkm","user_profile_nick_name":"mizore",}]}]}]
TIMMsgElemUploadProgressCallback
消息内元素相关文件上传进度回调。
原型
typedef void (*TIMMsgElemUploadProgressCallback)(const char* json_msg, uint32_t index, uint32_t cur_size, uint32_t total_size, const void* user_data);
参数
参数 | 类型 | 含义 |
json_msg | const char* | 新消息 |
index | uint32_t | 上传 Elem 元素在json_msg 消息的下标 |
cur_size | uint32_t | 上传当前大小 |
total_size | uint32_t | 上传总大小 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
示例
void MsgElemUploadProgressCallback(const char* json_msg, uint32_t index, uint32_t cur_size, uint32_t total_size, const void* user_data) {Json::Value json_value_msg;Json::Reader reader;if (!reader.parse(json_msg, json_value_msg)) {// JSON 解析失败return;}Json::Value& elems = json_value_msg[kTIMMsgElemArray];if (index >= elems.size()) {// index 超过消息元素个数范围return;}uint32_t elem_type = elems[index][kTIMElemType].asUInt();if (kTIMElem_File == elem_type) {}else if (kTIMElem_Sound == elem_type) {}else if (kTIMElem_Video == elem_type) {}else if (kTIMElem_Image == elem_type) {}else {// 其他类型元素不符合上传要求}}
TIMGroupAttributeChangedCallback
群属性变更回调。
原型
typedef void (*TIMGroupAttributeChangedCallback)(const char *group_id, const char* json_group_attribute_array, const void* user_data);
参数
参数 | 类型 | 含义 |
group_id | const char* | 群 ID |
json_group_attribute_array | const char* | 群提示列表 |
user_data | const void* | 用户自定义数据,IM SDK 只负责传回给回调函数 cb,不做任何处理 |
示例: json_group_attribute_array 示例
[{"group_attribute_key":"attribute_key1","group_attribute_value":"attribute_value1"}]
TIMGroupCounterChangedCallback
群计数器变更的回调。
原型
typedef void (*TIMGroupCounterChangedCallback)(const char *group_id, const char *group_counter_key, int64_t group_counter_new_value, const void *user_data);
参数
参数 | 类型 | 含义 |
group_id | const char* | 群组 ID |
group_counter_key | const char* | 变更的群计数器的 key |
group_counter_new_value | int64_t | 变更后的群计数器的 value |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
TIMGroupTipsEventCallback
群事件回调。
原型
typedef void (*TIMGroupTipsEventCallback)(const char* json_group_tip_array, const void* user_data);
参数
参数 | 类型 | 含义 |
json_group_tip_array | const char* | 群提示列表 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
TIMConvEventCallback
会话事件回调。
原型
typedef void (*TIMConvEventCallback)(enum TIMConvEvent conv_event, const char* json_conv_array, const void* user_data);
参数
参数 | 类型 | 含义 |
conv_event | enum TIMConvEvent | 会话事件类型,请参考 TIMConvEvent |
json_conv_array | const char* | 会话信息列表 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
示例:会话事件回调数据解析
void ConvEventCallback(TIMConvEvent conv_event, const char* json_conv_array, const void* user_data) {Json::Reader reader;Json::Value json_value;if (!reader.parse(json_conv_array, json_value)) {// JSON 解析失败return;}for (Json::ArrayIndex i = 0; i < json_value.size(); i++) { // 遍历会话类别Json::Value& convinfo = json_value[i];// 区分会话事件类型if (conv_event == kTIMConvEvent_Add) {}else if (conv_event == kTIMConvEvent_Del) {}else if (conv_event == kTIMConvEvent_Update) {}}}
TIMConvTotalUnreadMessageCountChangedCallback
会话未读消息总数变化。
原型
typedef void (*TIMConvTotalUnreadMessageCountChangedCallback)(int total_unread_count, const void* user_data);
参数
参数 | 类型 | 含义 |
total_unread_count | int | 未读的消息总数 |
user_data | const void* | 用户自定义数据,IM SDK 只负责传回给回调函数 cb,不做任何处理 |
TIMConvTotalUnreadMessageCountChangedByFilterCallback
会话未读消息总数变化。
原型
typedef void (*TIMConvTotalUnreadMessageCountChangedByFilterCallback)(const char* filter, int total_unread_count, const void* user_data);
参数
参数 | 类型 | 含义 |
filter | int | 获取未读总数的 filter, 详情请参考 TIMConversationListFilter |
total_unread_count | int | 未读的消息总数 |
user_data | const void* | 用户自定义数据,IM SDK 只负责传回给回调函数 cb,不做任何处理 |
TIMNetworkStatusListenerCallback
网络状态回调。
原型
typedef void (*TIMNetworkStatusListenerCallback)(enum TIMNetworkStatus status, int32_t code, const char* desc, const void* user_data);
参数
参数 | 类型 | 含义 |
status | enum TIMNetworkStatus | 网络状态,请参考 TIMNetworkStatus |
code | int32_t | 值为 ERR_SUCC 表示成功,其他值表示失败。详情请参考 错误码 |
desc | const char* | 错误描述字符串 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
示例:感知网络状态的回调处理
void NetworkStatusListenerCallback(TIMNetworkStatus status, int32_t code, const char* desc, const void* user_data) {switch(status) {case kTIMConnected: {printf("OnConnected ! user_data:0x%08x", user_data);break;}case kTIMDisconnected:{printf("OnDisconnected ! user_data:0x%08x", user_data);break;}case kTIMConnecting:{printf("OnConnecting ! user_data:0x%08x", user_data);break;}case kTIMConnectFailed:{printf("ConnectFailed code:%u desc:%s ! user_data:0x%08x", code, desc, user_data);break;}}}
TIMKickedOfflineCallback
被踢下线回调。
原型
typedef void (*TIMKickedOfflineCallback)(const void* user_data);
参数
参数 | 类型 | 含义 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
TIMUserSigExpiredCallback
用户票据过期回调。
原型
typedef void (*TIMUserSigExpiredCallback)(const void* user_data);
参数
参数 | 类型 | 含义 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
TIMOnAddFriendCallback
添加好友的回调。
原型
typedef void(*TIMOnAddFriendCallback)(const char* json_identifier_array, const void* user_data);
参数
参数 | 类型 | 含义 |
json_identifier_array | const char* | 添加好友列表 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
示例:json_identifier_array 示例
[ "user15" ]
TIMOnDeleteFriendCallback
删除好友的回调。
原型
typedef void(*TIMOnDeleteFriendCallback)(const char* json_identifier_array, const void* user_data);
参数
参数 | 类型 | 含义 |
json_identifier_array | const char* | 删除好友列表 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
示例:json_identifier_array 示例
[ "user15" ]
TIMUpdateFriendProfileCallback
更新好友资料的回调。
原型
typedef void(*TIMUpdateFriendProfileCallback)(const char* json_friend_profile_update_array, const void* user_data);
参数
参数 | 类型 | 含义 |
json_friend_profile_update_array | const char* | 好友资料更新列表 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
示例:json_friend_profile_update_array 示例
[{"friend_profile_update_identifier" : "user4","friend_profile_update_item" : {"friend_profile_item_group_name_array" : [ "group1", "group2" ],"friend_profile_item_remark" : "New Remark"}}]
TIMFriendAddRequestCallback
好友添加请求的回调。
原型
typedef void(*TIMFriendAddRequestCallback)(const char* json_friend_add_request_pendency_array, const void* user_data);
参数
参数 | 类型 | 含义 |
json_friend_add_request_pendency_array | const char* | 好友添加请求未决信息列表 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
示例:json_friend_add_request_pendency_array 示例
[{"friend_add_pendency_add_source" : "AddSource_Type_android","friend_add_pendency_add_wording" : "aaaa","friend_add_pendency_identifier" : "v222","friend_add_pendency_nick_name" : ""}]
TIMFriendApplicationListDeletedCallback
好友申请删除通知。
原型
typedef void(*TIMFriendApplicationListDeletedCallback)(const char* json_identifier_array, const void* user_data);
参数
参数 | 类型 | 含义 |
json_identifier_array | const char* | 删除好友请求的 userid 列表 |
user_data | const void* | 用户自定义数据,IM SDK 只负责传回给回调函数 cb,不做任何处理 |
示例: json_identifier_array 示例
[ "user15" ]
TIMFriendApplicationListReadCallback
好友申请已读通知,如果调用 setFriendApplicationRead 设置好友申请列表已读,会收到这个回调(主要用于多端同步)。
原型
typedef void(*TIMFriendApplicationListReadCallback)(const void* user_data);
参数
参数 | 类型 | 含义 |
user_data | const void* | 用户自定义数据,IM SDK 只负责传回给回调函数 cb,不做任何处理 |
TIMFriendBlackListAddedCallback
黑名单新增通知。
原型
typedef void(*TIMFriendBlackListAddedCallback)(const char* json_friend_black_added_array, const void* user_data);
参数
参数 | 类型 | 含义 |
json_friend_black_added_array | const char* | 新增黑名单列表 |
user_data | const void* | 用户自定义数据,IM SDK 只负责传回给回调函数 cb,不做任何处理 |
示例: json_friend_black_added_array 示例
[{"friend_profile_add_source": "","friend_profile_add_time": 0,"friend_profile_add_wording": "","friend_profile_custom_string_array": [{"friend_profile_custom_string_info_key": "Tag_Profile_Custom_Str","friend_profile_custom_string_info_value": "test3-lamar-value"}],"friend_profile_group_name_array": [],"friend_profile_identifier": "98826","friend_profile_remark": "","friend_profile_user_profile": {"user_profile_add_permission": 1,"user_profile_birthday": 2000,"user_profile_custom_string_array": [{"user_profile_custom_string_info_key": "Tag_Profile_Custom_Str","user_profile_custom_string_info_value": "test3-lamar-value"}],"user_profile_face_url": "test1-www.google.com","user_profile_gender": 2,"user_profile_identifier": "98826","user_profile_language": 1000,"user_profile_level": 3000,"user_profile_location": "shenzhen","user_profile_nick_name": "test change8888","user_profile_role": 4000,"user_profile_self_signature": "1111111"}}]
TIMFriendBlackListDeletedCallback
黑名单删除通知。
原型
typedef void(*TIMFriendBlackListDeletedCallback)(const char* json_identifier_array, const void* user_data);
参数
参数 | 类型 | 含义 |
json_identifier_array | const char* | 黑名单列表 |
user_data | const void* | 用户自定义数据,IM SDK 只负责传回给回调函数 cb,不做任何处理 |
示例: json_identifier_array 示例
[ "user15" ]
TIMLogCallback
日志回调。
原型
typedef void (*TIMLogCallback)(enum TIMLogLevel level, const char* log, const void* user_data);
参数
参数 | 类型 | 含义 |
level | enum TIMLogLevel | 日志级别,请参考 TIMLogLevel |
log | const char* | 日志字符串 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
TIMMsgUpdateCallback
消息更新回调。
原型
typedef void (*TIMMsgUpdateCallback)(const char* json_msg_array, const void* user_data);
参数
参数 | 类型 | 含义 |
json_msg_array | const char* | 更新的消息数组 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
说明
IM SDK 接口回调
TIMCommCallback
接口通用回调的定义。
原型
typedef void (*TIMCommCallback)(int32_t code, const char* desc, const char* json_params, const void* user_data);
参数
参数 | 类型 | 含义 |
code | int32_t | 值为 ERR_SUCC 表示成功,其他值表示失败。详情请参考 错误码 |
desc | const char* | 错误描述字符串 |
json_params | const char* | JSON 字符串,不同的接口,JSON 字符串不一样 |
user_data | const void* | IM SDK 负责透传的用户自定义数据,未做任何处理 |
说明
所有回调均需判断 code 是否等于 ERR_SUC,若不等于说明接口调用失败了,具体原因可以看 code 的值以及 desc 描述。详情请参考 错误码。以下接口的回调 TIMCommCallback 参数 json_params 均为空字符串"":
TIMLogin。
{"set_config_callback_log_level" : 2,"set_config_is_log_output_console" : true,"set_config_log_level" : 2,"set_config_proxy_info" : {"proxy_info_ip" : "","proxy_info_port" : 0},"set_config_user_config" : {"user_config_group_getinfo_option" : {"get_info_option_custom_array" : [],"get_info_option_info_flag" : 0xffffffff,"get_info_option_role_flag" : 0},"user_config_group_member_getinfo_option" : {"get_info_option_custom_array" : [],"get_info_option_info_flag" : 0xffffffff,"get_info_option_role_flag" : 0},"user_config_is_ingore_grouptips_unread" : false,"user_config_is_read_receipt" : false,"user_config_is_sync_report" : false}}
{"conv_active_time" : 1551269275,"conv_id" : "user2","conv_is_has_draft" : false,"conv_is_has_lastmsg" : true,"conv_last_msg" : {"message_client_time" : 1551101578,"message_conv_id" : "user2","message_conv_type" : 1,"message_elem_array" : [{"elem_type" : 0,"text_elem_content" : "12"}],"message_is_from_self" : false,"message_is_read" : true,"message_rand" : 3726251374,"message_sender" : "user2","message_seq" : 56858,"message_server_time" : 1551101578,"message_status" : 2},"conv_owner" : "","conv_type" : 1,"conv_unread_num" : 1}
[{"conv_active_time" : 1551269275,"conv_id" : "user2","conv_is_has_draft" : false,"conv_is_has_lastmsg" : true,"conv_last_msg" : {"message_client_time" : 1551235066,"message_conv_id" : "user2","message_conv_type" : 1,"message_elem_array" : [{"elem_type" : 0,"text_elem_content" : "ccccccccccccccccc"}],"message_is_from_self" : true,"message_is_read" : true,"message_rand" : 1073033786,"message_sender" : "user1","message_seq" : 16373,"message_server_time" : 1551235067,"message_status" : 2},"conv_owner" : "","conv_type" : 1,"conv_unread_num" : 0}]
{"message_client_time" : 1558598732,"message_conv_id" : "asd12341","message_conv_type" : 1,"message_custom_int" : 0,"message_custom_str" : "","message_elem_array" : [{"elem_type" : 0,"text_elem_content" : "test"}],"message_is_from_self" : true,"message_is_online_msg" : false,"message_is_peer_read" : false,"message_is_read" : true,"message_priority" : 1,"message_rand"