iOS開(kāi)發(fā)中集成環(huán)信(小小終結(jié)者)

最近項(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)行顯示。


會(huì)話(huà)列表
聊天頁(yè)面


如何發(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é)束了曹鸠,愿大家加班不多工資多,男同胞都有女朋友彻桃,女同胞都有男朋友。??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邻眷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子耗溜,更是在濱河造成了極大的恐慌,老刑警劉巖抖拴,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腥椒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡笼蛛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)往湿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)妖异,“玉大人领追,你說(shuō)我怎么就攤上這事∪抟ぃ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵些膨,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我订雾,道長(zhǎng),這世上最難降的妖魔是什么洼哎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮谱净,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壕探。我一直安慰自己,他們只是感情好李请,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著较幌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪白翻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天岛琼,我揣著相機(jī)與錄音,去河邊找鬼巢株。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阁苞,可吹牛的內(nèi)容都是我干的祠挫。 我是一名探鬼主播悼沿,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼显沈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拉讯,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎魔慷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體院尔,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年纵顾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栋盹。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖汉额,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情榨汤,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布妓灌,位于F島的核電站,受9級(jí)特大地震影響啼器,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜端壳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一损谦、第九天 我趴在偏房一處隱蔽的房頂上張望岖免。 院中可真熱鬧照捡,春花似錦、人聲如沸栗精。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鹿寨。三九已至薪夕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間原献,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工姑隅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讲仰。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叮盘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柔吼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容