1. 程式人生 > Android開發 >基於MVVM構建聊天App (一)從新建工程開始

基於MVVM構建聊天App (一)從新建工程開始

小時光
北京體適能體育科技有限公司

在開發一個新的App時不僅要考慮當前版本的需求,更要考慮到後期的版本迭代和維護工作 《Clean Code》一書中也提出程式碼大部分時候是用來維護的,而不是用來實現功能的。所以在前期的框架設計,技術調查上應該慎之又慎。本次我將從個人開發者角度圍繞著程式碼的可維護性、可測試性、可複用性來實現一個簡單的聊天App。

1、基本設定

新建一個工程,命名為RPChat,此處開發語言選擇Swift:

(1)、在工程中設定Info.plist中設定Allow Arbitrary Loads為YES,參考:stackoverflow Transport security has blocked a cleartext HTTP

https配置

(2)、開啟Assets.xcassets按照指定的圖片大小新增App的Logo圖片。

Logo

2、工程結構

新增三個framework分別命名為RPChat_iOS、RPChatUIKit、RPChatDataKit

新增framework

新增framework

工程目錄

  • RPChat_iOS是和UI的顯示以及互動相關的程式碼
  • RPChatUIKit是整個專案中會用到的對UIKit的公共擴充套件
  • RPChatDataKit是整個專案的資料儲存以及訪問介面,也可以理解為是App的View Model以及Model

3、使用carthage管理第三方開源庫

carthage version
複製程式碼
cd /Users/****/Desktop/GitHub/RPChat
複製程式碼
touch Cartfile
複製程式碼

使用VSCode開啟Cartfile檔案,輸入用到的第三方開源庫:

github "Alamofire/Alamofire" // Http請求封裝
github "ReactiveX/RxSwift" // 用於管理App中的事件
github "onevcat/Kingfisher" // 用於App中的快取和下載圖片
github "SwiftyJSON/SwiftyJSON" // 生成Model
gitHub "CoderMJLee/MJRefresh" // UItableView下拉元件
github "robbiehanson/CocoaAsyncSocket" 
複製程式碼

執行更新命令:

carthage update --platform iOS
複製程式碼

更新完成後,開啟工程,選擇TARGETS -->Build Phases--> Link Binary With Libries 點選加號,選擇 Add File --> Carthage --> Build --> iOS 新增所需的FrameWork,

下面的gif演示瞭如何新增第三方的FrameWork

gif

接下來,點選+,選擇New Run Script Phase,此時新建了Run Script,在執行命令中新增:

/usr/local/bin/Carthage copy-frameworks
複製程式碼

New Run Script

Input Files中引入我們要用到的庫的路徑:

$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework
複製程式碼

其作用是把Carthage引入的第三方庫在打包的時候,拷貝到特定目錄。

Carthage

在上傳到git倉庫時,不需要傳Carthage下的檔案,所以選擇忽略,在.gitignore檔案中新增

.gitignore

*.DS_Store
Carthage/
xcuserdata/
.idea/
複製程式碼

4、相容iOS 13之前的老版本

修改最低支援版本為iOS 11

iOS 最低版本

此時發現再Build工程,發現已經有很多Error,這是版本相容的問題,由於Xcode 11新建的工程預設為當前最高版本,Xcode新增了一個SceneDelegate檔案,具體作用請參考官方檔案:Optimizing App Launch。現在要在AppDelegate和中SceneDelegate做相容老版本處理。 方法就是對當前系統做一個判斷,然後再根據不同系統版本分開處理。

版本報錯

SceneDelegate直接加上@available(iOS 13.0,*)即可,在AppDelegate做擴充套件處理:

程式碼如下:

@available(iOS 13.0,*)
class SceneDelegate: UIResponder,UIWindowSceneDelegate {

}
複製程式碼
@available(iOS 13.0,*)
extension AppDelegate {
    func application(_ application: UIApplication,configurationForConnecting connectingSceneSession: UISceneSession,options: UIScene.ConnectionOptions) -> UISceneConfiguration {
         return UISceneConfiguration(name: "Default Configuration",sessionRole: connectingSceneSession.role)
    }
    func application(_ application: UIApplication,didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
    }
}
複製程式碼

5、國際化

1、常用文案國際化
  • 1、如下圖所示: 建立所需國際化的語言,此處我建立了英語、繁體漢語、簡體漢語:

  • 2、在工程中新建一個String File檔案,命名為Localizable

國際化2

點選到Localizable.strings檔案,點選右側Localize...按鈕新增需要國際化的語言。

國際化3

此時來做個測試,在ViewController新建一個名為testLabUILabel;

@IBOutlet weak var testLab: UILabel!
複製程式碼

展開Localize.strings檔案,在英文中新增test;,在簡體中文中新增:

"test" = "測試";
複製程式碼

ViewController中呼叫,

testLab.text = NSLocalizedString("test",comment: "")
複製程式碼

test

測試

此時點選Run可以看到testLab顯示內容為test;

English

修改模擬器語言為簡體漢語,再次執行:

簡體漢語

2、App名稱國際化
  • (1)、同樣的方法新建一個名為InfoPlistString檔案。

  • (2)、在InfoPlist.strings(English)檔案中新增:

    CFBundleName = "CatchU";
    複製程式碼
  • (3)、在 InfoPlist.strings(Chinese,Simplified)中新增

    CFBundleName = "暢聊吧";
    複製程式碼
  • (4)、 開啟Info.Plist設定Bundle name屬性為$CFBundleName

Bundle name

  • (5)、再次執行程式碼,可以看到,App的名稱已經修改成功了。

App Name

本篇主要講了App的新建和相關配置,包括:

  • 新建工程,基本配置
  • 通過三個frameworks去實現App不同層次的功能
  • 通過Carthage管理工程中用的第三方開源庫
  • 對iOS 13之前的系統做一個相容處理
  • 國際化相關