天天看點

iOS摸魚周報 第一期

iOS摸魚周報 第一期

iOS摸魚周報,分享大家開發過程遇到的經驗教訓及學習内容。成立的目的一個是開發知識碎片化,需要有一個地方去總結并用于回顧;另一個是為了提醒自己不斷學習,内卷日益嚴重的開發環境下,不進則退。

雖說是周報,但目前内容的貢獻途徑還未穩定下來,如果後續的内容不足一期,可能會拖更到下一周再發。是以希望大家可以多分享自己學到的開發小技巧和解bug遭遇。

周報倉庫在這裡:https://github.com/zhangferry/iOSWeeklyLearning,可以檢視README了解貢獻方式;另可關注公衆号:iOS成長之路,背景點選進群交流,聯系我們。

開發Tips

開發小技巧收錄。

IAP内購管理

推薦來源:zhangferry

處理内購時,如果我們需要應用内增加取消内購的入口,因為我們無法直接取消内購,隻能将使用者指引至蘋果的内購管理界面,由使用者在那裡操作。管理内購的連結有兩個:

  • https://buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/manageSubscriptions
  • https://apps.apple.com/account/subscriptions

前者是舊版連結,mac端能正常通路,但部分iPhone機型通路不了;後者為新版連結,多端都可以通路,最新版蘋果文檔标注推薦使用第二個連結。

除數為0的情況

推薦來源:zhangferry

var num1: Int = 0
var re1 = 10 / num1
print(re1)      

這裡會crash,出錯資訊為:​

​Fatal error: Division by zero​

var num2: Double = 0
var re2 = 10.0 / num2
print(re2)      

将Int改為Double則不會crash,輸出結果為​

​inf​

​,代表無限大

var re3 = Int(re2)
print(re3)      

将​

​re2​

​​轉成Int還是會crash,出錯資訊為:​

​Fatal error: Double value cannot be converted to Int because it is either infinite or NaN​

為什麼在數學中無意義的除0操作,用Int除時會crash,在Double除時不crash呢,還得到了一個inf。

首先說Double,它有兩個特殊的值,inf和nan,前者代表無限大,後者代表無意義,nan是0/0的結果。

那為什麼Int會crash呢,甚至在顯式地将0作為除數時會被編譯器識别并報錯。這是因為Int不能代表無限大,Int根據CPU是32還是64位會有對應最大值 2^31-1 和 2^63-1 。是以它不能表示所有自然數,也就沒有無限大的概念,是以在做除數會出現崩潰。

除了Swift,OC,C,C++,Java都是這樣設計的設計,其他語言沒驗證,但我估計應該也應該沿用這個思路,0不能做Int的除數但可以做Float和Double這種浮點型的除數。

使用altool上傳IPA至AppStore腳本

推薦來源:tzqiang

腳本主要功能為以下内容:

validate_upload_ipa() {
  validate=`xcrun altool --validate-app -f ${ipa_file} -t ios --apiKey ${api_key} --apiIssuer ${api_issuer} --verbose ;echo $?`
  echo -e "\033[34m 校驗結果: ${validate} \033[0m"
  validate_code=${validate:0-1}
  
  if [[ ${validate_code} == 1 ]]; then
    echo -e "\033[31m 校驗ipa檔案失敗!請排查錯誤日志進行調整 \033[0m"
  else
    echo -e "\033[32m ipa檔案校驗成功!準備上傳中...... \033[0m"
    
    upload=`xcrun altool --upload-app -f ${ipa_file} -t ios --apiKey ${api_key} --apiIssuer ${api_issuer} --verbose ;echo $?`
    echo -e "\033[34m 上傳結果: ${upload} \033[0m"
    upload_code=${upload:0-1}

    if [[ ${upload_code} == 1 ]]; then
      echo -e "\033[31m 上傳ipa檔案失敗!請排查錯誤日志進行調整 \033[0m"
    else
      echo -e "\033[32m ipa檔案上傳成功! \033[0m"
    fi
  fi
}      

完整内容可以檢視這裡:https://github.com/tzqiang/iOS_Shell/blob/main/upload_ipa.sh

那些bug

UITableview重新整理導緻的問題偏移錯誤

推薦來源:once-liu

bug現象

UITableView本身未設定​

​estimatedRowHeight​

​​,Cell固定高度,在執行​

​deleteRowsAtIndexPaths​

​​、​

​reloadRows​

​​或者​

​realodData​

​等重新整理方法時,在部分系統版本會導緻一定程度的異常偏移,即contentOffset.y偏移異常。

解決方案

該bug與 ​

​estimatedRowHeight​

​​ 有關,嘗試設定了 ​

​estimatedRowHeight​

​​與 ​

​rowHeight​

​值相同,問題得以解決。

bug解釋

檢視官方文檔中對于​

​estimatedRowHeight​

​的解釋:

Providing a nonnegative estimate of the height of rows can improve the performance of loading the table view. If the table contains variable height rows, it might be expensive to calculate all their heights when the table loads. Estimation allows you to defer some of the cost of geometry calculation from load time to scrolling time.

The default value is UITableViewAutomaticDimension, which means that the table view selects an estimated height to use on your behalf. Setting the value to 0 disables estimated heights, which causes the table view to request the actual height for each cell. If your table uses self-sizing cells, the value of this property must not be 0.

When using height estimates, the table view actively manages the contentOffset and contentSize properties inherited from its scroll view. Do not attempt to read or modify those properties directly.

​estimatedRowHeight​

​​預設值為​

​UITableViewAutomaticDimension​

​,它會自動計算出行高,并會影響contentOffset和 contentSize。而對于特定系統版本才出問題這一現象推測是蘋果本身的系統bug,在自動預估高度時會出現偏差導緻的。

cURL上傳腳本問題排查

推薦來源:zhangferry

bug現象

工程的shell腳本裡有一個函數是使用cURL上傳檔案,原來的機器(MacOS 10.15.5)執行這段代碼可以正常工作,更換為一台新裝置(MacOS 10.15.7)時就出現上傳失敗的情況。經過後端同學的測試(Windows和Linux),腳本沒有問題,隻是在我那台Mac上會上傳失敗,提示的是找不到檔案,但檔案的寫法經過反複檢查是沒問題的。

解決方案

在設定header時​

​-H 'content-type: multipart/form-data;’​

​ 最後的分号需要去掉。

bug解釋

正常在curl裡header設定就應該是key value的形式,不能有分号。但帶分号的寫法在​

​windows​

​​和​

​linux​

​電腦都可以正常執行,部分macOS,測試過的機型好像隻有10.15.5版本是可以執行的。帶分号的寫法在出問題的mac電腦上好像影響了後面的參數,緻使檔案參數讀取失效,導緻了提示檔案找不到。

關于-H的規範設定可以參考這個:https://catonmat.net/cookbooks/curl/add-http-headers

程式設計概念

來源于我在開發交流群裡的每日分享一個程式設計概念的内容整理,這些内容多參考主流網站介紹外加一些自己的了解。因為概念内容跨度較廣,很多也是我不熟悉的領域,如果有解釋不對的地方,歡迎大家指正。

什麼是Makefile

一個工程中的源檔案不計其數,其按類型、功能、子產品分别放在若幹個目錄中,而編譯通常是一個檔案一個檔案進行的,對于多檔案的情況,又該如何編譯呢?

這就是makefile的作用,它就像一個shell腳本(裡面也可以執行系統的shell指令),定義了一系列的規則,用于指定哪些檔案需要編譯,編譯順序,庫檔案的引用,及一些更複雜的編譯操作。

makefile隻是定義編譯規則,執行這些規則的指令是make指令。

makefile和make常用于Linux及類Unix環境下。

什麼是CMake

Make工具有很多種,比較出名的有GNU Make(昨天介紹的Make指令通常指GNU Make),QT 的qmake,微軟的MS nmake,BSD Make(pmake)等等。

這些 Make 工具遵循着不同的規範和标準,所要求的 Makefile 格式也千差萬别。這樣就帶來了一個嚴峻的問題:如果軟體想跨平台,必須要保證能夠在不同平台編譯。

這種環境下就誕生了CMake,其通過CMakeList.txt檔案來定制整個編譯流程,然後根據目标使用者的平台進一步生成所需的Makefile和工程檔案。達到「Write once, run everywhere」的效果。

Swift的編譯過程即是通過CMake定制的,我們可以在源碼裡發現多個CMakeList.txt檔案。

https://github.com/apple/swift/blob/main/CMakeLists.txt

什麼是xcodebuild

xcodebuild類似GNU裡的make,它是一套完整的編譯工具,其包括在指令行工具包(Command Line Tools)中。蘋果做了很多簡化編譯的操作,使得開發者不需要像使用make一樣編寫makefile,僅需根據實際情況指定workspace、project、target、scheme(這幾項概念要厘清分别指什麼東西)即可完成工程的編譯。使用​

​man xcodebuild​

​可以檢視xcodebuild所支援的功能以及使用說明。

其主要有以下功能:

1、build:建構(編譯),生成build目錄,将建構過程中的檔案存放在這個目錄下。

2、clean:清除build目錄下的檔案

3、test:測試某個scheme,scheme必須指定

4、archive:執行archive,導出ipa包

5、analyze:執行analyze操作

什麼是xcrun

xcrun 是 Command Line Tools中的一員。它的作用類似RubyGem裡的bundle,用于控制執行環境。

xcrun會根據目前的Xcode版本環境執行指令,該版本是通過​

​xcode-select​

​設定的,如果系統中安裝了多個版本的Xcode,推薦使用xcrun。

xcrun的使用是直接在其後增加指令,比如:​

​xcrun xcodebuild​

​​,​

​xcrun altool​

​。當然xcodebuild和altool也是可以單獨運作的,隻不過對于多Xcode的環境他們的執行環境究竟使用的哪個版本無法保證。

什麼是launchd

launchd是一套統一的開源服務管理架構,它用于啟動、停止以及管理背景程式、應用程式、程序和腳本。其由蘋果公司的Dave Zarzycki編寫,在OS X Tiger系統中首次引入并獲得Apache授權許可證。

launchd是macOS第一個啟動的程序,它的pid為1,整個系統的其他程序都是由它建立的。

當launchd啟動後,它會掃描​

​/System/Library/LaunchDaemons​

​​和​

​/Library/LaunchDaemons​

​裡的plist檔案,并加載他們。

當你輸入密碼,登入系統之後,launchd會掃描​

​/System/Library/LaunchAgents​

​​和​

​/Library/LaunchAgents、~/Library/LaunchAgents​

​裡的plist檔案,并加載。

這些plist檔案代表啟動任務,也叫​

​Job​

​,它裡面配置了啟動任務啟動形式的描述資訊。

優秀部落格

UIView動畫降幀探究[1] -- 來自公衆号:一瓜技術

llvm 編譯器進階用法:第三方庫插樁[2] -- 來自公衆号:搜狐技術産品

你不好奇 Linux 是如何收發網絡包的?[3] -- 來自公衆号:小林coding

App 啟動提速實踐和一些想法[4] -- 來自公衆号:starming

iOS Forensic Toolkit破解iPhone 5和5c密碼[5] -- 來自公衆号:iOS進階寶典

iOS 性能監控:Runloop 卡頓監控的坑[6]  -- 來自公衆号:老司機技術周報

漫畫:什麼是紅黑樹?[7]

iOS編譯速度如何穩定提高10倍以上之一[8]

我看技術人的成長路徑[9]

App Store App隐私保護問卷填寫指引[10] -- 來自友盟:最新資訊

學習資料

iOS面試資料總結

位址:http://note.youdao.com/s/SvA1l4Gy

推薦來源:pengwj

來自​

​歲寒啊​

​的整理,基本涵蓋iOS各個方面的知識點,熟練掌握在這内容,再也不怕iOS”八股文“了。

每個章節都會有展開内容,多為直接整理,少部分為連結内容。

iOS摸魚周報 第一期

SwiftUI官方教程

iOS摸魚周報 第一期

位址:https://developer.apple.com/tutorials/app-dev-training

蘋果官方制作的SwiftUI教程,使用最新的SwiftUI2.0文法,更新了用例,也帶來了更多典型功能介紹。教程共分為8個章節,包括文法介紹、頁面跳轉、資料傳遞、狀态管理、圖形繪制等核心知識點。如果你想學習SwiftUI,這絕對是最有用的教程。

Bash腳本教程

位址:https://wangdoc.com/bash/

iOS摸魚周報 第一期

阮一峰老師制作的Bash腳本教程,主要介紹Linux指令行Bash的基本用法和腳本程式設計。Bash腳本應該是少有的一個橫跨前端、後端及移動端,很多場景都有使用的語言工具。在移動端即使你沒有編寫Bash腳本的需求,也免不了會需要分析一些腳本的功能。

之前有段時間想系統學習Bash腳本,翻閱很多網站都沒有找到滿意的文檔資料,直到看到這份教程,快快學起來吧。

開發利器

較少好用的開發工具。

Vimac App - control macOS UI with the keyboard only

推薦來源:beatman423

下載下傳位址:https://vimacapp.com

軟體狀态:免費、開源

一款Mac上的鍵盤效率工具,通過用鍵盤代替滑鼠操作進而提高電腦使用效率,非常适合程式員使用。功能簡介:

  • 快捷鍵“Ctrl+Space”激活點選模式,輸入提示字母完成滑鼠單擊操作,按住“Shift”鍵輸入提示字母完成滑鼠右鍵單擊操作,按住“Command”鍵輸入提示字母完成滑鼠輕按兩下操作
  • 快捷鍵“Ctrl+S”激活滾動模式,使用HJKL+DU鍵進行滾動操作,按“TAB”鍵即可循環選擇滾動區域

Xnip - Mac上簡單好用的截圖工具

推薦來源:once-liu

下載下傳位址:https://zh.xnipapp.com/

軟體狀态:免費

為什麼有微信或QQ的預設截圖,還推薦這個?因為好用。相比于微信或QQ的截圖,還有幾個好用功能:

  • 滾動截圖
  • 貼圖
  • 可漂浮與桌面,多桌面切換時也會存在

    在一些需要局部資料對比時尤其好用。比如服務端的接口API,截圖漂浮後,可以友善的撸代碼。

Dozer -  Mac端的狀态欄管理工具

推薦來源:zhangferry

下載下傳位址:https://github.com/Mortennn/Dozer/releases

軟體狀态:免費、開源

當在Mac上開較多軟體時,會發現狀态欄總是滿滿當當,看着很不舒服,也降低我們需要選擇特定軟體的效率,而Dozer就是為解決這種問題而生的。Dozer可以将系統狀态欄按照兩個小點分為三部分,對于不想讓一直顯示的圖示,我們可以按住Command拖動圖示至第一個小圓點的左側,之後點選第二個小圓點就可以實作隐藏狀态欄的功能了。

之前我的狀态欄是這樣的:

iOS摸魚周報 第一期

整理之後就變成了這樣:

iOS摸魚周報 第一期

參考資料

[1]

UIView動畫降幀探究: https://mp.weixin.qq.com/s/QVvrgWpjY6mxAqjkrRapPw

[2]

llvm 編譯器進階用法:第三方庫插樁: https://mp.weixin.qq.com/s/RKg8f6B2jSNuFEImtMnq2Q

[3]

你不好奇 Linux 是如何收發網絡包的?: https://mp.weixin.qq.com/s/ISQ2qutpJjYOdtM3taeO_A

[4]

App 啟動提速實踐和一些想法: https://mp.weixin.qq.com/s/v2Ym9GPU4J8xCFFNYcpJhg

[5]

iOS Forensic Toolkit破解iPhone 5和5c密碼: https://mp.weixin.qq.com/s/rFkYFJnIbRf0N-7kBlbzXA

[6]

iOS 性能監控:Runloop 卡頓監控的坑: https://mp.weixin.qq.com/s/vMRQ0VuHLxpaY9oCNd5G8w

[7]

漫畫:什麼是紅黑樹?

[8]

iOS編譯速度如何穩定提高10倍以上之一

[9]

我看技術人的成長路徑