公司最近项目从JMessage到Tencent IM,使用到的腾讯IM。本篇文章会介绍下集成步骤和注意事项。
1.SDK集成
SDK集成我没有使用CocoaPods,因为每次pod install的时候总是失败,索性自己下载手动添加。
由于项目没有使用Tencent IM 的聊天UI,只添加ImSDK就可以了。这里我用的聊天的UI:aurora-imui,由于这个IMUI是swift写的,所以我聊天部分的代码全部swift的来写,将聊天模块独立出来,包括Tencent IM 用于消息接收的单例。不熟悉swift的小伙伴慎用。
2.实现
AppDelegate.m 代码
TIMSdkConfig *config = [[TIMSdkConfig alloc] init];
config.sdkAppId = TencentIMAppId;
config.accountType = TencentIMAccountType;
config.disableLogPrint = true;
[[TIMManager sharedInstance] setEnv:0];
[[TIMManager sharedInstance] initSdk:config];
__weak typeof(self) ws = self;
if (Userdefault(EmakeCityUserId) != nil && Userdefault(EmakeCityUserTencentSign) != nil) {
TIMLoginParam *param = [[TIMLoginParam alloc] init];
param.userSig = Userdefault(EmakeCityUserTencentSign);
param.identifier = Userdefault(EmakeCityUserId);
[[TIMManager sharedInstance] login:param succ:^{
if (ws.deviceToken != nil) {
TIMTokenParam *param = [[TIMTokenParam alloc] init];
param.busiId = TencentIMCerID;
[param setToken:ws.deviceToken];
[[TIMManager sharedInstance] setToken:param succ:^{
NSLog(@"-----> 上传 token 成功 ");
} fail:^(int code, NSString *msg) {
NSLog(@"-----> 上传 token 失败 ");
}];
}
} fail:^(int code, NSString *msg) {
NSLog(@"登录失败!");
}];
}
//初始化
[[TencentIMClient shared] initJMessageClient];
这里说下userSig获取,登录成功后通过UserId调用接口获取
LoginViewController.m 代码
if (userId != nil) {
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSData *deviceToken = delegate.deviceToken;
[delegate upDateMessageCount];
TIMLoginParam *param = [[TIMLoginParam alloc] init];
param.userSig = userSign;
param.identifier = userId;
[[TIMManager sharedInstance] login:param succ:^{
//登录成功
if (deviceToken) {
TIMTokenParam *param = [[TIMTokenParam alloc] init];
param.busiId = TencentIMCerID;
[param setToken:deviceToken];
NSLog(@"login-deviceToken---%@",deviceToken);
[[TIMManager sharedInstance] setToken:param succ:^{
NSLog(@"-----> 上传 token 成功 ");
} fail:^(int code, NSString *msg) {
NSLog(@"-----> 上传 token 失败 ");
}];
}
} fail:^(int code, NSString *msg) {
//登录失败
NSLog(@"code-%d,msg-%@",code,msg);
}];
}
这里说下TencentIMCerID,分别对应开发环境,和生产环境的的推送证书。
#define TencentIMCerIDDebug 13643
#define TencentIMCerID 13130
3.消息接收
class TencentIMClient: NSObject {
weak var delegate : TencentIMClientDelegate?
@objc var allMessageCount : NSNumber? = 0
private static var _sharedInstance : TencentIMClient?
//单例
@objc class func shared() -> TencentIMClient{
guard let instance = _sharedInstance else {
_sharedInstance = TencentIMClient()
return _sharedInstance!
}
return instance
}
@objc public func initJMessageClient() {
//添加消息监听
TIMManager.sharedInstance()?.add(TencentIMClient.shared())
if UserDefaults.standard.object(forKey: EmakeCityAllMessageCount) != nil{
let messageCount = UserDefaults.standard.object(forKey: EmakeCityAllMessageCount) as! String
self.allMessageCount = NSNumber.init(value: (Int(messageCount) ?? 0))
}else{
self.allMessageCount = 0
}
}
}
extension TencentIMClient : TIMMessageListener {
func onNewMessage(_ msgs: [Any]!) {
if msgs.count > 0 {
let msg = msgs.first as! TIMMessage
for i in 0..<msg.elemCount() {
if let elem = msg.getElem(i) as? TIMCustomElem {
do {
let json:[String:Any]? = try JSONSerialization.jsonObject(with: elem.data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String:Any]
print("消息----%@",json ?? [:])
}catch{
}
}
}
}
4.测试上线
注意打包测试消息的时候环境和证书环境一致,生产环境的消息测试在TestFlight测试无误后上线。直接打包上线会报错90080,90087,90209,90125。
打包上线请参考:# ios上架报错90080,90087,90209,90125 解决办法
MarkDown的书写语法真的好用!