iOS開源 - LLWeChat:實現IM基本功能,并且在細節、完成度、bugfree上媲美任何主流IM應用
LLWeChat 1.0
本README包含18張效果圖,約36M大小,載入時間較長,請耐心等待
寫在前面
1、我是以極認真的態度來做這個項目,我不想把它做成一個只能展示給人看的Demo,經不起實際使用,只能遠觀不可褻玩, 那樣沒什么意思。
2、我不想使用假數據, 所以消息通訊使用環信SDK,保證聊天完全真實。同時對環信SDK進行了徹底封裝,做到業務代碼和環信完全隔離。
3、在整個開發過程中,我以媲美微信為目標, 同時參考支付寶、易信、陌陌和釘釘。以萬為目標必能過千,這個項目還是有閃光點的。
4、整個開發過程就我一人,沒有什么Word文檔,我的產品文檔就是赤裸裸的截屏,到現在為止微信截屏將近300張。
你們一定好奇,干嗎要截屏這么多,因為微信的細節是做的最到位的,我想這也是微信一家獨大的一個成功因素吧 。
5、我只專注于聊天模塊,其他功能一概而過,點到為至。添加好友是項目完整性需要,消息搜索純粹就是想換換大腦,做點別的。
6、每一個功能,我會把自己的APP和這五款APP在細節、完成度、bugfree這三個方面作對比,直到我滿意為止。我說我的APP不比任何商用的差,不是我站在這張嘴胡咧咧,而是我在一個細節一個細節的對比中、完善中得出的:LLWeChat,不遜于任何人。
7、這個項目今年07-15開始,原來打算練練手就得了,沒想到越做越認真, 做了3個月,國慶后完善了1個月。由于一個人精力實在有限,第一個版本到此結束。
8、我IOS是閱讀開源項目入的門,這個項目躺在硬盤里也沒什么用,涼出來希望對大家有所幫助。
雕琢細節
要想媲美微信,就必須要雕琢細節,在細節上下功夫,做到位。否則細節上馬馬虎虎,媲美微信就是一句空話。
(一)、消息輸入
1、輸入面板基本功能
2、輸入框動態調整高度
- 細節1:當行數增加、減少時,做出動畫,而不是一步到位。
- 細節2:除非用戶滾動文本,否則文本編輯時不允許出現某一行只漏出一部分。
3、草稿
當一個會話有草稿時,應該在會話push動畫開始時就完成如下工作:
讀取最新13條消息,解析消息,獲取消息縮略圖,布局輸入框并顯示草稿最后一行,彈出鍵盤(尤其是第三方鍵盤),布局TableView。
當首次進入會話時,如何高效完成這些工作是一個很大的挑戰。我花費了許多力氣,但還是不太滿意。
(二)、GIF
- 細節1:內存大小。把GIF轉成imageView,內存會暴漲,不可行。只能播一幀獲取一幀圖片
- 細節2:重用。GIF快速重用時,因為是后臺獲取幀圖片需要處理好同步,還得記住播放進度,以便重用回來的時候繼續播放
(三)、文本
- 細節1:文本中包含的鏈接有三個行為:點擊、長按、高亮。高亮要細心處理,否則效果會很糟糕:滾動文本觸及了鏈接不高亮,點擊鏈接必高亮,高亮后依然允許滾動,觸發滾動取消高亮等
- 細節2:文本全屏瀏覽的觸發方式(下面有說明),全屏瀏覽進入退出時的動畫。
- 細節3:AppleSDK識別文本中URL不太精確,需要自己提供正則式,暫未實現。
1、文本鏈接
(四)、地圖
- 細節1:地圖附近POI搜索,我想根據用戶位置、當前時間等做推薦式搜索,暫未實現。
- 細節2:點擊地圖Cell后要支持側滑返回,系統默認的NavigationBar交互式返回動畫效果不太好,但也可以接受。
1、地圖基本功能
2、地圖搜索
(五)、ImagePicker
ImagePicker做了PhotoKit和AssetLibrary適配
- 細節1:整個ImagePicker的核心就是決定一張照片獲取方式是同步還是異步,照片質量是fullScreen還是fullResolution;
AssetLibrary框架要自己決定, 而PhotoKit框架替你做了一部分。 - 細節2:需要考慮照片或視頻已經被用戶刪除的情況,這時選擇、全屏瀏覽、發送要特殊處理下
1、照片瀏覽
2、照片發送
3、視頻發送
(六)、照片視頻瀏覽
- 細節1:長照片彈出彈入動畫,在ImageView做Frame動畫的同時,其包含的image也會從當前偏移位置滾動到目標偏移位置。
- 細節2:視頻使用AVPlayer播放,而AVPlayer需要占用主線程,使得快速瀏覽時明顯卡頓,我的解決方法就是用視頻第一幀圖片代替視頻滾動,滾動結束時關聯AVPlayer和VideoURL,當用戶點擊播放按鈕或拖動進度條時把圖片換成真正的視頻。
- 細節3:適應屏幕旋轉。特別當用戶在設備水平朝向時,點擊返回。需要先把照片視頻旋轉到豎立方向,然后再做彈出動畫。
- 細節4:照片視頻瀏覽時的bottomBar的切換,照片視頻下載狀態的更新,這塊規則很多很雜,不列舉了
1、照片視頻彈入彈出動畫
2、視頻下載
(七)、語音
- 細節1:按壓錄音按鈕小于0.25秒, 彈錄音太短Tip,大于則變按鈕title為“松開 結束”同時錄音開始;小于1.25秒,彈錄音太短Tip;大于1.25秒出現錄音動畫,此時錄音時長剛好1秒。51秒時彈倒計時,60秒時強制結束錄音并取消錄音按鈕按壓事件。
- 細節2:錄音時APP進入后臺,則結束并發送錄音。再返回APP時,錄音按鈕第一次點擊無效,不清楚原因,暫未解決。
- 細節3:播放錄音有:音量太低Tip,播放模式切換,未讀聲音聯播等
1、語音錄制
2、錄音最大時長
(八)、緩存
1、MessageCell緩存
- GIF、日期消息只重用,不緩存
- 整個APP默認緩存MessageCell 1300條 ,超出的消息采用TableView重用機制
- 退出當前會話后,保留會話最近MessageCell 130條
- 自定義數值,可在 LLMessageCellManager 中更改
2、照片、視頻縮略圖
- 本項目沒有采用環信SDK提供的縮略圖,而是APP負責縮略圖的創建、存儲、刪除
- 照片、視頻MessageCell不可見時就清空縮略圖,可見時再讀取縮略圖
- 為了加快縮略圖讀取,內存中默認緩存縮略圖上限 80M
- APP運行時會把一段時間內未讀取過的縮略圖從硬盤上刪除
- 自定義數值可在 LLMessageThumbnailManager 中更改
(九)、其他
其他界面只實現了最簡單的功能
1、批量刪除
-
細節1:彈出的ActionSheet在鍵盤之上
2、添加好友
3、消息搜索
4、新消息通知
項目基本信息
- 開發語言:Objective-C
- 最低部署版本:IOS8.0
- 支持IOS版本:IOS8、IOS9、IOS10
- 手機適配:iPhone6 plus最好,iPhone6次之。其他機型沒有兼顧到
第三方庫
- 環信SDK( 71M ),已包含在項目中
- 高德SDK( 15.6M ),已包含在項目中
- MBProgressHUD,已包含在項目中
- Github下載項目Zip包大小: 40M
項目安裝
1、切換到 Podfile 文件所在目錄,運行 pod install (當前版本Podfile內容為空)
2、使用高德地圖,請到 高德官網注冊APP Key ,然后替換掉 LLGDConfig.h 頭文件中APPKey即可。
注冊步驟為:注冊成為開發者->點擊右上角控制臺->我的應用->創建新應用
3、運行 LLWeChat.xcworkspace
項目目錄
目錄 | 說明 |
---|---|
General | 該目錄包含和項目耦合性最低的通用模塊,包括聲音管理器、照片選取器、通用UI、Utilities等 |
Server | 該目錄封裝環信SDK,環信SDK一共封裝成四個類: 1、LLClientManager:管理用戶的注冊、登陸、登出等 2、LLChatManager:管理會話消息的收發、本地消息的加載更新等 3、LLContactManager: 管理好友列表 4、LLSDKError:環信SDK錯誤碼的封裝 |
Data | 數據目錄,包括Config、Cache、Model等 |
Client | 該目錄是項目的主體,按照業務功能分類,分為會話、聊天、搜索、通訊錄、設置等 |
Server、Data可以直接訪問SDK,Client代碼不允許直接訪問環信SDK,要把環信SDK和Client完全隔離開
產品設計
產品設計上的一些想法,匯總在產品設計
下個版本
下個版本實現如下功能:
1、小視頻
2、語音、視頻通話
3、消息搜索、上拉刷新
4、群聊
5、通訊錄
更新日志:2016-11-24
1、刪除stable分支,只保留master、develop兩個分支,越簡單越好。
2、適配IOS10,原項目在IOS10運行會直接奔潰。
Licenses
本項目所有LL-開頭的源碼遵守MIT license. 本項目絕大部分資源歸騰訊公司所有