即時通訊:
- 兩人或多人實時的傳遞文字信息,文件、語音與視頻。
實現即時通訊(IM)的做法:
- XMPP
- 準備:客戶端需要用到xmppframework,服務器需要用到openfire
- 環信
- 準備:不需要自己搭建服務器。只需注冊成為開發者,創建App獲取key,下載SDK
- 融云
- 網易云信
- 親加
XMPP
- XMPP:The Extensible Messaging and Presence Protocol(可擴展通訊和表示協議)
- XMPP是一種基于XML的即時通訊協議,包括登錄,退出,獲取好友,發送消息等等的XML數據傳輸協議
- XMPP是一個典型的C/S架構,基本的網絡形式是客戶端通過TCP/IP連接到服務器,通過Socket建立連接,然后在之上傳輸XML流
- XMPP是一種類似于HTTP協議的一種數據傳輸協議,其過程就如同“解包裝--〉包裝”的過程。只需要理解其接收的類型及返回的類型,便可以很好的利用XMPP來進行數據通訊
環信
- 環信是一個第三平臺,提供即時通信(IM –Instant Messaging )的服務
XMPP和環信比較
- XMPP是一種協議,而環信是在XMPP的基礎上進行開發的
- 環信不用自己搭建服務器,省了搭建的成本,節約了開發的時間
即時通訊使用場景:
- 微信、QQ
- 電商中賣家和買家的溝通,買家與客服的溝通,賣家與客服的溝通。
(一)集成環信
1.注冊登錄環信
登錄官網
Snip20160902_259.png
注冊環信
Snip20160902_260.png
登錄環信
Snip20160902_261.png
2.創建應用
Snip20160902_262.png
Snip20160902_264.png
Snip20160902_265.png
3.下載SDK
Snip20160902_268.png
Snip20160902_269.png
4.查看環信開發文檔
Snip20160902_270.png
Snip20160902_272.png
Snip20160902_273.png
Snip20160902_274.png
5.創建xcode項目,劃分文件夾
Snip20160902_276.png
6.將SDK導入Xcode
Snip20160902_277.png
7.添加依賴庫
Snip20160902_278.png
8.添加-ObjC
Snip20160902_289.png
-ObjC如果寫錯了,運行程序將會提示如下錯誤
Snip20160902_284.png
9.編譯Xcode,無錯誤,進行下一步操作
Snip20160902_280.png
10.集成SDK的基礎功能
Snip20160902_282.png
11.在AppDelegate中添加以下方法
#import”EaseMob.h
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//registerSDKWithAppKey: 注冊的AppKey,詳細見下面注釋。
//apnsCertName: 推送證書名(不需要加后綴),詳細見下面注釋。
[[EaseMob sharedInstance] registerSDKWithAppKey:@"douser#istore" apnsCertName:@"istore_dev"];
[[EaseMob sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
return YES;
}
// APP進入后臺
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[EaseMob sharedInstance] applicationDidEnterBackground:application];
}
// APP將要從后臺返回
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[[EaseMob sharedInstance] applicationWillEnterForeground:application];
}
// 申請處理時間
- (void)applicationWillTerminate:(UIApplication *)application
{
[[EaseMob sharedInstance] applicationWillTerminate:application];
}
12.實現注冊
[[EaseMob sharedInstance].chatManager asyncRegisterNewAccount:@"8001" password:@"111111" withCompletion:^(NSString *username, NSString *password, EMError *error) {
if (!error) {
NSLog(@"注冊成功");
}
} onQueue:nil];
運行xcode
Snip20160902_292.png
點擊IM用戶
Snip20160902_293.png
出現用戶名為8001的字段,但是未登錄
Snip20160902_294.png
13.實現登錄
[[EaseMob sharedInstance].chatManager asyncLoginWithUsername:@"8001" password:@"111111" completion:^(NSDictionary *loginInfo, EMError *error) {
if (!error && loginInfo) {
NSLog(@"登錄成功");
}
} onQueue:nil];
運行xcode
Snip20160902_295.png
登錄成功,用戶名由灰色變為綠色
Snip20160902_297.png
(二)利用環信實現微信功能
- 強烈注意1:測試階段時,在兩個xcode之間使用的應用的appkey一定要一致,這樣才能進行測試 添加好友,刪除好友,以及多終端使用同意賬號擠掉其中一個賬號。因為如果appkey不一樣,那就代表了這是兩款應用,例如一款是微信,一款是QQ,你用微信添加 QQ應用的好友,QQ好友能看到才怪呢。
- 強烈注意2:
Snip20160903_298.png
- 強烈注意3:隱藏系統底部的Bar。目的:這樣你就可以創建控件來自定義底部的內容
101.84.gif
- 強烈注意4.點擊cell,push到聊天界面的時候,底部的View為什么會做下移的動畫?
101.86.gif
原因:細節問題
Snip20160903_5.png
解決辦法:將底部的約束 由之前的相對于底部tabbar改為相對于相對于屏幕底部
Snip20160903_5.png
效果
101.87.gif
- 強烈注意5:一定不要在設置約束的時候,提前給UIImageView添加圖片,否則達到的效果不是你想要的效果
例如:
101.95.gif
解決辦法:
101.96.gif
-
強烈注意6:
1.綠色背景圖片不僅沒有跟隨UILabel中的文字的改變而改變(約束問題)
2.而且綠色背景圖片還擋住了UILabel(解決辦法:綠色背景和UILabel在storyboard中的位置換過來,再換回去)
3.綠色背景圖片沒有進行拉伸操作
4.如果下面的做法遇到了問題,不要在UIImageView上添加圖片,最后一步再添加圖片。
Snip20160903_9.png -
對UILabel只需要設置頂部和右部約束
101.91.gif -
設置綠色背景圖片和UILabel上下左右間距相等
101.92.gif 拉伸綠色背景圖片
Snip20160904_15.png
-
讓綠色背景圖片的上下左右各多出UILabel一些像素
101.93.gif -
運行xcode,可以看到UILabel中的文字雖然設置了自動換行也沒效果
101.94.gif 修改面板中的屬性即可解決UILabel中的文字沒有自動換行的bug
步驟1:
Snip20160904_20.png
步驟2:
101.98.gif
- 優化綠色背景圖片和UILabel中文字的間距
Snip20160904_16.png
- 強烈注意7:計算每個cell的高度
Snip20160904_19.png
- 強烈注意8:利用屬性傳值,實現 點擊cell就顯示和哪一個用戶聊天
101.99.gif
- 強烈注意9:cell上的數據錯亂問題是由于cell的重用機制造成的
101.100.gif
-
強烈注意10:
Snip20160905_22.png解決辦法
Snip20160905_23.png
效果展示
- 注冊和登錄
101.101.gif
- 拒絕、同意添加好友
101.102.gif
-
網絡斷開,自動重連
101.103.gif
- 退出賬號,多終端登錄一方賬號自動被擠掉
101.104.gif
- 發送文本信息,語音信息,圖片信息
101.105.gif
- 未讀消息
101.106.gif
[LS](https://pan.baidu.com/s/1eSukwOa 密碼 dtnq)