iOS摸魚週報 第四期

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

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

開發Tips

開發小技巧收錄。shell

定時清理腳本

iOS裏面常常打包的機器會產生不少xcarchive文件,該文件用於生成最終的ipa,它除了包含應用外還包含dsym文件,因此通常都比較大。若是構建次數不少,他們會很容易就填滿磁盤空間,致使後續的構建任務失敗。針對這種現象咱們能夠寫一個定時任務用於清除這類文件。編程

該過程分爲兩步:後端

一、編寫清理腳本設計模式

這裏也能夠寫別的你想定時執行的任務安全

#!/bin/sh
# 掃描文件路徑
targePath=~/Library/Developer/Xcode/Archives

# 清楚文件特徵,能夠用正則語法
rule="*.xcarchive"

# 刪除7天以前的文件
find ${targePath} -mtime +7 -name ${rule} -**exec** rm -rf {} \;
複製代碼

二、將腳本添加到系統定時任務中ruby

添加定時任務須要用到cron工具,cron是一款類Unix的操做系統下的基於時間的任務管理系統。用戶們能夠經過cron在固定時間、日期、間隔下,運行按期任務(能夠是命令和腳本)。咱們在mac系統也可使用cron。bash

須要注意的是因爲在macOS Catalina下系統對 cron的權限進行了限制,咱們須要給該執行文件添加徹底磁盤訪問權限纔可使用。服務器

步驟是:

一、執行whereis cron,查看cron所在目錄,一般它在/usr/sbin/cron下。

二、使用Finder 跳轉到該目錄

三、打開系統設置 > 安全與隱私 > 徹底磁盤訪問權限,打開加鎖。

四、將cron程序拖入到徹底磁盤訪問權限右側的程序目錄。

而後將腳本設置爲可執行文件:

$ chmod +x [corn_clean_file.sh](http://corn_clean_file.sh/)
複製代碼

進入crontab編輯界面

$ crontab -e
複製代碼

輸入以下內容,其表示天天凌晨三點執行對應任務,保存並退出。

00 03 * * * /path/clean_script.sh
複製代碼

蘋果家庭裏的兒童帳號退登問題

蘋果有項功能是家庭帳號,能夠爲子女設置獨立的兒童帳號,用於實現使用時長管理、支付管理等功能。

在測試兒童帳號的使用場景時發現一個問題,若是登陸了不滿13週歲的兒童帳號,會沒法退出,即便家長端也是沒法退出的。退出按鈕置灰,提示「因爲訪問限制,沒法退出登陸」。聯繫了蘋果客服才知道須要關掉家長端對於兒童帳號的全部限制才能夠退出帳號,由於設置兒童帳號時會有一個引導開啓屏幕時長管理的設置,因此關掉它就能夠正常退出了。

那些bug

問題現象

在執行bundle exec命令時遇到/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:24:10: fatal error: 'ruby/config.h' file not found #include "ruby/config.h"

的錯誤。

執行環境以下:

OS 版本:macOS Catalina

Xcode 版本:12.3

ruby 版本:2.6.0 (系統內置)

是如何解決的?

在這裏找到了問題討論:github.com/CocoaPods/C…

能夠經過rvm安裝ruby2.7.2或者3.0.0版本,而後使用新安裝的ruby版本便可。

簡單回顧下rvm管理ruby版本的用法:

$ ruby --version #查看當前ruby版本

$ rvm list known #列出當前可用ruby版本

$ rvm install 2.7.2 #安裝對應版本的ruby

$ rvm use 2.7.2 --defualt #設置當前使用版本,且設置爲默認值

#若是想切回系統版本能夠:
$ rvm use system --defualt
複製代碼

bug引起的反思

無論任何bug均可以從報錯的日誌裏找到一些蛛絲馬跡。該錯誤描述爲ruby/config.h頭文件找不到,該頭文件所在的目錄是系統自帶的Ruby.frameowrk框架,因此大機率能夠推測是該系統版本自帶的Ruby沒有內置這個文件,能夠推測是系統的問題。管理Ruby版本,推薦使用rvm,當安裝了2.7.2版本以後,確實能夠正常執行bundle命令了,說明確實是系統包的問題。

編程概念

本期概念圍繞幾個操做系統開展,系統能幫助你們瞭解各個操做系統之間的關係。

什麼是GNU

GNU是一個自由的操做系統,名字是一個遞歸 GNU’s Not Unix!的縮寫。

它出現的緣由是Unix被髮明後,開始收費和商業閉源,Richard Matthew Stallman以爲很不爽。因而發起了GNU計劃:創造一個仿Unix並與之兼容的自由開源操做系統。

爲此Stallman還建立了FSF(自由軟件基金會)和GPL(GNU通用公共許可協議),在GNU項目裏開發的軟件都遵循GPL協議。

在打造操做系統的過程當中,GNU開發出了編輯器Emacs,編譯器(GCC),shell等很牛叉的東西,但惟獨操做系統內核Hurd由於種種緣由一直沒法完成。

這時出現了Linux,它就是一個操做系統內核,不只開源還被普遍追捧。Linux和GNU像是天生一對,一個萬事具有隻缺內核,一個只專一作內核,因而一拍即合,不少Linux發行版開始接入GNU的組件,Linux也遵循了GPL協議。

因此Stallman主張Linux使用了不少GNU組件應該叫GNU/Linux,可是並無獲得Linux設計的一致認同,因此該名稱仍有爭議。

但Hurd的開發並無所以結束,目前還在進行中。

什麼是GCC

早期 GCC 的全拼爲 GNU C Compiler,即 GUN 計劃誕生的 C 語言編譯器,顯然最初 GCC 的定位確實只用於編譯 C 語言。但通過這些年不斷的迭代,GCC 的功能獲得了很大的擴展,它不只能夠用來編譯 C 語言程序,還能夠處理 C++、Go、Objective -C 等多種編譯語言編寫的程序。與此同時,因爲以前的 GNU C Compiler 已經沒法完美詮釋 GCC 的含義,因此其英文全稱被從新定義爲 GNU Compiler Collection,即 GNU 編譯器套件。

GCC 編譯器從而中止過改進。截止到今日(2020 年 5 月),GCC 已經從最初的 1.0 版本發展到了 10.1 版本,期間歷經了上百個版本的迭代。做爲一款最受歡迎的編譯器,GCC 被移植到數以千計的硬件/軟件平臺上,幾乎全部的 Linux 發行版也都默認安裝有 GCC 編譯器。

補充一句,早期OC項目都是經過GCC編譯的,由於不知足於GCC的性能,Chris Lattner開發了Clang。

什麼是XNU

XNU是一個由蘋果電腦開發用於macOS操做系統的操做系統內核。它是Darwin操做系統的一部分,跟隨着Darwin一同做爲自由及開放源代碼軟件被髮布。它仍是iOS、tvOS和watchOS操做系統的內核。XNU是X is Not Unix的縮寫。這一點跟GNU同樣。

XNU最先是NeXT公司爲了NeXTSTEP操做系統而發展的,在蘋果電腦收購NeXT公司以後,XNU的Mach微內核被升級到Mach 3.0。

須要注意區分的概念是操做系統內核,操做系統,桌面操做系統。

Mach是一個微內核

XNU是一個混合操做系統內核,包含Mach

Darwin是以XNU爲內核發佈的開源操做系統

macOS是以Darwin爲核心的桌面操做系統

Darwin地址:github.com/apple/darwi…

什麼是FreeBSD

在此以前先說下BDS(Berkeley Software Distribution 伯克利軟件套裝),它是Unix的衍生系統,在1977至1995年由伯克利大學分校開發和發佈,其是去除SyStem V 刪除了AT&T專利代碼的。

隨着該系統的發展,還提出了新的許可協議:BSD License,它在軟件使用上提供了最小限度的限制,它容許遵循該協議的軟件被二次開發,且開發以後的版本能夠閉源。

因此基於BSD發展出了不少類Unix系統,被稱爲BSD家族,其中最著名的當屬FreeBSD。直到如今FreeBSD仍然在不少網站的服務器上運行着。

喬幫主在NextStep時開發了基於FreeBSD的後端Darwin,迴歸Apple就給帶過去了,而這個就是MacOS的內核,以後的iOS,watchOS也都是基於Darwin構建的。

索尼用FreeBSD創造了PS3,PS4。

任天堂用FreeBSD創造了Nintendo Swiftch。

BSD的發展歷史:

什麼是POSIX

POSIX是Portable Operation System Interface的縮寫,便可移植操做系統接口,它是由IEEEE爲了在Unix上運行軟件提出的一系列標準,X代表其對Unix API的傳承。

類Unix系統像Linux、MacOS中均實現了對POSIX接口的兼容,其中咱們在多線程使用過程當中建立的pthread(前面的p即POSIX),就是基於POSIX裏的線程標準設計的。

優秀博客

搜狐

公衆號:搜狐技術產品

綜合性技術公衆號,輸出穩定,質量也不錯。偏重運營一些,會有不少轉載內容。

帶你實現完整的視頻彈幕系統

iOS插件化架構探索

騰訊

公衆號:騰訊音樂技術團隊

騰訊音樂開發團隊公衆號,更新不穩定,可能一兩個月纔會有一篇文章,但質量仍是不錯的。

Q音直播編譯優化與二進制集成方案

騰訊還有個號是騰訊技術工程

綜合性技術公衆號,更新較穩定。 另外有點奇怪的是,微信團隊和QQ團隊居然沒有單獨的技術公衆號。微信團隊以前有個博客:wereadteam.github.io/ ,但看了下2020年只發過一篇文章。

美團

公衆號:美團技術團隊

綜合性技術公衆號,輸出穩定,質量很高,原創文章數量已達358篇,都是團隊內部人員寫的,很是不錯。

移動端UI一致性解決方案

Flutter包大小治理上的探索與實踐

滴滴

公衆號:滴滴技術

綜合性技術公衆號,可是移動端內容真的不多。不過滴滴在開源社區的貢獻仍是挺大的,DoraemonKit和chameleon都有很高的star數。

滴滴開源 DoraemonKit:一款像哆啦A夢般全能的App研發工具

即刻

公衆號:即刻技術團隊

綜合技術公衆號,移動端內容也很多。整理來看即刻作的仍是挺不錯的。

iOS中的網絡調試

其餘公司

還有不少科技公司在維護技術公衆號,再也不過多展開了,你們有興趣能夠自行查找。

公司名 公衆號名 說明
小米 小米科技 無移動端內容
貝殼找房 貝殼產品技術 綜合號,有移動端內容
快手 快手Ytech 無移動端內容
360 360技術 綜合號,有移動端內容
攜程 攜程技術 綜合號,有移動端內容

學習資料

Refactoring.Guru

一個很是有趣的講解設計模式、SOLID原則、重構原則的網站。支持八種語言,有不少豐富的配圖幫助咱們理解這些重要的編程概念。

開發利器

推薦好用的開發工具。

kaleidoscope

推薦來源:zhangferry

下載地址:(不讓放有購買項的連接,去這裏查看吧 zhangferry.com/2021/01/24/…

軟件狀態:付費,$69.99

使用介紹

kaleidoscope中文翻譯是萬花筒,它是一款顏值很高,專業性很強的diff工具。不光能查看文本的不一樣,還能識別圖片和文件夾的不一樣。咱們能夠將它與 git 組合使用,使用它替換git的mergetool。

Sherlock

推薦來源:zhangferry

下載地址:(不讓放有購買項的連接,去這裏查看吧 zhangferry.com/2021/01/24/…

軟件狀態:付費,$49

使用介紹

在iOS開發過程當中的UI調試經常是讓人痛苦的,由於不支持熱更新,咱們稍微改動一點地方就須要編譯整個項目從新運行,這無疑很浪費時間。而Sherlock就是用於解決這個問題的工具(僅支持模擬器),咱們能夠實時修改各個控件的UI屬性,並進行查看最終效果。

往期推薦

摸魚週報第一期

摸魚週報第二期

摸魚週報第三期

相關文章
相關標籤/搜索