iOS開源 - LLWeChat:實現IM基本功能,并且在細節、完成度、bugfree上媲美任何主流IM應用

agxw8956 8年前發布 | 9K 次閱讀 BugFree 環信 iOS開發 移動開發

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. 本項目絕大部分資源歸騰訊公司所有

 

 

 本文由用戶 agxw8956 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!