13的話
農曆新年放假回來歡迎開工的週報等著你。
請訂閱 Patreon 來支持我的電子報。
🧪Apple Releases
iOS 16.3 的開發者 Release Notes 基本上沒內容。不過對於消費者來說,卻在 HomePod mini(以及 HomePod 二代)解鎖了隱藏的溫度與濕度感應器。驚不驚喜,意不意外?
📰Apple 新聞稿
新款的 MacBook Pro 的效能跟續航力都比前代增加不算少了,不過我覺得上一代遲遲不買的人,新一代同樣不會買吧😂 至少我自己就是這樣。
如果你想要以最低的成本,獲得最大的軟體編譯效能,那麼 Mac mini M2 Pro 非常值得考慮。它的速度不會輸給 Mac Studio M1 Max。
就算不買 M2 Pro,M2 版的 Mac mini 也是非常優秀,何況相比前代還降價了。
此外,特別提醒一下,M2 Pro 系列都支援 HDMI 2.1,,具備能夠讓外接螢幕跑到 8K@60 或是 4K@240 的頻寬,有別於以往的 4K@60。有需要這項規格的朋友就懂。
比較有趣的是 HomePod。外型看不出明顯差異、SoC 從 A8 換成跟 Apple Watch Series 7 一樣的 S7。支援 Thread 通訊協定(用在 Matter)、多了溫濕度感應器、UWB 可以跟 iPhone 交換播放中的音樂。但奇怪的是 Wi-Fi 支援從 802.11ac 降為 802.11n,以及少了 2 個高音單元及 2 個麥克風。這些變更對於音質造成的影響,還是得等正式發售後的實測了。
💎The Art of Code: Apple Lisa
Computer History Museum(電腦歷史博物館)釋出了 Apple Lisa 的原始碼。就是那個 Steve Jobs 以自己女兒命名、後來被麥金塔取代的產品線(時代的眼淚 1)。
有興趣的朋友可以同意開源協議之後下載。
🙏AFNetworking is Deprecated
This repository has been archived by the owner on Jan 18, 2023. It is now read-only.
Apple Foundation 還沒有 URLSession
的時代,AFNetworking 是處理網路層最好的選擇。Swift 推出以後,對應的 Alamofire 逐漸取代前者的地位。
如今,時代的眼淚(2), 功成身退。
🖊Flutter Forward 摘要──zonble
這次發表了 Flutter 的最新穩定版本 3.7版,Dart 語言方面,也發表了 Dart 3 的 Alpha 版本,根據之前發表的 roadmap ,Dart 3 會在今年中發表穩定版本,預計會在 Google I/O 發表。同時也介紹了一些新的開發工具。
zonble 的推文串
👀值得一看: Twitter 關閉第三方 App API
Twitter 幾週前,無預警地關閉一些第三方 app 的 API 的存取權,使得許多非官方的 Twitter 客戶端應用程式直接變成無法使用。最熱門的 app 像是我寫週報時整理推文的工具 Tweetbot、史上第一個 Twitter app──Twitterrific 都受到影響。
在談 Twitter 之前,我想岔開話題,講一個身為 iOS 開發者的經驗。
我寫過一個 iOS 筆記 app(目前還在架上,我自己也還在用)。其中一次重大改版是想加入 CloudKit 同步機制,同時我發現 Dropbox 推出了一個叫做 Datastore API 的服務,可以讓使用者擁有超快速的同步體驗,給開發者的 SDK 簡單好用。由於該 app 本來就有匯出筆記到所登入的 Dropbox 帳號的功能,於是我決定同時支援兩種同步機制,讓使用者自行選擇。
當時還有一個類似的服務叫做 Parse(時代的眼淚 3),被 Facebook 買下來不久就停止支援了。類似的 Firebase Realtime Database 則是這之後幾年才推出。
經過幾個月的開發與測試,就在我準備要把更新版送審上架時,Dropbox 宣布將在一年內停止支援 Datastore API😱。背後的原因不外乎是推出該服務後使用人數太少,對公司的效益不夠。
這消息對我當然是晴天霹靂。對我的 app 來說,這個功能如果推出給使用者,很快就要拔掉。我只好當機立斷地把該功能拔除,之前有大半努力都白費了。幸好,當時的架構有做好切割,所以切除手術並沒有影響到其他部分。大概一個工作天就把相關部分砍完了🥹
這個經驗讓我深刻體會到任何 dependency 都存在風險。只要你的軟體依存於其他軟體或者服務,就要嚴格考慮「一旦該部分不再能使用,原本的程式會怎麼樣」。能找到替代方案嗎?能輕易地替代掉嗎?對於開發團隊的影響是什麼?對於使用者體驗又會帶來什麼衝擊?輕微的情況是找到替代方案,花時間去替換原本的部分。而最糟的情況則是,整個軟體的價值不復存在。
我很感謝,在接觸 iOS 開發的頭兩年就學到這麼寶貴的一課。
回到 Twitter。
Twitter 官方並沒有事先對開發者進行預告,在關閉存取權以後好長一段時間也沒有正面回應。
事後得知,這並非服務出問題,而是 Twitter 官方有意為之。原因不難理解──非官方 app 不顯示廣告,對營收不利。但是 Twitter 沒有任何事前事後溝通,透明度為 0,是極度糟糕的處理方式。
第三方 Twitter apps 是很多開發者挑戰自我的題目,原因不外乎是:技術方面的難度、有大量的使用者、UX 有既定慣例,也有可以自行創新的地方。早期 Twitter 的成功大概也離不開各種第三方應用。
面對 Twitter 這種「管你去死」的態度,開發者們當然是很不爽,不過他們能做的事情就是宣布停止這些 apps(時代的眼淚 4),然後順便說「我們已經在開發 Mastodon/ActivityPub App,敬請期待」。
![Twitter avatar for @KrauseFx](https://substackcdn.com/image/twitter_name/w_96/KrauseFx.jpg)
![Image](https://substackcdn.com/image/fetch/w_600,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fpbs.substack.com%2Fmedia%2FFnpmuY4XoAIR7WR.jpg)
![Image](https://substackcdn.com/image/fetch/w_600,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fpbs.substack.com%2Fmedia%2FFnpnLeqWYAAS6Gs.jpg)
對我個人的資訊流與工作流來說,Twitter 現在變得很難用,Mastodon 還完全無法取代過去的 Twitter。不過我最想跟大家說的,還是上面提到的經驗:「一旦失去了某個 dependency(以今天的例子就是 Twitter API 存取權),軟體的存在意義就消失。」這種事情是會發生的,而且還可以用比你想像地到最糟糕還要糟的方式發生。
希望這整起事件、我個人的經驗分享,可以帶給你的軟體開發有一些啟示。
其實一個人要能活在現代社會,無處不是 dependency。不過這樣就扯太遠了😂
🤪Random Tweets
![Twitter avatar for @tualatrix](https://substackcdn.com/image/twitter_name/w_96/tualatrix.jpg)
![Twitter avatar for @ethanhuang13pro](https://substackcdn.com/image/twitter_name/w_96/ethanhuang13pro.jpg)
![Twitter avatar for @tualatrix](https://substackcdn.com/image/twitter_name/w_40/tualatrix.jpg)
💼職缺/履歷交流區
如果你有 iOS 相關職缺或是求職履歷想要刊登在開發者週報,請見關於。
🙏支持 13 寫作,請訂閱我的 Patreon。也歡迎按喜歡❤️、留言💬、回信✉️與我交流。
[分享]
在 iOS 16 剛出的時候,有發現使用原生 TTS 會閃退,目前在 iOS 16.3 上應該是修好了,
我這邊有驗證 iPhone 11 pro, iPhone 13 pro max, 14 pro max 試跑時間都有連續 8hr+。
---
Crash Report
Crashed: com.apple.TextToSpeech.SpeechThread
0 libobjc.A.dylib 0x1c38 objc_msgSend + 56
1 libobjc.A.dylib 0x15d8 AutoreleasePoolPage::releaseUntil(objc_object**) + 196
2 libobjc.A.dylib 0x4f80 objc_autoreleasePoolPop + 256
3 libobjc.A.dylib 0x32bbc objc_tls_direct_base<AutoreleasePoolPage*, (tls_key)3, AutoreleasePoolPage::HotPageDealloc>::dtor_(void*) + 168
4 libsystem_pthread.dylib 0x1bd8 _pthread_tsd_cleanup + 620
5 libsystem_pthread.dylib 0x4674 _pthread_exit + 84
6 libsystem_pthread.dylib 0x16d8 _pthread_start + 160
7 libsystem_pthread.dylib 0xba4 thread_start + 8