最近項(xiàng)目中要加入即時(shí)聊天的模塊,通過(guò)對(duì)一些三方開(kāi)放平臺(tái)的了解缀磕,最終選擇了環(huán)信(之前對(duì)環(huán)信的了解相對(duì)比較多)。
大家可以看官方文檔(http://docs.easemob.com/im/300iosclientintegration/20iossdkimport)導(dǎo)入環(huán)信的SDK袜蚕,我是使用pod方式對(duì)環(huán)信的SDK進(jìn)行集成的。關(guān)于SDK的集成和基礎(chǔ)功能的使用大家完全可以根據(jù)官方文檔去操作廷没,我在這里只是說(shuō)說(shuō)我遇到的問(wèn)題以及解決問(wèn)題的方法垂寥。
1.將本App中的用戶(hù)在環(huán)信那邊進(jìn)行注冊(cè)。
集成環(huán)信首先要將本App的已有用戶(hù)以及新注冊(cè)的用戶(hù)在環(huán)信那邊進(jìn)行注冊(cè)滞项,注冊(cè)是在后臺(tái)進(jìn)行的,登錄是在客戶(hù)端進(jìn)行的文判。在環(huán)信那邊進(jìn)行注冊(cè)的時(shí)候密碼只需進(jìn)行一下加密就行,可用戶(hù)名卻不能是中文因此不能直接使用App的用戶(hù)去環(huán)信那邊進(jìn)行注冊(cè)戏仓。我們的做法是利用用戶(hù)的用戶(hù)ID與固定字母的組合進(jìn)行拼接然后作為用戶(hù)名去環(huán)信那邊進(jìn)行注冊(cè)。
2.異地登錄之后消息無(wú)法發(fā)送
我們項(xiàng)目之前是沒(méi)有做單點(diǎn)登錄的赏殃,可如果集成了環(huán)信就要和環(huán)信保持一致做成單點(diǎn)登錄。如果環(huán)信用戶(hù)在其他地方進(jìn)行了登錄會(huì)調(diào)用一個(gè)回調(diào)方法榜揖,方法名:
-(void)userAccountDidLoginFromOtherDevice{}
此方法是代理EMClientDelegate中的方法。設(shè)置代理的方法:
[[EMClient sharedClient] addDelegate:self delegateQueue:nil];
在調(diào)用此方法的時(shí)候給用戶(hù)一個(gè)對(duì)話(huà)框举哟,在用戶(hù)點(diǎn)擊確定的時(shí)候進(jìn)行退出登錄的操作(在調(diào)用此方法的時(shí)候就立即做退出登錄的操作是不是更好)。退出登錄包括App用戶(hù)的退出登錄以及環(huán)信用戶(hù)的退出登錄操作妨猩。
3.刪除聊天頁(yè)面底部菜單中不需要的的功能按鈕
[self.chatBarMoreView removeItematIndex:4];
4.聊天頁(yè)面設(shè)置聊天雙方的頭像和昵稱(chēng)
如果不進(jìn)行設(shè)置的話(huà)會(huì)有一個(gè)默認(rèn)的頭像壶硅,昵稱(chēng)是在環(huán)信那邊進(jìn)行注冊(cè)的時(shí)候使用的用戶(hù)名。
設(shè)置本用戶(hù)的頭像容易些森瘪,直接在登錄的時(shí)候?qū)⒈居脩?hù)的頭像以及昵稱(chēng)存儲(chǔ)下來(lái),然后在設(shè)置頭像和昵稱(chēng)的時(shí)候直接進(jìn)行賦值扼睬。
設(shè)置對(duì)方的頭像和昵稱(chēng)稍微麻煩些。我們的項(xiàng)目進(jìn)入聊天頁(yè)面有三種方式:1.點(diǎn)擊某個(gè)用戶(hù)的帖子頁(yè)面的發(fā)消息按鈕 2.點(diǎn)擊本用戶(hù)的聊天列表中某個(gè)對(duì)話(huà) ?3.點(diǎn)擊推送消息窗宇。
要想設(shè)置對(duì)方的頭像和昵稱(chēng)我們需要在一個(gè)用戶(hù)發(fā)送消息的時(shí)候?qū)⒆约旱念^像和昵稱(chēng)也一起發(fā)送出去,在接收到對(duì)方的頭像和昵稱(chēng)的時(shí)候?qū)⑺麄兇鎯?chǔ)起來(lái)军俊,然后在需要顯示的時(shí)候再取出來(lái)進(jìn)行顯示。
如何發(fā)送頭像和昵稱(chēng)呢担败?
我們需要重寫(xiě)發(fā)送文本消息的方法镰官,方法名:
- (void)sendTextMessage:(NSString *)text withExt:(NSDictionary*)ext;
我們將用戶(hù)的頭像和昵稱(chēng)放在擴(kuò)展字ext中。
具體實(shí)現(xiàn):
- (void)sendTextMessage:(NSString *)text withExt:(NSDictionary*)ext
{
NSMutableDictionary * mutableDic = [NSMutableDictionary dictionary];
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSString * uid = [defaults objectForKey:USERID];
NSString * userName = [defaults objectForKey:USERNAME];
NSString * hxUid = [NSString stringWithFormat:@"zyjx%@", uid];
mutableDic[@"nickname"] = userName;
mutableDic[@"avatarURLPath"] = [defaults objectForKey:AVATAR];
mutableDic[@"conversationID"] = hxUid;
[super sendTextMessage:text withExt:mutableDic];
}
我們還需要將用戶(hù)的ID發(fā)送過(guò)去作為用戶(hù)的唯一標(biāo)識(shí)泳唠。
在什么時(shí)候接收到其他人發(fā)來(lái)的消息以及如何存儲(chǔ)其他人發(fā)來(lái)的包括頭像、昵稱(chēng)笨腥、ID的擴(kuò)展字?
在EMChatManagerDelegate代理方法中有一個(gè)收到消息的回調(diào)方法士鸥,方法名:
- (void)messagesDidReceive:(NSArray *)aMessages { }
具體實(shí)現(xiàn):
- (void)messagesDidReceive:(NSArray *)aMessages {
NSLog(@"收到了環(huán)信的消息...");
for (EMMessage *msg in aMessages) {
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:msg.ext forKey:msg.from];
[defaults synchronize];
}
設(shè)置聊天雙方的頭像以及昵稱(chēng)的實(shí)現(xiàn)代碼:
#pragma mark - EaseMessageViewControllerDataSource
- (id)messageViewController:(EaseMessageViewController *)viewController? ? ? ? ? ? ? ? ? ? ? ? ? modelForMessage:(EMMessage *)message{? ? //用戶(hù)可以根據(jù)自己的用戶(hù)體系,根據(jù)message設(shè)置用戶(hù)昵稱(chēng)和頭像? ?
id model = nil;
model = [[EaseMessageModel alloc] initWithMessage:message];
if (model.isSender == YES) {? ? // 發(fā)送方頭像
model.avatarImage = [UIImage imageNamed:@"touxiang_moren"];//默認(rèn)頭像
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSString * userName = [defaults objectForKey:USERNAME];
model.avatarURLPath = [defaults objectForKey:AVATAR];;//頭像網(wǎng)絡(luò)地址
model.nickname = userName;//用戶(hù)昵稱(chēng)
}else{? // 接收方頭像
NSLog(@"===personDic:%@", self.personDic);
model.avatarImage = [UIImage imageNamed:@"touxiang_moren"];//默認(rèn)頭像
NSString * avatarURLPath;
NSString * nickName;
if (self.personDic) {
avatarURLPath = self.personDic[@"avatarURLPath"];//頭像網(wǎng)絡(luò)地址
nickName = self.personDic[@"nickname"];//用戶(hù)昵稱(chēng)
}else{
NSUserDefaults * defaults =? [NSUserDefaults standardUserDefaults];
NSDictionary * dic = [defaults objectForKey:self.conversation.conversationId];
NSLog(@"dic:%@", dic);
avatarURLPath = dic[@"avatarURLPath"];//頭像網(wǎng)絡(luò)地址
nickName = dic[@"nickname"];//用戶(hù)昵稱(chēng)
}
model.avatarURLPath = avatarURLPath;
model.nickname = nickName;
}
return model;
}
(上面這段代碼有點(diǎn)長(zhǎng)础淤,選擇自己想要的就好)
5.當(dāng)App處于后臺(tái)的時(shí)候顯示收到的推送消息
同樣在收到環(huán)信消息的回調(diào)方法中處理。代碼:
- (void)messagesDidReceive:(NSArray *)aMessages {
NSLog(@"收到了環(huán)信的消息...");
UIApplicationState state = [[UIApplication sharedApplication] applicationState];
// App在后臺(tái)
if (state == UIApplicationStateBackground) {
//發(fā)送本地推送
if (NSClassFromString(@"UNUserNotificationCenter")) { // ios 10
// 設(shè)置觸發(fā)時(shí)間
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:0.01 repeats:NO];
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.sound = [UNNotificationSound defaultSound];
// 提醒币砂,可以根據(jù)需要進(jìn)行彈出,比如顯示消息詳情决摧,或者是顯示“您有一條新消息”
content.body = @"有人發(fā)來(lái)新消息";
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:msg.messageId content:content trigger:trigger];
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:nil];
}else {
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = [NSDate date]; //觸發(fā)通知的時(shí)間
notification.alertBody = @"有人發(fā)來(lái)新消息";
notification.alertAction = @"Open";
notification.timeZone = [NSTimeZone defaultTimeZone];
notification.soundName = UILocalNotificationDefaultSoundName;
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
}
}
}
代碼直接拷貝就可以。
6.當(dāng)退出App(殺死App)后收不到環(huán)信的消息推送
這是因?yàn)槲以诖a里使用了生產(chǎn)環(huán)境下的推送證書(shū)的證書(shū)名掌桩,而App的當(dāng)前環(huán)境還是開(kāi)發(fā)環(huán)境姑食。將App打包之后安裝到手機(jī)上再將App退出就能收到環(huán)信的推送消息了。
暫時(shí)想到的在集成環(huán)信過(guò)程中遇到的問(wèn)題以及解決方法就這些音半,如果今后遇到新的問(wèn)題以及解決方法再補(bǔ)充。
本篇文章到這里就結(jié)束了曹鸠,愿大家加班不多工資多,男同胞都有女朋友彻桃,女同胞都有男朋友。??