iOS 項(xiàng)目技術(shù)選型

  • 暗黑模式方案

    • 明確需求: 不會(huì)增加除系統(tǒng)暗黑模式外的其他模式
    1. 系統(tǒng)暗黑模式方案:
      • 優(yōu)點(diǎn):
        • 系統(tǒng)Assets資源支持動(dòng)態(tài)色,動(dòng)態(tài)圖史飞,原生支持,代碼侵入性最小
        • 默認(rèn)支持系統(tǒng)更換模式時(shí)已經(jīng)創(chuàng)建的頁(yè)面實(shí)時(shí)刷新效果,不需要銷(xiāo)毀根控制器重新創(chuàng)建
        • Assets創(chuàng)建動(dòng)態(tài)色卫病,動(dòng)態(tài)圖完美支持xib警医,不需要額外適配
      • 缺點(diǎn):
        • 僅支持iOS 13+系統(tǒng)
        • 僅支持日間暗黑兩種模式亿胸,無(wú)法新增其他主題
        • layer層級(jí)需要自己控制刷新粒度
    2. SwiftTheme方案:
      • 優(yōu)點(diǎn):
        • 可以服務(wù)器動(dòng)態(tài)下發(fā)個(gè)性化主題,方便增加除暗黑模式外的其他主題
        • 不受系統(tǒng)版本限制
      • 缺點(diǎn):
        • 系統(tǒng)控件的color预皇,image等相關(guān)屬性全都不能用侈玄,必須全部替換成theme_color,theme_image等擴(kuò)展屬性吟温,才能實(shí)現(xiàn)更換主題時(shí)已經(jīng)創(chuàng)建的頁(yè)面實(shí)時(shí)刷新效果序仙,否則必須銷(xiāo)毀根控制器重新創(chuàng)建
        • xib適配方案有兩種:
          1. 通過(guò)擴(kuò)展給xib擴(kuò)展新屬性設(shè)置color,image等相關(guān)鲁豪,設(shè)置擴(kuò)展屬性時(shí)通過(guò)選中主題設(shè)置對(duì)應(yīng)顏色潘悼,不能直接設(shè)置控件的color,image等原生屬性
          2. 將xib中的控件關(guān)聯(lián)到代碼中呈昔,通過(guò)代碼設(shè)置theme_color挥等,theme_image等擴(kuò)展屬性
        • 代碼侵入性太強(qiáng)
    • 最終方案選擇: 系統(tǒng)暗黑模式方案(需求明確不會(huì)新增除暗黑模式外的其他模式更優(yōu))
  • 多語(yǔ)言國(guó)際化方案

    • 明確需求: app內(nèi)提供更換語(yǔ)言功能, 在app內(nèi)更改語(yǔ)言后,已經(jīng)創(chuàng)建的頁(yè)面及時(shí)刷新堤尾,不能銷(xiāo)毀根控制器重新創(chuàng)建肝劲。
    • 難點(diǎn):
      • 跟app關(guān)聯(lián)的語(yǔ)言國(guó)際化,只能通過(guò)代碼控制郭宝,xib怎么國(guó)際化辞槐?
      • 不銷(xiāo)毀根控制器重新創(chuàng)建,已經(jīng)創(chuàng)建的頁(yè)面怎么刷新粘室?如果是每個(gè)頁(yè)面加通知榄檬,那每個(gè)頁(yè)面需要刷新的部分怎么抽取衔统?對(duì)業(yè)務(wù)代碼邏輯影響多大鹿榜?是否有明確規(guī)范,新人接替是否好維護(hù)锦爵?
      • 跟語(yǔ)言關(guān)聯(lián)的有靜態(tài)頁(yè)面控件刷新舱殿,業(yè)務(wù)邏輯刷新(如banner圖上有文字,語(yǔ)言改變后banner圖也需要刷新)
      • 怎么控制刷新粒度险掀,如果棧里的靜態(tài)控件太多沪袭,業(yè)務(wù)邏輯刷新太多,一次性全部刷新是否會(huì)影響性能樟氢?還是分批刷新冈绊?
    1. 切換根控制器方案: 切換語(yǔ)言直接重新創(chuàng)建根控制器
      • 優(yōu)點(diǎn):
        • 邏輯簡(jiǎn)單侠鳄,代碼0浸入
      • 缺點(diǎn):
        • 必須退回根控制器重新加載,不能停留在當(dāng)前頁(yè)面實(shí)時(shí)刷新
    2. 通知方案: 每個(gè)頁(yè)面監(jiān)聽(tīng)語(yǔ)言改變來(lái)刷新需要刷新的控件和邏輯
      • 優(yōu)點(diǎn):
        • 已經(jīng)創(chuàng)建的頁(yè)面能實(shí)時(shí)刷新
      • 缺點(diǎn):
        • 每個(gè)頁(yè)面都需要監(jiān)聽(tīng)通知
        • 語(yǔ)言改變時(shí)所有創(chuàng)建的頁(yè)面控件和邏輯都同時(shí)刷新死宣,會(huì)影響一定性能
        • 寫(xiě)業(yè)務(wù)代碼需要關(guān)心哪些控件需要刷新伟恶,剝離出來(lái)刷新,不太友好
    3. i18n自定義方案: 向每個(gè)控件注入一段block,語(yǔ)言改變時(shí)調(diào)用十电,也可以在改變時(shí)做標(biāo)記知押,在頁(yè)面將要出現(xiàn)的時(shí)刷新
      • 優(yōu)點(diǎn):
        • 已經(jīng)創(chuàng)建的頁(yè)面能實(shí)時(shí)刷新
        • 寫(xiě)業(yè)務(wù)代碼不需要關(guān)心哪些控件需要刷新
        • 靜態(tài)控件統(tǒng)一規(guī)范,統(tǒng)一寫(xiě)法鹃骂,業(yè)務(wù)邏輯刷新單獨(dú)控制
      • 缺點(diǎn):
        • 代碼中設(shè)置text台盯,title,attributedText等文本的地方都需要加前綴.i18n.text來(lái)設(shè)置畏线,浸入性較大
    4. 觸發(fā)生命周期函數(shù): 語(yǔ)言改變時(shí)將當(dāng)前棧里的控制器銷(xiāo)毀并替換新的,讓控制器重新走生命周期函數(shù)
      • 優(yōu)點(diǎn):
        • 已經(jīng)創(chuàng)建的頁(yè)面能實(shí)時(shí)刷新
        • 邏輯簡(jiǎn)單静盅,代碼0浸入
      • 缺點(diǎn):
        • 需要明確當(dāng)前棧結(jié)構(gòu),遍歷移除舊的寝殴,創(chuàng)建新的替換蒿叠,需要明確創(chuàng)建新控制器依賴(lài)的參數(shù),絕對(duì)不能更改棧層級(jí)結(jié)構(gòu)和控制器類(lèi)型蚣常,
        • 如果每個(gè)控制器的子控制器太多市咽,怎么處理?如果子控制器也重新創(chuàng)建抵蚊,那么子控制器布局呢施绎?
        • 沒(méi)有好的思路明確上述依賴(lài)
    • 最終方案選擇: i18n自定義方案
  • 資源管理方案(R.swift)

    • 優(yōu)點(diǎn):
      • 解決圖片名稱(chēng),國(guó)際化key贞绳,字體名稱(chēng)等字符串硬編碼問(wèn)題谷醉,轉(zhuǎn)成強(qiáng)類(lèi)型方便排錯(cuò),方便寫(xiě)代碼聯(lián)想
    • 缺點(diǎn):
      • 為了保持統(tǒng)一性冈闭,都在R結(jié)構(gòu)體文件中生成對(duì)應(yīng)字符串映射的值俱尼,導(dǎo)致R文件過(guò)大,打開(kāi)反應(yīng)遲鈍
  • 模塊解耦方案

    • 明確需求: 后續(xù)進(jìn)行組件化
    1. 路由方案(URLNavigator):

      • 優(yōu)點(diǎn):

        • 極高的動(dòng)態(tài)性萎攒,適合h5跳轉(zhuǎn)
        • 方便地統(tǒng)一管理多平臺(tái)的路由規(guī)則
        • 易于適配 URL Scheme
        • 因?yàn)槁酚杀泶嬖谟霭耍Y(jié)構(gòu)清晰
      • 缺點(diǎn):

        • 傳參方式有限,無(wú)法利用編譯器進(jìn)行參數(shù)類(lèi)型檢查耍休,所有的參數(shù)都只能從字符串中轉(zhuǎn)換而來(lái)
        • 依賴(lài)于字符串硬編碼刃永,難以管理
        • url 的"注冊(cè)"、"使用"必須用相同的字符規(guī)則
    2. Target-Action方案(CTMediator): 利用分類(lèi)為路由工具添加新接口羹应,在接口中通過(guò)字符串獲取對(duì)應(yīng)的類(lèi),再用runtime創(chuàng)建實(shí)例次屠,動(dòng)態(tài)調(diào)用實(shí)例的方法

      • 優(yōu)點(diǎn):
        • 利用分類(lèi)可以明確聲明接口园匹,進(jìn)行編譯檢查
        • 實(shí)現(xiàn)方式輕量
      • 缺點(diǎn):
        • 需要在 mediator 和 target 中重新添加每一個(gè)接口雳刺,模塊化時(shí)代碼較為繁瑣
        • 在分類(lèi)中仍然引入了字符串硬編碼,內(nèi)部使用字典傳參裸违,一定程度上也存在和 URL 路由相同的問(wèn)題
        • 無(wú)法保證所使用的模塊一定存在掖桦,target 模塊在修改后,使用者只有在運(yùn)行時(shí)才能發(fā)現(xiàn)錯(cuò)誤
        • 過(guò)于依賴(lài) runtime 特性供汛, 在 Swift 中擴(kuò)展 mediator 時(shí)枪汪,無(wú)法使用純 Swift 類(lèi)型的參數(shù)
        • 創(chuàng)建過(guò)多的 target 類(lèi)
    3. protocol 匹配方案(BeeHive): 將 protocol 和對(duì)應(yīng)的類(lèi)進(jìn)行字典匹配,之后就可以用 protocol 獲取 class怔昨,再動(dòng)態(tài)創(chuàng)建實(shí)例

      • 優(yōu)點(diǎn):

        • 利用接口調(diào)用雀久,實(shí)現(xiàn)了參數(shù)傳遞時(shí)的類(lèi)型安全
        • 直接使用模塊的 protocol 接口,無(wú)需再重復(fù)封裝
      • 缺點(diǎn):

        • 由框架來(lái)創(chuàng)建所有對(duì)象趁舀,創(chuàng)建方式有限赖捌,例如不支持外部傳入?yún)?shù),再調(diào)用自定義初始化方法
        • 用 OC runtime 創(chuàng)建對(duì)象矮烹,不支持 Swift
        • 只做了 protocol 和 class 的匹配越庇,不支持更復(fù)雜的創(chuàng)建方式和依賴(lài)注入
        • 無(wú)法保證所使用的 protocol 一定存在對(duì)應(yīng)的模塊,也無(wú)法直接判斷某個(gè) protocol 是否能用于獲取模塊
    • 最終方案選擇: 路由(URLNavigator)方案
  • 空頁(yè)面占位視圖方案

    • 明確需求: 空數(shù)據(jù)奉狈,頁(yè)面加載失敗默認(rèn)展示占位視圖
    1. DNZEmptyDataSet:
      • 優(yōu)點(diǎn):
        • tableView卤唉,collectionView自動(dòng)顯示隱藏
      • 缺點(diǎn):
        • 不支持普通view
        • 不能覆蓋父視圖,如果父視圖有其他控件仁期,需要單獨(dú)隱藏
        • 網(wǎng)絡(luò)加載失敗時(shí)不能顯示
    2. 自定義YLEmptyDataSet:
      • 優(yōu)點(diǎn):
        • 支持普通view, 覆蓋父視圖, 不需要對(duì)父視圖的其他控件進(jìn)行單獨(dú)隱藏
        • tableView桑驱,collectionView自動(dòng)顯示隱藏 - 提供網(wǎng)絡(luò)加載失敗默認(rèn)視圖
        • 缺點(diǎn):
          - 加到普通view上必須手動(dòng)隱藏
    • 最終方案選擇: 自定義YLEmptyDataSet
  • 狀態(tài)管理方案

    • ReactorKit
  • 網(wǎng)絡(luò)層方案

    • Moya/RxSwift + HandJson
  • App緩存方案

    • 基于緩存庫(kù)再次封裝Cache
  • Loading+Toast方案

    • 自定義HUD
  • 代碼格式化

SwiftLint (程序靜態(tài)分析)方案
安裝:可以使用homebrew進(jìn)行全局安裝:
需要在已經(jīng)安裝了homebrew 前提下:
打開(kāi)終端輸入: brew install SwiftLint

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蟀拷,隨后出現(xiàn)的幾起案子碰纬,更是在濱河造成了極大的恐慌,老刑警劉巖问芬,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悦析,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡此衅,警方通過(guò)查閱死者的電腦和手機(jī)强戴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挡鞍,“玉大人骑歹,你說(shuō)我怎么就攤上這事∧ⅲ” “怎么了道媚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我最域,道長(zhǎng)谴分,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任镀脂,我火速辦了婚禮牺蹄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薄翅。我一直安慰自己沙兰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布翘魄。 她就那樣靜靜地躺著鼎天,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熟丸。 梳的紋絲不亂的頭發(fā)上训措,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音光羞,去河邊找鬼绩鸣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纱兑,可吹牛的內(nèi)容都是我干的呀闻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼潜慎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捡多!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起铐炫,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤垒手,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后倒信,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體科贬,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年鳖悠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榜掌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乘综,死狀恐怖憎账,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卡辰,我是刑警寧澤胞皱,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布邪意,位于F島的核電站,受9級(jí)特大地震影響反砌,放射性物質(zhì)發(fā)生泄漏抄罕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一于颖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嚷兔,春花似錦森渐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至壶运,卻和暖如春耐齐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒋情。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工埠况, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棵癣。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓辕翰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親狈谊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喜命,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容