1. 程式人生 > 實用技巧 >老司機 iOS 週報 #131 | 2020-10-12

老司機 iOS 週報 #131 | 2020-10-12


點選【閱讀原文】體驗更佳!

老司機 iOS 週報,只為你呈現有價值的資訊。

你也可以為這個專案出一份力,如果發現有價值的資訊、文章、工具等可以到 Issues 裡提給我們,我們會盡快處理。記得寫上推薦的理由哦。有建議和意見也歡迎到 Issues 提出。

新聞

還沒全面替換 UIWebView?蘋果又給我們續了一命![1]

@Parsifal:早在 2014 年蘋果就釋出了 WKWebView 來替代 UIWebView,並且一直鼓勵開發者早日完成遷移。去年蘋果直接宣佈將停止接受使用 UIWebView 的 新 App,同時表示在 2020 年 12 月份起老 App 如果仍使用 UIWebView 則也無法提交。但日前蘋果表示 2020 年 12 月份這個 Deadline 被延長了

,具體日期待定,對於還沒切換 WKWebView 的開發者們,時間上會更充裕一些。

如果你的 App 仍然未完成遷移,以下 2 篇週報收錄過的文章,會有所幫助:

  • mattt 關於 WKWebView 特性及如何升級 UIWebView 至 WKWebView 的建議[2]

  • 如何檢測 App 內是否還有 UIWebView 相關內容[3]

蘋果推遲 APNs 提供商 API 適配的截止時間[4]

@Parsifal:去年 11 月蘋果開始要求開發者適配基於 HTTP/2 的 APNs 提供商 API,並且給定了一年的過渡期。這次蘋果宣佈這個截止時間從 2020.10.30 推遲至 2021.03.31,延長了整整 4 個月。有必要提一下,這個主要是後端推送服務的適配,主流第三方推送服務應該都已經適配了,若你們是使用的自建推送服務,那還是有必要和後端確認一下是否完成適配。

Apple 特別線上活動 - iPhone 12 真的來了

@Parsifal:前不久的秋季釋出會,蘋果讓 iPhone 12 缺席了,但好飯不怕晚!這周(北京時間 10 月 14 日週三凌晨 1 點)蘋果將再次舉辦特別線上活動,據報道此次釋出會的主角便是 iPhone 12 系列產品。

Flutter 1.22 正式釋出[5]

@CrazyCoderShi: Flutter 又又又釋出新版本了,估計很多同學 1.20 來沒捂熱呢,1.22 版本釋出。本次版本的升級又帶來了新一輪的功能釋出,效能改進和問題修復。恰逢移動平臺新版本(iOS 14/Android 11)的釋出季,此次的版本更新保證了 Flutter 應用在 Android 11 和 iOS 14 上的相容性,面向 iOS 14,本次更新包括了對 Xcode 12,新 Icon 的更新以及 App Clips 功能的預覽。對於Android 11,此次更新包括了多種螢幕適配以及軟鍵盤動畫的流暢性優化。

文章

???? ???? Flutter 效能優化的利器 —— Tracing

@邦Ben:工欲善其事,必先利其器。如果你需要分析某項功能耗時,那首先你需要解決的,如何去計算耗時,最簡單的就是打 log,前後節點時間戳相減得到耗時。對付簡單邏輯是沒問題的,但是如果遇到像 Flutter Engine 這類超長流程的耗時分析,那麼你不可能一點點加 log 來處理,費力不討好。因此該文講述了 Tracing 的使用,也就是分析耗時常用的"火焰圖"。

TracingChrome 開發者工具中強大的效能分析工具之一。

大致流程,通過 Tracing 的 API 去埋入各個點,然後生成一份複雜格式 json,最後拖進 Chromechrome://tracing 進行解析這份 json 生成一個很直觀的火焰圖。(一圖勝千言,這句話是真的。)

該文會專注在 Flutter Engine 中 Tracing 原理與實踐,會分為原理篇與實踐篇,原理篇會涉及到具體實現,實踐篇主要包括如何使用、分析、定製。具體程式碼分析較多,直接開啟看文章吧。

???? ???? Introducing Swift Atomics[6]

@EyreFree:Apple 官方釋出了一個新的可以在 Swift 程式碼中直接使用低階原子操作的開源軟體包 Swift Atomics,該庫為以下 Swift 型別實現了原子操作,所有這些型別均符合 AtomicValue 協議:

  • 標準符號整型(Int、Int64、Int32、Int16、Int8)

  • 標準的無符號整數型別(UInt、UInt64、UInt32、UInt16、UInt8)

  • 布林值(Bool)

  • 標準指標型別(UnsafeRawPointer、UnsafeMutableRawPointer、UnsafePointer、UnsafeMutablePointer),以及它們的可選包裹的形式(如 Optional<UnsafePointer>)

  • 非託管引用(Unmanaged、Optional<Unmanaged>)

  • 一種特殊雙字(DoubleWord)型別,由兩個 UInt 值 low 和 high 組成,提供雙倍寬度的原子基元

  • 任何 RawValue 是原子型別的 RawRepresentable 型別(例如簡單的自定義列舉型別)

  • 對選擇原子使用的類例項的強引用(通過遵守 AtomicReference 協議)

???? ???? 【譯】SE-0282 Low-Level Atomic Operations ⚛︎[7]

@四娘:前一段時間 Apple 團隊釋出了 swift-atomics[8],讓我們可以通過這個 package 用純 Swift 程式碼實現高效能的無鎖併發資料結構,這裡我就把它的前身 SE-0282 Low-Level Atomic Operations[9] 翻譯出來,希望可以幫助大家更好地理解 swift-atomics。

???? 官方推薦 | 在 Flutter 中使用 TensorFlow Lite 外掛實現文字分類

@蓮叔:Flutter 技術目前已經逐漸被主流的移動開發者接受,幾乎絕大多數大 App 都已經或多或少的擁抱了 Flutter 技術。這個趨勢帶來的額外收益就是外掛生態越來越繁榮,甚至開發者已經把目光投向了端智慧領域。本篇文章介紹了基於 tflite_flutter 外掛在 flutter 側實現一個簡單的文字情緒分類器,場景還算比較有趣,但整體比較簡單,偏教程。想試水端智慧的小白可以看看。

???? Dark side of extensions in Swift[10]

@極速男孩:Extensions 在 Swift 中類似於 Objective-C 中的 category,但是比 category 更加靈活和強大。Extensions 可以在一些現有的類中新增一些功能,甚至包括一些沒有原始碼的系統的類,甚至你可以對一個協議進行擴充套件。本文主要介紹瞭如何在 Swift 去使用 Extensions, 並討論如何處理物件和他的擴充套件之間的邊界的問題。

???? iOS 後臺鎖屏也能監聽搖一搖?[11]

@享耳先森:直覺來說,iOS App 如果進入後臺了能做的東西就非常少了,碰到「後臺檢測手機搖一搖」類需求時如何實現呢?作者給出了完整的研究和實現過程。

???? iOS 是如何獲取夜間模式啟動圖快取路徑?[12]

@J_Knight_:本文作者首先驗證了通過啟動圖檔名是無法獲取夜間模式啟動圖的。然後介紹了通過分析系統檔案來獲取夜間模式啟動圖的過程。具體方案是通過解析applicationState.db檔案並通過測試找出了夜間模式啟動圖快取路徑。另外作者也給出了 dump applicationState.db 檔案後得出的資訊,有興趣的讀者可以閱讀原文檢視。

???? How Swift API Availability Works Internally[13]

@老峰:Swift 2.0 中引入了可用性的概念, 對於函式、類、協議等,可以使用 #available 宣告這些型別依賴於特定的平臺或作業系統版本。本文作者 Bruno Rocha 結合撰寫 swift #unavailable evolution 的過程深入研究分享了 #available 的工作原理及實現細節。

???? Binary Frameworks as Swift Packages[14]

@四娘:今年 Swift Package Manager 最重要的更新之一就是支援了二進位制分發,PSPDFKit 第一時間就做了 SPM 的支援,也給 Swift 團隊提了一些反饋意見(Bug),並且贊助 CocoaPods 團隊去開發 xcframework 相關的功能,文章裡簡短地介紹了 SPM 的接入流程和遇到的問題,感興趣的朋友可以看一下,在這裡也感謝他們對開源社群的回饋。

UC 核心團隊再出發,打造全新 Flutter 渲染引擎 —— Hummer[15]

@CrazyCoderShi: Flutter 可以說是近兩年來最火爆的移動跨平臺方案,無論是創新型應用還是老牌旗艦型應用,都在或多或少地嘗試 Flutter 技術。雖然 Flutter 看起來非常美好,但是它畢竟只是一個有潛力的新生兒,有待完善的地方還很多,UC 團隊對此做了大量的工作,對 Flutter 引擎的效能和相關配置工具等做了大量優化,就有了定製化 Flutter 引擎 Hummer[16], 目前 Hummer 已經取得了不少喜人的成績:

  • 混合棧開發方案優化

  • 啟動及首幀效能優化

  • 自適應的 DarkMode

  • 網路庫增強

工具

XcodeGen — Collaboration Made Easy[17]

@含笑飲砒霜:相信每一位開發者在合併程式碼的時候都會遇到與 .xcodeproj 檔案相關的衝突,解決這種衝突並不容易。有沒有比較好的方式或工具可以解決這種問題?沒錯,XcodeGen 可以提供很大幫助,XcodeGen 是用 Swift 編寫的命令列工具。它使用資料夾結構和專案規範來生成 Xcode 專案,其中包含生成專案所需的所有資訊,例如目標,方案,設定等, 同時允許我們將配置拆分為多個檔案,更易於管理。儘管 XcodeGen 會改變配置專案的方式,但在大型團隊工作時使用 XcodeGen 會受益良多。

程式碼

???? Announcing Swift Algorithms[18]

@zvving:Swift 官方新開源 Swift Algorithms 專案,旨在為 Swift 演算法程式碼提供通用基礎能力。目前包含集合 Chunked, Sampling,Rotate 等輔助方法。

專案尚在早期階段,以獨立庫的方式存在,初步對納入演算法標準提出建議,經過社群長期論證的演算法,最終會納入標準庫。

官方出品,品質保證。日常寫演算法比較多的同學可以先用起來。

Swift System[19]

@xiaofei86:蘋果在 WWDC20 "What's New in Swift" 公佈 Swift Archive 框架時,提到其檔案流建構函式用到了今年引入的另一個新框架 Swift System。之後簡單介紹了 Swift System 為 Apple Archive 的系統底層 API,提供更加現代、易用的系統介面,以及更加底層、通用的型別。除此之外,沒有公佈更多的資訊。

最近,蘋果開源了 Swift System,並引入了對 Linux 的支援。旨在提供多平臺的系統介面封裝,讓 Swift System 充當所有受 Swift 支援平臺的系統底層介面的唯一宿主。

贊助者

Woodpecker[20]: 是一款 iOS 開發除錯輔助工具,提供沙盒檔案、UserDefaults、檢視層級線上檢視和編輯等功能,在實際工作中能極大提升開發效率和幸福感!

非常感謝以上贊助者的支援,如果你也有贊助我們的興趣,歡迎新增微信 iTDriver 哦~

內推

老司機週報團隊聯合知識小集和 SwiftGG 翻譯組收錄了一份靠譜的內推職位。

如果你想找工作,點這裡:https://www.yuque.com/iosalliance/article/bhutav

如果你想招人,點這裡:https://www.yuque.com/iosalliance/article/ycyhf3

當然,也歡迎你關注我們每一期的週報,我們會在每期週報底部及時更新編輯內推崗位。

關注我們

我們開通了公眾號,每期釋出時公眾號(LSJCoding)會推送訊息,歡迎關注。

同時也支援了 RSS 訂閱:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

說明

???? 表示需某工具,???? 表示編輯推薦

預計閱讀時間:???? 很快就能讀完(1 - 10 mins);???? 中等 (10 - 20 mins);???? 慢(20+ mins)

參考資料

[1]

還沒全面替換 UIWebView?蘋果又給我們續了一命!: https://developer.apple.com/news/?id=edwud51q

[2]

mattt 關於 WKWebView 特性及如何升級 UIWebView 至 WKWebView 的建議: https://nshipster.com/wkwebview/

[3]

如何檢測 App 內是否還有 UIWebView 相關內容: https://blog.kulman.sk/determining-which-frameworks-use-uiwebview

[4]

蘋果推遲 APNs 提供商 API 適配的截止時間: https://developer.apple.com/news/?id=edwud51q

[5]

Flutter 1.22 正式釋出: https://juejin.im/post/6879048672597213198?utm_source=gold_browser_extension

[6]

Introducing Swift Atomics: https://swift.org/blog/swift-atomics/

[7]

【譯】SE-0282 Low-Level Atomic Operations ⚛︎: https://kemchenj.github.io/2020-10-02/

[8]

swift-atomics: https://github.com/apple/swift-atomics

[9]

SE-0282 Low-Level Atomic Operations: https://kemchenj.github.io/2020-10-02/

[10]

Dark side of extensions in Swift: https://dmtopolog.com/dark-side-of-extensions/

[11]

iOS 後臺鎖屏也能監聽搖一搖?: https://juejin.im/post/6881420727371694093

[12]

iOS 是如何獲取夜間模式啟動圖快取路徑?: https://ai-chan.top/hexo/2020/09/27/iOS-Snapshots/

[13]

How Swift API Availability Works Internally: https://swiftrocks.com/how-availability-works-internally-in-swift

[14]

Binary Frameworks as Swift Packages: https://pspdfkit.com/blog/2020/binary-frameworks-as-swift-packages/

[15]

UC 核心團隊再出發,打造全新 Flutter 渲染引擎 —— Hummer: https://juejin.im/post/6877716124117663757n

[16]

Hummer: https://juejin.im/post/6877716124117663757n

[17]

XcodeGen — Collaboration Made Easy: https://medium.com/dev-jam/xcodegen-collaboration-made-easy-9d1fdef548de?source=friends_link&sk=e13d571c9544f878a3c1510778a988c9

[18]

Announcing Swift Algorithms: https://swift.org/blog/swift-algorithms/

[19]

Swift System: https://github.com/apple/swift-system

[20]

Woodpecker: https://apps.apple.com/cn/app/woodpecker/id1333548463?mt=12