先上圖
申請(qǐng)帳號(hào)準(zhǔn)備工作
1.首先在集成環(huán)信的時(shí)候先去查看下環(huán)信官方文檔茁帽,這里要說(shuō)的是因?yàn)榄h(huán)信版本變更,官方文檔的很多東西無(wú)法使用,我們只是需要先了解一下旁壮。
2.然后申請(qǐng)環(huán)信賬號(hào)监嗜,下載對(duì)應(yīng)的sdk文件
3.記得創(chuàng)建推送證書和記錄appkey,這里安裝官方文檔就可以
集成SDK
1.首先要說(shuō)明的是官方給了倆個(gè)版本的SDK
a.不包含實(shí)時(shí)語(yǔ)音版本 SDK(HyphenateLite)抡谐,引用時(shí)#import<HyphenateLite/HyphenateLite.h>
b.包含實(shí)時(shí)語(yǔ)音版本 SDK(Hyphenate)裁奇,引用時(shí) #import<Hyphenate/Hyphenate.h>
這里要說(shuō)的是,因?yàn)榄h(huán)信的demo是基于包含實(shí)時(shí)語(yǔ)音進(jìn)行創(chuàng)建的麦撵,如果選擇不包含的刽肠,在下一步拖入SDK的時(shí)候很多地方需要修改注釋,為了避免這一步免胃,我們選中第二個(gè)音五,因?yàn)楹芏鄷r(shí)候需要修改源碼,所以我們選擇本地拷貝的方式
2.現(xiàn)在打開(kāi)下載好的環(huán)信demo羔沙,將對(duì)應(yīng)的倆個(gè)文件夾添加進(jìn)來(lái)
這倆個(gè)文件,一個(gè)是環(huán)信自身的邏輯處理扼雏,一個(gè)是環(huán)信已經(jīng)寫好的一些UI界面诞挨,聊天,添加好友那些
a.然后按照官方文檔進(jìn)行添加依賴庫(kù)
SDK 包含實(shí)時(shí)語(yǔ)音依賴庫(kù)有:
CoreMedia.framework
AudioToolbox.framework
AVFoundation.framework
MobileCoreServices.framework
ImageIO.framework
libc++.dylib
libz.dylib
libstdc++.6.0.9.dylib
libsqlite3.dylib
libiconv.dylib
(如果使用的是 xcode7呢蛤,后綴為 tbd惶傻。)
b.SDK 不支持 bitcode,向 Build Settings → Linking → Enable Bitcode 中設(shè)置 NO其障。
3.這里就可以進(jìn)行編譯了银室,以下是我編譯的時(shí)候出現(xiàn)的問(wèn)題
a.找不到uikt 的方法,這點(diǎn)是添加EaseUI是沒(méi)有將對(duì)應(yīng)的.pch文件路徑放對(duì)励翼,一般來(lái)說(shuō)蜈敢,我們項(xiàng)目本身已經(jīng)有.pch文件了,只需要?jiǎng)h除它汽抚,然后在項(xiàng)目文件的.pch文件中添加就好了
注意抓狭,OBJC千萬(wàn)不要忘。
b.如果項(xiàng)目中已經(jīng)用到了MBProgressHUD和MJRefresh造烁,在編譯的過(guò)程中需要會(huì)進(jìn)行重復(fù)導(dǎo)入報(bào)錯(cuò)否过,將EaseUI文件中的三方庫(kù)刪除掉就好
c.還有一種報(bào)錯(cuò),這點(diǎn)我不知道因?yàn)槭裁床洋赡苁荕WPhotoBrowser 的一些方法與SDWebImage沖突了苗桂,我將報(bào)錯(cuò)的地方注釋掉就好了
d 這個(gè)錯(cuò)誤官方上沒(méi)有提,但是他給了一個(gè)圖片告组,需要我們自己添加庫(kù)
在Build Phases 添加
e 做完這些應(yīng)該可以編譯成功了煤伟,但是官方文檔給了一個(gè)需要修改的地方是關(guān)于app上架的,我這里就抄來(lái)了
集成動(dòng)態(tài)庫(kù)上傳AppStore
由于 iOS 編譯的特殊性,為了方便開(kāi)發(fā)者使用便锨,我們將 i386 x86_64 armv7 arm64 幾個(gè)平臺(tái)都合并到了一起围辙,所以使用動(dòng)態(tài)庫(kù)上傳appstore時(shí)需要將i386 x86_64兩個(gè)平臺(tái)刪除后,才能正常提交審核
在SDK當(dāng)前路徑下執(zhí)行以下命令刪除i386 x86_64兩個(gè)平臺(tái)
實(shí)時(shí)音視頻版本Hyphenate.framework
lipo Hyphenate.framework/Hyphenate -thin armv7 -output Hyphenate_armv7
lipo Hyphenate.framework/Hyphenate -thin arm64 -output Hyphenate_arm64
lipo -create Hyphenate_armv7 Hyphenate_arm64 -output Hyphenate
mv Hyphenate Hyphenate.framework/
不包含實(shí)時(shí)音視頻版本HyphenateLite.framework
lipo HyphenateLite.framework/HyphenateLite -thin armv7 -output HyphenateLite_armv7
lipo HyphenateLite.framework/HyphenateLite -thin arm64 -output HyphenateLite_arm64
lipo -create HyphenateLite_armv7 HyphenateLite_arm64 -output HyphenateLite
mv HyphenateLite HyphenateLite.framework/
現(xiàn)在就是要開(kāi)始代碼方面
先看環(huán)信的demo
1.首先你要明白EaseUI 中已經(jīng)將很大部分的功能全部實(shí)現(xiàn)了放案,沒(méi)有必要在去自己建立UI和控制器酌畜,保存的數(shù)據(jù)也用環(huán)信提供的model,我們要做的是,根據(jù)demo中的邏輯關(guān)系蔓肯,將環(huán)信的初始化寫到我們項(xiàng)目文件中螟够,然后進(jìn)行修改UI蔓彩。主要是環(huán)信AppDelegate 中的方法,以及擴(kuò)展類中的那些注冊(cè)通知和初始化控制器考婴。因?yàn)槲覍?duì)于擴(kuò)展類方面不是很厲害,于是我就將我能夠使用的方法全部在AppDelegate 和對(duì)應(yīng)的根控制器中實(shí)現(xiàn)了
// 注冊(cè)環(huán)信SDK以及推送證書
[[EaseSDKHelper shareHelper] hyphenateApplication:application
didFinishLaunchingWithOptions:launchOptions
appkey:HuanXingAppKey
apnsCertName:HuanXingPush
otherConfig:@{kSDKConfigEnableConsoleLogger:[NSNumber numberWithBool:YES],@"easeSandBox":@NO}];
[EaseSDKHelper shareHelper];// 初始化環(huán)信相關(guān)回調(diào)
[self easemobApplication:application didReceiveRemoteNotification:launchOptions];
EMError *error =[[EMClient sharedClient]initializeSDKWithOptions:[EMOptions optionsWithAppkey:HuanXingAppKey]];
if (!error) {
NSLog(@"初始化成功");
}
// APP進(jìn)入后臺(tái)
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[EMClient sharedClient] applicationDidEnterBackground:application];
}
// APP將要從后臺(tái)返回
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[[EMClient sharedClient] applicationWillEnterForeground:application];
}
然后就是按照官方demo中的登錄繼續(xù)在我的登錄界面寫功能
-(void)setHuanxing{
//只有開(kāi)放注冊(cè)時(shí)催烘,才可以客戶端注冊(cè)沥阱。開(kāi)放注冊(cè)是為了測(cè)試使用,正式環(huán)境中不推薦使用該方式注冊(cè)環(huán)信賬號(hào)伊群。
// 授權(quán)注冊(cè)的流程應(yīng)該是您服務(wù)器通過(guò)環(huán)信提供的 REST API 注冊(cè)考杉,之后保存到您的服務(wù)器或返回給客戶端。
#pragma 正式版需要注意的是在用戶登錄之后要在后臺(tái)根據(jù)他的手機(jī)號(hào)進(jìn)行注冊(cè)舰始,然后將注冊(cè)成功的姓名和密碼告訴前端崇棠,前端進(jìn)行環(huán)信登錄
// error = [[EMClient sharedClient] registerWithUsername:@"15824326170" password:@"123456"];
// if (error==nil) {
// NSLog(@"注冊(cè)成功");
// }
//然后進(jìn)行環(huán)信登錄
EMError *error1 = [[EMClient sharedClient] loginWithUsername:@"123123123" password:@"123456"];
if (!error1) {
NSLog(@"登錄成功");
[[ApplyViewController shareController] loadDataSourceFromLocalDB];
}
//自動(dòng)登錄需要在有接口的時(shí)候進(jìn)行調(diào)試
EMError*error2 = [[EMClient sharedClient] loginWithUsername:@"123123123" password:@"123456"];
if (!error2)
{
[[EMClient sharedClient].options setIsAutoLogin:YES];
NSLog(@"登陸成功2");
}
//這是退出登錄的時(shí)候,需要跟用戶退出的時(shí)候進(jìn)行同步
/*
EMError *error = [[EMClient sharedClient] logout:YES];
if (!error) {
NSLog(@"退出成功");
}
*/
[self loginWithUsername:@"123123123" password:@"123456"];
}
//登陸后的操作異步登錄
- (void)loginWithUsername:(NSString *)username password:(NSString *)password{
//異步登陸賬號(hào)
__weak typeof(self) weakself = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
EMError *error = [[EMClient sharedClient] loginWithUsername:username password:password];
dispatch_async(dispatch_get_main_queue(), ^{
[weakself hideHud];
if (!error) {
//設(shè)置是否自動(dòng)登錄
[[EMClient sharedClient].options setIsAutoLogin:YES];
//獲取數(shù)據(jù)庫(kù)中數(shù)據(jù)
[MBProgressHUD showHUDAddedTo:weakself.view animated:YES];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/** 數(shù)據(jù)庫(kù)操作*/
[[EMClient sharedClient] migrateDatabaseToLatestSDK];
dispatch_async(dispatch_get_main_queue(), ^{
/** 獲取用戶所有群組*/
[[ChatDemoHelper shareHelper] asyncGroupFromServer];
/** 獲取所有會(huì)話,如果內(nèi)存中不存在會(huì)從DB中加載*/
[[ApplyViewController shareController] loadDataSourceFromLocalDB];
[[ChatDemoHelper shareHelper] asyncConversationFromDB];
//從服務(wù)器獲取推送屬性
[[ChatDemoHelper shareHelper] asyncPushOptions];
// [MBProgressHUD hideAllHUDsForView:weakself.view animated:YES];
//發(fā)送自動(dòng)登陸狀態(tài)通知
[[NSNotificationCenter defaultCenter] postNotificationName:KNOTIFICATION_LOGINCHANGE object:@([[EMClient sharedClient] isLoggedIn])];
//保存最近一次登錄用戶名
[weakself saveLastLoginUsername];
});
});
}
});
});
}
#pragma mark - private
- (void)saveLastLoginUsername
{
NSString *username = [[EMClient sharedClient] currentUsername];
if (username && username.length > 0) {
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud setObject:username forKey:[NSString stringWithFormat:@"em_lastLogin_username"]];
[ud synchronize];
}
}
這里需要說(shuō)一句的是 [[ApplyViewController shareController] loadDataSourceFromLocalDB];這個(gè)方法就是我自己從擴(kuò)展類中添加到這里的丸卷,這個(gè)方法是獲取好友申請(qǐng)列表數(shù)量枕稀,如果沒(méi)有這個(gè)方法,好友數(shù)量在開(kāi)始進(jìn)入app 是顯示為0的谜嫉。
2.然后我們可以觀察官方demo
a.ChatDemoHelper 這個(gè)類是主要的萎坷,我們必須要看懂這個(gè)類以及里面的方法,我自己標(biāo)記了一下各個(gè)控制對(duì)應(yīng)的頁(yè)面沐兰,然后看這個(gè)單利里面的方法哆档, 它將環(huán)信用到的通知以及回調(diào)方法全部寫好了,自己可以根據(jù)demo多跳轉(zhuǎn)跳轉(zhuǎn)看看
我們需要注意的地方就是 MainViewController 這個(gè)控制器住闯,很多項(xiàng)目已經(jīng)存在根控制器瓜浸,所以需要將它里面的方法放到項(xiàng)目的根控制器中,然后就是所有對(duì)應(yīng)的聊天界面 會(huì)話界面的控制器也會(huì)發(fā)生改變比原,我們只需要改成我們對(duì)應(yīng)的就行斟叼。
這個(gè)時(shí)候可能會(huì)報(bào)錯(cuò),原因是少了一些類以及框架春寿,我這里將紅包和實(shí)時(shí)語(yǔ)音注釋掉后朗涩,又自已一個(gè)一個(gè)進(jìn)行的添加,這得慢慢來(lái)绑改。
b 這里要說(shuō)的一點(diǎn)就是可以自己寫一個(gè)控制器繼承環(huán)信對(duì)應(yīng)的會(huì)話列表控制器谢床,當(dāng)然也可以用它的兄一,然后進(jìn)行修改就行,這也是需要時(shí)間和細(xì)心识腿,因?yàn)樵谇懊孢M(jìn)行的時(shí)候很可能會(huì)出現(xiàn)一些代碼功能不實(shí)現(xiàn)的狀況出革。
c .在做這些的時(shí)候,你應(yīng)該會(huì)看到環(huán)信對(duì)應(yīng)的修改頭像和昵稱的方法渡讼,以及修改默認(rèn)頭像的地方骂束,有的默認(rèn)頭像是在EaseUI對(duì)應(yīng)的文件中,需要打開(kāi)進(jìn)行修改成箫,或者你自己定義的一些功能圖片
d 然后就是修改昵稱和頭像的問(wèn)題展箱,這個(gè)需要在我們后臺(tái)保存好后進(jìn)行存在model里面,個(gè)人還沒(méi)有做蹬昌,但是環(huán)信的model里面已經(jīng)寫了混驰,我覺(jué)得只要我們寫到對(duì)應(yīng)的model里面就可以了
存到這個(gè)model 里面就行 我覺(jué)得 UserProfileManager,等我最后優(yōu)化