實(shí)現(xiàn)iOS圖片等資源文件的熱更新化(一): 從Images.xcassets導(dǎo)出合適的圖片

本文會(huì)基于一個(gè)已有的腳本工具自動(dòng)導(dǎo)出所有的圖片;最終給出的是一個(gè)從 Images.xcassets 到基于文件夾的精簡(jiǎn) 合適 的圖片資源集的完整過程.難點(diǎn)在于從完整圖片集到精簡(jiǎn)圖片集,肯定是基于一個(gè)定制化的腳本,自定義導(dǎo)出的.如果自己手動(dòng)導(dǎo)出?那可有的忙嘍~

Images.xcassets 與 Assets.car

Images.xcassets,是Xcode項(xiàng)目中的,用于存放資源文件.那么我們?yōu)槭裁床恢苯犹幚?Images.xcassets 呢?因?yàn)镮mages.xcassets中存放的圖片名稱可能與圖片的資源名稱不一致,最終決定圖片資源名的是資源文件夾的名稱;也有可能Images.xcassets存放的是pdf格式的圖片,這樣可以自動(dòng)預(yù)編譯對(duì)應(yīng)尺寸的圖片資源.

Images.xcassets 編譯后,最終ipa包中,是以Assets.car包的形式出現(xiàn)的,內(nèi)部是處理后的圖片名.此處的文件名與我們代碼中引用的圖片資源名稱是一致的.

也就是說: 直接基于Assets.car進(jìn)行處理,可以使我們的使用圖片處的代碼變更盡可能少.

使用 cartool 從 Assets.car 導(dǎo)出圖片

Assets.car 無法直接zip解壓,需要借助專門的工具,此處推薦: cartool 使用方法,參見: iOS學(xué)習(xí)之解壓Assets.car

如果你缺少足夠復(fù)雜的Assets.car或者cartool用法有問題,可以直接使用我處理過的資源:https://github.com/ios122/ios_assets_hot_update/tree/master/res

針對(duì)文章github給定的目錄, cartool的用法,可以簡(jiǎn)述為:
cd 到 res目錄,然后

mkdir Assets
./cartool  ./Assets.car ./Assets

其實(shí)使用一張圖片就可以額兼容iPhone/iPad

從 Assets.car 導(dǎo)出后的圖片,大致有以下幾種:

  • 只存在@1x的圖: 如 2.png
  • 只存在@1x和@2x的圖: 如 account.png 和 account@2x.png
  • 只存在@2x的圖: 如add-1@2x.png
  • 只存在@2x與@3x的圖片: 如 10@2x.png 和 10@3x.png
  • 同時(shí)存在三種尺寸的圖片: 如 1.png 1@2x.png 和 1@3x.png
  • 區(qū)分iphone與ipad的圖片,此類圖一般由pdf自動(dòng)在預(yù)編譯時(shí)生成: 如bg_mypage_edit~ipad.png bg_mypage_edit~ipad@2x.png bg_mypage_edit~ipad@3x.png bg_mypage_edit~iphone.png bg_mypage_edit~iphone@2x.png bg_mypage_edit~iphone@3x.png
  • 漢語命名的圖片: 如 提醒.png

以上圖片的原因,很大一部分是由于App迭代引起的.對(duì)于一個(gè)圖片,存在上述不同情況時(shí),圖片通常加載與當(dāng)前屏幕比例(scale)最符合的圖片,具體細(xì)節(jié)下一篇文章會(huì)更完整描述.

經(jīng)過我自己的實(shí)驗(yàn)與網(wǎng)上各種資料的查詢,使用 @3x 的圖片是可以同時(shí)作為 iPhone和iPad的通用圖標(biāo)的.當(dāng)然,這是需要自定義 imageNamed方法,也是下一篇文章的重點(diǎn). 2套共5個(gè)圖片,現(xiàn)在只需要1個(gè)圖片,理論圖片資源體積可以減小
((1 + 2 + 3 + 3 + 1.5) - 3) / (1 + 2 + 3 + 3 + 1.5) = 71.428571 % (信息量超大的速算法,看不懂就當(dāng)是個(gè)冷笑話吧(≧▽≦)/)

自動(dòng)歸類腳本思路

我們想要獲取的是 可用的@3x圖片文件夾不包含@3x圖片的有問題的資源列表. 對(duì)于不存在@3x副本的圖片,很大可能這個(gè)資源已經(jīng)被廢棄了.這一塊,暫定手動(dòng)去排查與核實(shí).如果一個(gè)圖片仍在使用但是不存在@3x的副本,絕對(duì)是RD挖了一個(gè)坑,等你來填!

基本思路是:

  1. 去除 ~ipad 結(jié)尾的圖片,如bg_mypage_edit~ipad.png;
  2. 去除 ~iphone 圖片中的 iphone文字,如bg_mypage_editiphone@3x.png 重命名為 bg_mypage_edit@3x.png;
  3. 將含有@3x的圖片組的@1x @2x @3x 的圖片按順序移動(dòng)到單獨(dú)文件夾 如 assets_3x,并都命名為@3x,此時(shí)原文件夾中即為有問題的資源,新文件夾中為有效的資源文件,且只保留了@3x;
  4. 將原資源文件夾命名為assets_error,以供以后使用;
  5. 人工確認(rèn)非法圖片是否具有存在意義,存在則尋找其@3x副本放到 assets_3x 文件夾;

自動(dòng)歸類腳本實(shí)現(xiàn)

除了以上的第五步以外,前四步都可以自動(dòng)化運(yùn)行:

#0. 需要先cd到解壓后的Assets目錄;
#1. 去除 ~ipad 結(jié)尾的圖片,如bg_mypage_edit~ipad.png;
find . -iname "*~ipad*.png" -delete

#2. 去除 ~iphone 圖片中的 ~iphone文字;
find . -name "*~iphone.png" -exec sh -c 'for i do mv -- "$i" "${i%~iphone.png}.png"; done' sh {} +

find . -name "*~iphone@2x.png" -exec sh -c 'for i do mv -- "$i" "${i%~iphone@2x.png}@2x.png"; done' sh {} +

find . -name "*~iphone@3x.png" -exec sh -c 'for i do mv -- "$i" "${i%~iphone@3x.png}@3x.png"; done' sh {} +

# 3.將含有@3x的圖片組的@1x @2x @3x 的圖片按順序移動(dòng)到單獨(dú)文件夾 如 assets_3x,并都命名為@3x,此時(shí)原文件夾中即為有問題的資源,新文件夾中為有效的資源文件,且只保留了@3x;

mkdir ../assets_3x

find . -name "*@3x.png" -exec sh -c 'for i do mv -- "${i%@3x.png}.png" "../assets_3x/${i%@3x.png}@3x.png"; mv -- "${i%@3x.png}@2x.png" "../assets_3x/${i%@3x.png}@3x.png";mv -- "${i%@3x.png}@3x.png" "../assets_3x/${i%@3x.png}@3x.png";done' sh {} +

# 4.將原資源文件夾命名為assets_error,以供以后使用;
cd ..
mv Assets assets_error

最終得到的 assets_3x 即為可用資源,assets_error 即為需要手動(dòng)確認(rèn)可用性的資源.

收獲與感悟:

  1. 項(xiàng)目中,圖片這一塊,的確有許多無用的或不合理的資源,需要及早解決;
  2. shell 腳本是基于路徑進(jìn)行復(fù)制,移動(dòng)等操作的,如 find的結(jié)果,其實(shí)是一個(gè)文件路徑,借助它,提出了一個(gè)簡(jiǎn)單的區(qū)分可用于不可用資源的方法;
  3. 寫博客,確實(shí)可以使思路更清晰有序,坦白講,這本來是一個(gè)我不敢碰的優(yōu)化任務(wù),一個(gè)一個(gè)比對(duì),想想都頭大.最終的處理結(jié)果,還是給出了一定數(shù)量的無用圖片,但是我根據(jù)其名字就可以確定其位置,非常好處理了,已經(jīng)省了不少功夫了;而且,要比我手動(dòng)排查地可信多了.

系列專屬github地址: https://github.com/ios122/ios_assets_hot_update

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末维哈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子论悴,更是在濱河造成了極大的恐慌婿着,老刑警劉巖底哗,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡管跺,警方通過查閱死者的電腦和手機(jī)棵里,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門润文,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人殿怜,你說我怎么就攤上這事典蝌。” “怎么了头谜?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵骏掀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我柱告,道長(zhǎng)截驮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任际度,我火速辦了婚禮葵袭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乖菱。我一直安慰自己坡锡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布窒所。 她就那樣靜靜地躺著鹉勒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吵取。 梳的紋絲不亂的頭發(fā)上禽额,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音海渊,去河邊找鬼绵疲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛臣疑,可吹牛的內(nèi)容都是我干的盔憨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼讯沈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼郁岩!你這毒婦竟也來了婿奔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤问慎,失蹤者是張志新(化名)和其女友劉穎萍摊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體如叼,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冰木,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笼恰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踊沸。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖社证,靈堂內(nèi)的尸體忽然破棺而出逼龟,到底是詐尸還是另有隱情,我是刑警寧澤追葡,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布腺律,位于F島的核電站,受9級(jí)特大地震影響宜肉,放射性物質(zhì)發(fā)生泄漏匀钧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一崖飘、第九天 我趴在偏房一處隱蔽的房頂上張望榴捡。 院中可真熱鬧,春花似錦朱浴、人聲如沸吊圾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽项乒。三九已至,卻和暖如春梁沧,著一層夾襖步出監(jiān)牢的瞬間檀何,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工廷支, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留频鉴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓恋拍,卻偏偏與公主長(zhǎng)得像垛孔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子施敢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

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