基於MVVM構建聊天App (一)從新建工程開始
小時光
北京體適能體育科技有限公司
在開發一個新的App時不僅要考慮當前版本的需求,更要考慮到後期的版本迭代和維護工作 《Clean Code》一書中也提出程式碼大部分時候是用來維護的,而不是用來實現功能的
。所以在前期的框架設計,技術調查上應該慎之又慎。本次我將從個人開發者角度圍繞著程式碼的可維護性、可測試性、可複用性來實現一個簡單的聊天App。
1、基本設定
新建一個工程,命名為RPChat
,此處開發語言選擇Swift
:
(1)、在工程中設定Info.plist中設定Allow Arbitrary Loads為YES,參考:stackoverflow Transport security has blocked a cleartext HTTP
(2)、開啟Assets.xcassets
按照指定的圖片大小新增App的Logo圖片。
2、工程結構
新增三個framework
分別命名為RPChat_iOS、RPChatUIKit、RPChatDataKit
- 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
;
接下來,點選+,選擇New Run Script Phase
,此時新建了Run Script
,在執行命令中新增:
/usr/local/bin/Carthage copy-frameworks
複製程式碼
在Input Files
中引入我們要用到的庫的路徑:
$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework
複製程式碼
其作用是把Carthage
引入的第三方庫在打包的時候,拷貝到特定目錄。
在上傳到git倉庫時,不需要傳Carthage
下的檔案,所以選擇忽略,在.gitignore
檔案中新增
*.DS_Store
Carthage/
xcuserdata/
.idea/
複製程式碼
4、相容iOS 13之前的老版本
修改最低支援版本為iOS 11
此時發現再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
點選到Localizable.strings檔案,點選右側Localize...按鈕新增需要國際化的語言。
此時來做個測試,在ViewController
新建一個名為testLab
的UILabel
;
@IBOutlet weak var testLab: UILabel!
複製程式碼
展開Localize.strings
檔案,在英文中新增test;
,在簡體中文中新增:
"test" = "測試";
複製程式碼
在ViewController
中呼叫,
testLab.text = NSLocalizedString("test",comment: "")
複製程式碼
此時點選Run可以看到testLab
顯示內容為test
;
修改模擬器語言為簡體漢語,再次執行:
2、App名稱國際化
-
(1)、同樣的方法新建一個名為
InfoPlist
的String
檔案。 -
(2)、在
InfoPlist.strings(English)
檔案中新增:CFBundleName = "CatchU"; 複製程式碼
-
(3)、在
InfoPlist.strings(Chinese,Simplified)
中新增CFBundleName = "暢聊吧"; 複製程式碼
-
(4)、 開啟
Info.Plist
設定Bundle name
屬性為$CFBundleName
- (5)、再次執行程式碼,可以看到,App的名稱已經修改成功了。
本篇主要講了App的新建和相關配置,包括:
- 新建工程,基本配置
- 通過三個
frameworks
去實現App不同層次的功能 - 通過
Carthage
管理工程中用的第三方開源庫 - 對iOS 13之前的系統做一個相容處理
- 國際化相關