iOS摸魚週報 第三期

iOS摸魚週報,主要分享你們開發過程遇到的經驗教訓及學習內容。雖然說是週報,但當前內容的貢獻途徑還未穩定下來,若是後續的內容不足一期,可能會拖更到下一週再發。因此但願你們能夠多分享本身學到的開發小技巧和解bug經歷。html

週報倉庫在這裏:github.com/zhangferry/… ,能夠查看README瞭解貢獻方式;另可關注公衆號:iOS成長之路,後臺點擊進羣交流,聯繫咱們。前端

開發Tips

開發小技巧收錄。node

關於dateFormat

在程序開發過程當中若是想將字符串和Date類型進行互轉,就須要藉助於dateFormat進行格式指定。關於dateFormat有兩個國際標準,一個是ISO8601,一個是RFC3339,這兩個標準基本一致,但有一處不一樣是ISO容許24點,而 RFC3339 爲了減小混淆,限制小時必須在0至23之間。23:59過1分鐘,是次日的0:00。python

符號 含義
YYYY 按周算的年份
yyyy 天然年
MM
DD/dd
hh 小時
mm
ss

其中比較特殊的YYYY,舉個例子:git

let dateForamtter_yyyy = DateFormatter()
dateForamtter_yyyy.timeZone = TimeZone.init(secondsFromGMT: 8)
dateForamtter_yyyy.dateFormat = "yyyy-MM-dd"

let dateString = "2015-12-31"//2015-12-30
let date = dateForamtter_yyyy.date(from: dateString)!
print(date)//2015-12-31 00:00:00 +0000

let dateForamtter_YYYY = DateFormatter()
dateForamtter_YYYY.timeZone = TimeZone.init(secondsFromGMT: 8)
dateForamtter_YYYY.dateFormat = "YYYY-MM-dd"

let dateString_YYYY = dateForamtter_YYYY.string(from: date)
print(dateString_YYYY)//2016-12-31
複製代碼

會發現使用YYYY會多出一年,這是由於YYYY是按周定義的年,即系統認爲,2015年12月31號這天是2016年的第一週。測試發現1月1號所在的那周被稱爲新年第一週,注意是按週日爲新一週第一天算的。github

這與ISO8601定義的不一樣,它的定義爲1月4號所在那一週爲新年第一週,注意這裏是以週一爲新一週第一天算的。同時它還能夠表述爲新舊年交替週四在哪一年,則該周爲哪一年的周。有一個ISO8601DateFormatter類,能夠進行驗證:web

let dateForamtter_iso8601 = ISO8601DateFormatter()
dateForamtter_iso8601.timeZone = TimeZone.init(secondsFromGMT: 8)
dateForamtter_iso8601.formatOptions = [.withYear, .withMonth, .withDay, .withWeekOfYear]

let isoDateString = dateForamtter_iso8601.string(from: date)
print(isoDateString)//201512W5304
複製代碼

由此能夠看出蘋果的日期格式並無徹底遵照ISO8601規範,但它提供了特定類進行標準轉換。shell

對於RFC 3339 格式,能夠指定dateFormat和locale進行轉換:macos

let RFC3339DateFormatter = DateFormatter()
RFC3339DateFormatter.locale = Locale(identifier: "en_US_POSIX")
RFC3339DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
RFC3339DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
 
/* 39 minutes and 57 seconds after the 16th hour of December 19th, 1996 with an offset of -08:00 from UTC (Pacific Standard Time) */
let string = "1996-12-19T16:39:57-08:00"
let date = RFC3339DateFormatter.date(from: string)
複製代碼

參考:npm

en.wikipedia.org/wiki/ISO_we…

developer.apple.com/documentati…

那些bug

pod緩存問題

bug出現的現象是什麼樣的?

編譯失敗,由pod管理的三方庫提示沒法找到頭文件。在項目的引用文件中確實沒有該頭文件,去Pods文件夾查看,發現對應庫的引用出現了一個臨時文件夾,而這裏的文件確實是缺失該頭文件的。

是如何解決的?

有兩種解決方案:

一、升級或者回退對應庫的版本號(會影響功能使用,不推薦)

二、清除對應的pod庫的緩存:

$ pod cache clean 'PodModule' —-all # 清除特定倉庫的倉庫
$ pod cache clean —-all # 清除全部庫的緩存
複製代碼

Pods文件裏刪除對應庫的文件,從新install一下。

bug引起的反思

該問題僅在某個須要頻繁編譯打包的機器出現過,尚不清楚出現的緣由,猜想是頻繁的庫文件更新致使了pod文件添加出錯。由於pod是有緩存的,對於出錯的版本,它會一直加載錯誤的內容,除非換一個未被錯誤緩存的版本或者清除緩存從新install。但對於該問題的解決方式,能夠參考一下此解決方式。先確認文件引用關係,對於未正確引用的pod文件,清除緩存解決。

Error in PodSpec Validation due to architectures

bug出現的現象是什麼樣的?

在製做私有pod庫時,使用Xcode12進行lint操做,報錯提示:

ld: building for iOS Simulator, but linking in dylib built for iOS, file '/pathToSDK' for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
複製代碼

是如何解決的?

在podspec文件裏增長下面這個設置:

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
複製代碼

參考:github.com/CocoaPods/C…

bug引起的反思

Xcode 12支持arm64架構的模擬器(爲了M1芯片),pod的 lint 操做會嘗試編譯全部架構的狀況,對於沒上M1芯片的電腦,就會致使上述失敗提示。這時咱們能夠選擇在模擬器支持的架構裏去掉arm64。

編程概念

什麼是shell

shell有兩層含義,首先它表示一個應用程序,它鏈接了用戶和系統內核,讓用戶可以更加高效、安全、低成本地使用系統內核,這就是 Shell 的本質。shell自己並非shell內核,而是在內核的基礎上編寫的一個應用程序。

Linux上的shell程序有bash,zsh,Windows也有shell程序叫PowerShell。

第二層含義是腳本語言(Script),它是同JavaScript,Python,Ruby同樣的腳本語言;Shell有一套本身的語法,你能夠利用它的規則進行編程,完成不少複雜的任務。Shell腳本適合處理系統底層的操做,像Python等腳本語言也都支持直接執行shell命令。

這裏的Shell腳本語言是指可以被bash或者zsh解釋的腳本,shell腳本不能直接被windows識別,一般須要安裝bash程序輔助識別。

在iOS開發期間,shell做爲腳本經常使用於如下場景:

一、在Xcode中咱們能夠在Build Phase中添加腳本完成一些編譯時工做。

二、配置打包腳本,CI/CD等

什麼是bash

Bash,Unix shell的一種,1989年發佈第一個正式版本,原先是計劃用在GNU操做系統上,但能運行於大多數類Unix系統的操做系統之上,包括Linux與Mac OS X v10.4起至macOS Mojave都將它做爲默認shell,而自macOS Catalina,默認Shell以zsh取代。

Bash是一個知足POSIX規範的shell,支持文件名替換(通配符匹配)、管道、here文檔、命令替換、變量,以及條件判斷和循環遍歷的結構控制語句,同時它也作了不少擴展。

一般shell腳本的第一行會寫#!/bin/bash,即表明使用bash解釋該腳本。

什麼是zsh

zsh是一款可用做交互式登陸的shell命令解釋器,zsh對Bourne shell作了大量改進,同時加入了bash、ksh的某些功能。從macOS Catalina起系統默認shell從bash改成了zsh。

用戶社區網站Oh My Zsh專門收集zsh插件及主題,使得zsh使用起來更加便利也更受你們歡迎。

Oh My Zsh will not make you a 10x developer...but you may feel like one.

截止目前Oh My Zsh有1700+貢獻者,包含200+插件和超過140個主題。

ohmyzsh地址:github.com/ohmyzsh/ohm…

包管理器是什麼

包管理器又稱軟件包管理系統,它是在電腦中安裝、配置、卸載、升級,有時還包含搜索、發佈的工具組合。

Homebrew是一款Mac OS平臺下的包管理器,擁有安裝、卸載、更新、查看、搜索等不少實用的功能。

apt-getyum跟Homebrew相似,只不過他們適用的平臺是Linux,兩者通常會被分別安裝到Debian、Ubuntu和RedHat、CentOS中。

軟件包管理器,適用於特定開發語言,這類軟件包自己的安裝須要依賴特定語言環境。

NPM(node package manager),一般稱爲node包管理器,主要功能就是管理node包,使用Node.js開發的多數主流軟件均可以經過npm下載。

RubyGems是Ruby的一個包管理器,提供了分發Ruby程序和庫的標準格式「gem」,旨在方便地管理gem安裝的工具,以及用於分發gem的服務器。使用Ruby開發的軟件通常都經過gem進行管理。

pip 是通用的 Python 包管理工具,python3對應的是pip3。使用Python開發的軟件多使用pip進行管理。

什麼是ttys000

每次打開一個新的終端窗口,第一行顯示的內容就是Last login: Tue Dec 15 19:23:41 on ttys000,若是再開一個窗口(包括新的tab),除了時間的變化,還有就是最後的那個名稱,會變成ttys001,它會隨着窗口打開數量不斷增長。

這個ttys000是窗體的名稱,它來源於UNIX中的tty命令。終端中輸入tty,會返回當前的終端名稱:/dev/ttys000。dev是Linux系統的設備特殊文件目錄,該目錄不可見。

另外在窗體中輸入logout能夠關閉當前終端窗口。

什麼是Command Line Tools

Command Line Tools 是 一個運行在macos上的命令行工具集,它的安裝命令是:xcode-select --install

它是獨立於xcode的,名字帶有xcode只是由於它包含編譯iOS項目的命令行工具。

它安裝的內容除了clang、llvm等常見的工具外,還包括gcc、git等工具。

該工具集的安裝路徑是:/Library/Developer/CommandLineTools/usr/bin/

優秀博客

這期博客推薦順帶考察了一下各大廠的技術公衆號運營狀況(僅限移動端),雖然技術號不能反映一個公司的全貌,但多少仍是可以體現出該公司的開源分享精神的,順道推薦幾篇高質量的文章。內容較多,還會再有一期,前後順序不表明排名。

愛奇藝

公衆號:愛奇藝技術產品團隊

綜合公衆號,輸出穩定,質量較高,排版方面能夠,大綠框用了很久了,真的能夠換一下🤣。

效率提高50%,移動端UI自助驗收在愛奇藝的探索與實踐

愛奇藝知識移動端組件化探索和實踐

阿里

公衆號:淘系技術

綜合技術公衆號,輸出穩定且高產,質量很高,覆蓋面很廣,排版也不錯,在這幾個技術公衆號裏我感受是作的最用心也是最好的。

移動前端開發和 Web 前端開發的區別是什麼?

一文讀懂架構整潔之道

公衆號:閒魚技術

綜合技術公衆號,純移動端內容較少,閒魚是較早使用Flutter的團隊,這裏有很多Flutter 相關的實戰乾貨。

百度

公衆號:百度App技術

偏前端的公衆號,穩定輸出,質量能夠,可是選題較單一,排版有待提升。

百度App Objective-C/Swift 組件化混編之路(一)

百度App Objective-C/Swift 組件化混編之路(二)- 工程化

字節跳動

公衆號:字節跳動技術團隊

綜合技術公衆號,輸出穩定,質量較高,感受僅次於淘系技術。

iOS性能優化實踐:頭條抖音如何實現OOM崩潰率降低50%+

今日頭條優化實踐: iOS 包大小二進制優化,一行代碼減小 60 MB 下載大小

京東

公衆號:京東零售技術

綜合技術公衆號,穩定輸出,質量也能夠,排版感受通常,有待提升。

帶你深刻了解OC對象的銷燬過程

iOS連接原理解析與應用實踐

網易

公衆號:網易雲音樂大前端團隊

大前端技術公衆號,移動端相對較少,輸出穩定,質量能夠。從2020年5月份創建,排版不斷在優化,最新一期挺不錯,跟字節跳動技術團隊風格一致了。

網易雲音樂 iOS 14 小組件實戰手冊

網易還有另外兩個技術號,網易傳媒技術團隊,輸出相對少,有興趣的也能夠看下。

拼多多

很抱歉,沒有找到他們的技術公衆號,只搜到一堆砍價羣0。0,若是有了解的小夥伴能夠告知下。

學習資料

《Flutter技術解析與實戰》

鹹魚團隊對Flutter技術的探索與實戰分析,據說他們已經在準備寫第二本Flutter書了。能夠關注公衆號:鹹魚技術獲取,後臺免費獲取,另有實體書能夠淘寶搜索購買。

《Flutter開發實站詳解》

掘金做者 戀貓的小郭 寫的Flutter實戰詳解,能夠在京東、噹噹搜索購買實體或者電子版圖書閱讀。另外做者本人還有一個介紹 Flutter 技術的文章合輯,其與實體書不一樣,但內容仍是很詳實的,對Flutter 感興趣,想學習的話,能夠點開閱讀。

地址:GSY Flutter

開發利器

推薦好用的開發工具。

MacZip(原名eZip)

推薦來源zhangferry

下載地址ezip.awehunt.com/

軟件狀態:免費

使用介紹

Mac上很是好用的解壓縮軟件:

  • 支持rar, zip, 7z, tar, gz, bz2, iso, xz, lzma, apk, lz4等超過二十種壓縮格式。
  • 支持批量文件加密。
  • 支持壓縮包預覽

uTools

推薦來源zhangferry

下載地址u.tools/

軟件狀態:免費(部分功能付費)

使用介紹

uTools是一個豐富的生產力工具集,支持將近百種的插件。它的使用方式和 Alfred 相似,經過快捷鍵調出輸入框,並經過特殊指令執行結果。但它有比 Alfred 更簡單的插件集成方式,在我看來它是更易用的。

聯繫咱們

摸魚週報第一期

摸魚週報第二期

公衆號:iOS成長之路

相關文章
相關標籤/搜索