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

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

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

一、基本設置

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

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

https配置

(2)、打開Assets.xcassets按照指定的圖片大小添加App的Logo圖片。bash

Logo

二、工程結構

添加三個framework分別命名爲RPChat_iOS、RPChatUIKit、RPChatDataKitsession

添加framework

添加framework

工程目錄

  • RPChat_iOS是和UI的顯示以及交互相關的代碼
  • RPChatUIKit是整個項目中會用到的對UIKit的公共擴展
  • RPChatDataKit是整個項目的數據存儲以及訪問接口,也能夠理解爲是App的View Model以及Model

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

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

使用VSCode打開Cartfile文件,輸入用到的第三方開源庫:app

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,ide

下面的gif演示瞭如何添加第三方的FrameWork測試

gif

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

/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/
複製代碼

四、兼容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>) {
    }
}
複製代碼

五、國際化

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

  • 二、在工程中新建一個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

修改模擬器語言爲簡體漢語,再次運行:

簡體漢語

二、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以前的系統作一個兼容處理
  • 國際化相關
相關文章
相關標籤/搜索