1. <tbody id="yxbco"></tbody>
      <li id="yxbco"><object id="yxbco"></object></li>

    2. <dd id="yxbco"><track id="yxbco"></track></dd>
      1. iOS摸魚周報 第十六期

        zhangferry· 2021-07-26

        iOS 摸魚周報,主要分享開發過程中遇到的經驗教訓、優質的博客、高質量的學習資料、實用的開發工具等。周報倉庫在這里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的內容推薦可以通過 issue 的方式進行提交。另外也可以申請成為我們的常駐編輯,一起維護這份周報。另可關注公眾號:iOS成長之路,后臺點擊進群交流,聯系我們,獲取更多內容。

        本期話題

        @zhangferry:大家好,iOS摸魚周報不知不覺已經發布到第 16 期啦!為了了解大家對周報的想法和建議,前段時間我們做了一次問卷調查,問卷的結果大體上符合預期的設想,有一些好的建議我們也采納了。所以在上一周我們停更一期做了新內容的準備,本期內容就是改版后的第一期。如果大家后續有什么好的想法和建議,還可以繼續給我們留言反饋,希望摸魚周報能同大家一起進步~

        調整內容:去掉了那些Bug、編程概念模塊,增加了本期話題面試解析。

        重點說下本期話題模塊的作用,我們在調研了各個領域有名氣的周報之后,發現了一份獨樹一幟且跟我們氣質相符的周報:阮一峰的科技愛好者周刊。阮一峰的周刊特別之處在于它不僅是在講科技,還會有每周話題用來講述生活中的一些思考,比如近幾期的話題:“培訓班 vs 大學,求職成功率比較”,“你的城市有多少張病床”等。為了讓一份技術性周報變的有溫度,我認為是需要加入一些人文性質的思考的。

        所以我們決定加這個本期話題模塊,主題來源不僅限于眾位聯合編輯,也歡迎各位讀者跟我們一起探討問題,或者向我們拋出問題??梢允羌夹g思考,生活感想,讀書感悟,職場教訓,職業困境等等。之后的本期話題會從多個選題里選一個進行探討,如果問題超出了我們的認知范圍,會找認識的其他大佬進行解答。so,對于這個新東西,歡迎大家貢獻有趣的話題內容啊~

        開發Tips

        整理編輯:夏天

        圖片壓縮

        在 iOS 減包的 Tip 中,我們了解到資源問題是影響包大小的主要部分,而圖片資源是開發過程中最常見的。使用正確的圖片壓縮工具能夠有效的進行減包。

        有損壓縮和無損壓縮

        常見的壓縮工具有 TinyPNG,pngquant,ImageAlpha、ImageOptim、pngcrush、optipng、pngout、pngnq、advpng 等,根據其壓縮方式分成兩大陣營:有損壓縮和無損壓縮。

        根據資料顯示,TinyPNG、pngquant、ImageAlpha、pngnq 都是有損壓縮,基本采用的都是 quantization 算法,將 24 位的 PNG 圖片轉換為 8 位的 PNG 圖片,減少圖片的顏色數;pngcrush、optipng、pngout、advpng 都是無損壓縮,采用的都是基于 LZ/Huffman 的 DEFLATE 算法,減少圖片 IDAT chunk 區域的數據。一般有損壓縮的壓縮率會大大高于無損壓縮。

        壓縮工具

        對于項目中常見的背景圖、占位圖和大的標簽圖來說,推薦使用以下兩種工具

        • TinyPNG4Mac:利用 tinify 提供的 API,目前 tinify 的免費版壓縮數量是單次不超過 20 張且大小不超過 5M。對于一般的 iOS 應用程序來說,足夠日常開發的使用;
        • ImageOptim-CLI:自動先后執行壓縮率較高的為 ImageAlpha 的有損壓縮 加上 ImageOptim 的無損壓縮。

        可以通過查看這個表格對比 TinyPng 和 ImageOptim-CLI 。

        對于小圖來說,例如我們常見的 icon 圖標來說,我們通過改變其編碼方式為 RGB with palette 來達到圖片壓縮效果。你可以使用 ImageOptim 改變圖片的編碼方式為 RGB with palette。

        imageoptim -Q --no-imageoptim --imagealpha --number-of-colors 16 --quality 40-80 ./1.png

        通過 Palette Images 深入了解 palette。

        這里的壓縮是指使用 Xcode 自帶的壓縮功能。

        Xcode 負優化

        我們一般使用 Assets Catalogs 對圖片資源進行管理。其會存在對應的優化方式

        在構建過程中,Xcode 會通過自己的壓縮算法重新對圖片進行處理。在構建 Assets Catalogs 的編譯產物 Assest.car 的過程中,Xcode 會使用 actool 對 Assets Catalogs 中的 png 圖片進行解碼,由此得到 Bitmap 數據,然后再運用 actool 的編碼壓縮算法進行編碼壓縮處理。所以不改變編碼方式的無損壓縮方法對最終的包大小來說,可能沒有什么作用。

        對同一張圖片,在不同設備、不同 iOS 系統上 Xcode 采用了不同的壓縮算法這也導致了下載時不同的設備針對圖片出現大小的區別。

        可以利用 assetutil 工具分析 Assest.car 來得到其具體的壓縮方法:

        assetutil --info ***.app/Assets.car > ***.json

        需要注意 Json 文件中這幾個參數的值 Compression 、Encoding、SizeOnDisk。

         {
            "AssetType" : "Image",
            "BitsPerComponent" : 8,
            "ColorModel" : "RGB",
            "Colorspace" : "srgb",
            "Compression" : "deepmap2",
            "Encoding" : "ARGB",
            "Name" : "image",
            "NameIdentifier" : 51357,
            "Opaque" : false,
            "PixelHeight" : 300,
            "PixelWidth" : 705,
            "RenditionName" : "image.png",
            "Scale" : 1,
            "SHA1Digest" : "294FEE01362591334E3C3B4ECE54AF0EA8491781",
            "SizeOnDisk" : 113789,
            "Template Mode" : "automatic"
          }

        如果啟用 APP Thinning 來生成不同設備的 ipa 包,然后針對每個 ipa 包都進行一次解壓縮,并獲取其中的 Assets.car 導出對應的 assets.json 似乎有些冗余,你也可以利用 京東商城的 APP 瘦身實踐 中提及的 assetutil 的方法從通用包的 Assets.car 文件導出指定設備的 Assets.car 文件:

        assetutil --idiom phone --subtype 570 --scale 3 --display-gamut srgb --graphicsclass MTL2,2 --graphicsclassfallbacks MTL1,2:GLES2,0 --memory 1 --hostedidioms car,watch xxx/Assets.car -o xxx/thinning_assets.car

        壓縮的危害

        不要盲目的追求最大的壓縮比,既需要考慮壓縮出圖片的質量,也需要考慮經過 Xcode 最終構成文件的真實大小。

        壓縮完成的圖片盡量在高分辨率的設備上看看會不會有什么問題,讓 UI 妹子好好看看,會不會出現噪點、毛邊等現象。

        如果一個圖片經過有損壓縮最終導致其在 Assets.car 中 SizeOnDisk 值變得很大的話,但其在各個設備上的表現情況又挺好,你可以嘗試將其加到 bundle 中使用,并將其圖片格式修改為 Data,這樣 Xcode 就不會對其進行壓縮處理了。不過不要忘記將調用方法改為 imageWithContentOfFile:。

        面試解析

        整理編輯:反向抽煙、師大小海騰

        面試解析是新出的模塊,我們會按照主題講解一些高頻面試題,本期主題是計算機網絡,以下題目均來自真實面試場景。

        輸入網址進入網頁按回車刷新網頁都發生了什么?URL 輸入到顯示的過程?

        1. DNS 解析:當用戶輸入一個網址并按下回車鍵的時候,瀏覽器獲得一個域名,而在實際通信過程中,我們需要的是一個 IP 地址,因此我們需要先把域名轉換成相應 IP 地址;
        2. TCP 連接:瀏覽器通過 DNS 獲取到 Web 服務器真正的 IP 地址后,便向 Web 服務器發起 TCP 連接請求,通過 TCP 三次握手建立好連接后,瀏覽器便可以將 HTTP 請求數據發送給服務器了;
        3. 發送 HTTP 請求:瀏覽器向 Web 服務器發起一個 HTTP 請求,HTTP 協議是建立在 TCP 協議之上的應用層協議,其本質是在建立起的 TCP 連接中,按照 HTTP 協議標準發送一個索要網頁的請求。在這一過程中,會涉及到負載均衡等操作;
        4. 處理請求并返回:服務器獲取到客戶端的 HTTP 請求后,會根據 HTTP 請求中的內容來決定如何獲取相應的文件,并將文件發送給瀏覽器;
        5. 瀏覽器渲染:瀏覽器根據響應開始顯示頁面,首先解析 HTML 文件構建 DOM 樹,然后解析 CSS 文件構建渲染樹。如果頁面有 JavaScript 腳本文件,那么 JavaScript 文件下載完成并加載后,通過 DOM API 和 CSSOM API 來操作渲染樹,等到渲染樹構建完成后,瀏覽器開始布局渲染樹并將其繪制到屏幕上;
        6. 斷開連接:客戶端和服務器通過四次揮手終止 TCP 連接。

        擁塞控制有哪些階段?如何實現擁塞控制?TCP 的擁塞控制解釋一下?

        1. 擁塞控制考慮整個網絡,是全局性的考慮;
        2. 慢啟動算法:由小到大逐漸增加發送數據量,每收到一個報文確認就加 1 倍的報文數量,以指數規律增長,增長到慢啟動閾值后就不增了;
        3. 擁塞避免算法:維護一個擁塞窗口的變量,只要網絡不擁塞,就試探著擁塞窗口調大,以加法規律增長,該算法可以保證在網絡不擁塞的情況下,發送更多的數據;
        4. 快速重傳:接收端收到的序列號不連續時,連發 3 個重復的確認報文給發送方;
        5. 快速恢復:擁塞窗口變為原來的一半,閾值也變為發生擁塞時大小的一半,繼續擁塞避免算法。

        TCP 怎么保證可靠傳輸?TCP 怎樣實現可靠傳輸的?TCP 為什么可以保證可靠傳輸?怎么理解 TCP 的連接,可靠和字節流?

        1. 數據分塊:應用數據被分割成 TCP 認為最適合發送的數據塊;
        2. 序列號和確認應答:TCP 給發送的每一個包進行編號,在傳輸的過程中,每次接收方收到數據后,都會對傳輸方進行確認應答,即發送 ACK 報文,這個 ACK 報文當中帶有對應的確認序列號,告訴發送方成功接收了哪些數據以及下一次的數據從哪里開始發。除此之外,接收方可以根據序列號對數據包進行排序,把有序數據傳送給應用層,并丟棄重復的數據;
        3. 校驗和:TCP 將保持它首部和數據部分的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到報文段的檢驗和有差錯,TCP 將丟棄這個報文段并且不確認收到此報文段;
        4. 流量控制:TCP 連接的雙方都有一個固定大小的緩沖空間,發送方發送的數據量不能超過接收端緩沖區的大小。當接收方來不及處理發送方的數據,會提示發送方降低發送的速率,防止產生丟包。TCP 通過滑動窗口協議來支持流量控制機制;
        5. 擁塞控制:當網絡某個節點發生擁塞時,減少數據的發送;
        6. ARQ 協議:也是為了實現可靠傳輸的,它的基本原理就是每發完一個分組就停止發送,等待對方確認。在收到確認后再發下一個分組;
        7. 超時重傳:當 TCP 發出一個報文段后,它啟動一個定時器,等待目的端確認收到這個報文段。如果超過某個時間還沒有收到確認,將重發這個報文段。

        優秀博客

        整理編輯:皮拉夫大王在此、我是熊大

        本期主題:啟動優化

        一、如何實現 iOS App 的冷啟動優化 -- 來自掘金:FiTeen

        工欲善其事,必先利其器。想要優化啟動速度首先要了解什么是冷啟動,以及冷啟動過程中經歷了哪些階段,然后找到可以進行優化的關鍵點。作者詳細介紹了啟動的理論知識和檢測工具,包括冷啟動與熱啟動的區別,如何查看階段耗時以及相關概念解讀。這是優化啟動速度的必備功課,對于想要做啟動速度優化相關同學來說,值得學習。

        二、深入探索 iOS 啟動速度優化(二進制重排) -- 來自掘金:SimonYe

        二進制重排原理是,在啟動過程中,會調用各種函數,這些函數分布在各個 TEXT 段中且可能是不連續的,此時需要多次 page fault 創建分頁,而每頁大概 16kb,每次 page fault 都有耗時。如果我們重排二進制,把他們放在一起,減少 page fault 的次數,是不是就可以減少耗時了?作者介紹了二進制重排的理論基礎,以及實踐流程,還有關于二進制重排的總結,具體二進制重排能提升多少,還得你自己實踐。如果想要實踐二進制重排,這篇文章將給你幫助。

        三、??記錄啟動速度優化30%的過程 -- 來自掘金:我是熊大

        早期的 Pod 對于 Swift 工程只支持動態庫的形式導入,但在 Cocoapods 1.9 中增加了新的特性 use_frameworks! :linkage => :static 支持以靜態庫形式導入,如果你是 Swift 的工程,那么可以試一下。本文還介紹了動態庫與靜態庫的區別。

        四、抖音品質建設 - iOS啟動優化《原理篇》 -- 來自掘金:字節跳動技術團隊

        面試官經常問一個問題:從用戶點擊圖標開始,到用戶看到第一幀圖像,都經歷了哪些過程。這篇文章將會給出非常全面的答案。想要做啟動優化首先要了解 iOS 在啟動時都做了哪些事情。文章首先介紹了一些基礎概念,如:啟動的種類、dyld、mmap、Page In等。隨后介紹了 IPA 的構建流程,透露了如何基于 LLVM 插樁來實現無用代碼檢測。文章著重介紹了 dyld3 的啟動流程。dyld3 都緩存了哪些內容?Rebase & Bind 各自是做什么的?啟動終點應該定在哪里?這些內容是面試中常見的問題。

        五、58 同城 App 性能治理實踐-iOS 啟動時間優化 -- 來自公眾號:58技術

        這篇文章是 58同城 APP 做啟動優化的實踐整理。從啟動耗時監控到啟動治理文章都有介紹。文中介紹了如何橫向對比兩個 APP 的啟動時間、如何進行動態庫懶加載實現啟動優化、Swift 符號如何收集等方案。對 APP 的啟動優化實踐有一定的參考意義。

        六、哈啰出行iOS App首屏秒開優化 -- 來自公眾號:哈啰技術

        此篇文章與前兩篇文章內容上稍有重疊,但是偏重于介紹圖片及動畫解碼對 APP 啟動的影響。本文提供了多個具有參考價值的案例,如:Lottie 框架在同步處理轉碼時的性能問題。作者提出了 Lottie 處理大圖或者關鍵幀多張的圖片阻塞主線程的問題,并給出了相應的處理方式。

        學習資料

        整理編輯:Mimosa

        RSSHub

        地址:https://docs.rsshub.app/

        RSSHub 是一個開源、簡單易用、易于擴展的 RSS 生成器,可以給任何奇奇怪怪的內容生成 RSS 訂閱源。RSSHub 借助于開源社區的力量快速發展中,目前已適配數百家網站的上千項內容,且可以配合瀏覽器擴展和移動端的 App 一起使用,同時也歡迎編寫你感興趣的訂閱源。

        中文技術文檔的寫作規范

        地址:https://github.com/ruanyf/document-style-guide

        來自阮一峰的中文技術文檔的寫作規范。編者在各大博客平臺看技術文章的時候,經常會為文章的格式所苦惱,嚴重的情況下甚至導致編者直接關閉該篇文章。實際上中文文案的寫作規范不是那么復雜,學十幾分鐘、練習幾篇文章,就能寫出得體的文案格式。良好的寫作規范既能節約溝通成本,也能提升文章氣質,學到就是賺到,是一輩子的財富。另也強力推薦這篇 中文文案排版指北 做參考。

        工具推薦

        整理編輯:zhangferry

        WWDC

        地址:https://wwdc.io/

        軟件狀態:免費,開源

        介紹

        一個開源的非官方 WWDC 視頻的應用,其支持視頻下載、最高 5 分鐘的視頻切割、書簽功能、iCloud 同步、Chromecast 投屏、畫中畫功能等等。相比于官方應用來說,其功能只多不少(官方新版的 Developer 應用添加了代碼片段預覽功能),而且更新比較迅速,已經發展到了 v7.3.3 版本,可以查看 2021 年的 Sessions。

        ScreenSize

        地址:https://www.screensizes.app/

        介紹

        一個在線的 Apple 設備尺寸及設備內各組件的尺寸整理網站,非常之全。這里簡要概括下其在 iPhone 設備包含的內容:

        • 橫豎屏狀態的安全區域大小
        • 三種 Widget 尺寸的大小
        • 標準模式和系統放大模式的尺寸大小
        • 各個設備之間的尺寸對比

        聯系我們

        iOS摸魚周報 第十一期

        iOS摸魚周報 第十二期

        iOS摸魚周報 第十三期

        iOS摸魚周報 第十四期

        iOS摸魚周報 第十五期