iOS摸魚周報 第四期

zhangferry· 2021-01-25

iOS摸魚周報,主要分享大家開發過程遇到的經驗教訓及學習內容。雖說是周報,但當前內容的貢獻途徑還未穩定下來,如果后續的內容不足一期,可能會拖更到下一周再發。所以希望大家可以多分享自己學到的開發小技巧和解bug經歷。

周報倉庫在這里:https://github.com/zhangferry/iOSWeeklyLearning ,可以查看README了解貢獻方式;另可關注公眾號:iOS成長之路,后臺點擊進群交流,聯系我們。

開發Tips

開發小技巧收錄。

定時清理腳本

iOS里面經常打包的機器會產生很多xcarchive文件,該文件用于生成最終的ipa,它除了包含應用外還包含dsym文件,所以一般都比較大。如果構建次數很多,他們會很容易就填滿磁盤空間,導致后續的構建任務失敗。針對這種現象我們可以寫一個定時任務用于清除這類文件。

該過程分為兩步:

1、編寫清理腳本

這里也可以寫別的你想定時執行的任務

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

# 清楚文件特征,可以用正則語法
rule="*.xcarchive"

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

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

添加定時任務需要用到cron工具,cron是一款類Unix的操作系統下的基于時間的任務管理系統。用戶們可以通過cron在固定時間、日期、間隔下,運行定期任務(可以是命令和腳本)。我們在mac系統也可以使用cron。

需要注意的是由于在macOS Catalina下系統對 cron的權限進行了限制,我們需要給該執行文件添加完全磁盤訪問權限才可以使用。

步驟是:

1、執行whereis cron,查看cron所在目錄,通常它在/usr/sbin/cron下。

2、使用Finder 跳轉到該目錄

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

4、將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 (系統內置)

是如何解決的?

在這里找到了問題討論:https://github.com/CocoaPods/CocoaPods/issues/10286

可以通過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地址:https://github.com/apple/darwin-xnu

什么是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團隊竟然沒有單獨的技術公眾號。微信團隊之前有個博客:https://wereadteam.github.io/ ,但看了下2020年只發過一篇文章。

美團

公眾號:美團技術團隊

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

移動端UI一致性解決方案

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

滴滴

公眾號:滴滴技術

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

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

即刻

公眾號:即刻技術團隊

綜合技術公眾號,移動端內容也不少。整理來看即刻做的還是挺不錯的。

iOS中的網絡調試

其他公司

還有很多科技公司在維護技術公眾號,不再過多展開了,大家有興趣可以自行查找。

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

學習資料

Refactoring.Guru

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

開發利器

推薦好用的開發工具。

kaleidoscope

推薦來源:zhangferry

下載地址:https://kaleidoscope.app/

軟件狀態:付費,$69.99

使用介紹

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

Sherlock

推薦來源:zhangferry

下載地址:https://sherlock.inspiredcode.io/

軟件狀態:付費,$49

使用介紹

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

聯系我們

摸魚周報第一期

摸魚周報第二期

摸魚周報第三期

仙居天天乐棋牌下载 黑龙江体彩11选5 北京麻将技巧十句口诀 河北时时彩计算公式 福建22选5奖池 bg娱乐棋牌下载地址 体彩排列三试机号走势图彩宝网 排列5预测专家推荐号 一分赛车7码杀号技巧 比特币走势怎么看 福建时时彩中奖号码 广东36选7最新开奖 上海快3下载安装 DS视讯 重庆百变王牌开奖号 股票行情的图片 jdb电子财神捕鱼技巧