除了能在AppStore下到或者可以輕易獲取的工具,我的iOS開發(fā)環(huán)境還需要以下環(huán)境支持:
homebrew
cocoapods
fastlane
xcode的arm64模擬器
homebrew
原始的寫法因為無法訪問raw.githubusercontent.com桦他,可能導(dǎo)致安裝卡住或者失敗果港。
經(jīng)過一番踩坑芒炼,最終找到了這個網(wǎng)站:
使用以下命令分別安裝arm版和x86版的homebrew:
/bin/bash -c"$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh)"復(fù)制代碼
arch -x86_64 /bin/bash -c"$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh)"復(fù)制代碼
arm版會被安裝到/opt/homebrew/bin/brew目錄,x86版會被安裝到/usr/local/bin/brew目錄拟烫。
安裝成功后,會有提示需要手動執(zhí)行一段腳本:
echo'eval "$(/opt/homebrew/bin/brew shellenv)"'>> ~/.zprofileeval"$(/opt/homebrew/bin/brew shellenv)"復(fù)制代碼
可以手動編輯用戶根目錄下的.zprofile文件,確保含有如下內(nèi)容:
eval"$(/opt/homebrew/bin/brew shellenv)"exportHOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles/bottlesaliasabrew='arch -arm64 /opt/homebrew/bin/brew'aliasibrew='arch -x86_64 /usr/local/bin/brew'復(fù)制代碼
保存后再執(zhí)行source ~/.zprofile刷新配置货徙。
此時,輸入brew -v皮胡、ibrew -v痴颊、abrew -v可以看到如下信息:
mirari@MBA ~ % brew -vHomebrew 3.2.4Homebrew/homebrew-core (git revision 64a2874e87; last commit 2021-07-27)Homebrew/homebrew-cask (git revision 9d5abe6a67; last commit 2021-07-27)mirari@MBA ~ % ibrew -vHomebrew 3.2.5Homebrew/homebrew-core (git revision 507807b9dc; last commit 2021-07-27)mirari@MBA ~ % abrew -vHomebrew 3.2.4Homebrew/homebrew-core (git revision 64a2874e87; last commit 2021-07-27)Homebrew/homebrew-cask (git revision 9d5abe6a67; last commit 2021-07-27)復(fù)制代碼
說明安裝正常。
之前可能因為網(wǎng)絡(luò)等原因屡贺,我的homebrew雖然安裝成功了蠢棱,但安裝大多數(shù)工具锌杀,比如bob和fastlane,都會提示找不到叫這個名字的工具裳扯。
錯誤信息為Could not resolve HEAD to a revision抛丽。
使用brew -v可以看到,homebrew-core沒有HEAD饰豺。
執(zhí)行以下命令可以修復(fù):
git -C $(brew --repository homebrew/core) reset --hard HEAD.復(fù)制代碼
但是為了穩(wěn)妥起見,我還是rm -rf了兩個brew的目錄重新安裝了一遍允蜈。
fastlane
homebrew安裝成功后冤吨,直接運(yùn)行brew install fastlane即可安裝成功。
cocoapods
之前有段文字提示brew上的cocoapods已經(jīng)停止更新饶套,需要改用gem安裝漩蟆,現(xiàn)在去看已經(jīng)沒有了,brew上直接運(yùn)行brew install cocoapods即可妓蛮。
M1芯片的arm64模擬器
這是最坑的部分怠李。
新鮮出爐的M1環(huán)境xcode在運(yùn)行以前的老項目時,遇到了一堆問題蛤克,比如這樣的錯誤信息:
building for iOS Simulator-x86_64 but attempting to link with file built for iOS Simulator-arm64復(fù)制代碼
或者提示找不到對應(yīng)的Framework捺癞,或者提示在當(dāng)前arch下當(dāng)前的Symbol無法識別。
解決方案1:
在訪達(dá)的應(yīng)用程序列表中构挤,找到xcode髓介,右鍵選擇顯示簡介,然后勾選“使用Rosetta打開”筋现。
簡單粗暴無腦唐础。這樣啟動的xcode,模擬器就是x86的了矾飞,完美適配x86環(huán)境一膨。包括那些沒有在xcframework的模擬器里編譯arm64的依賴都可以正常運(yùn)行。
但是xcode的執(zhí)行效率會受影響洒沦,我不能接受豹绪。
順帶一提,直接從官網(wǎng)下載的Mac版IntelliJ IDEA就是x86版的微谓,在M1環(huán)境下運(yùn)行卡頓很嚴(yán)重森篷,用了一天整個人都難受了,插件Power Mode II的打字特效掉幀嚴(yán)重豺型,不得不關(guān)閉仲智。需要在官網(wǎng)下載前,點擊下載按鈕右側(cè)切換到arm版姻氨,從此絲般順滑钓辆。
我自己制作的xcframework包在模擬器環(huán)境同時包含了x86_64和arm64(谷歌就是這樣),要是M1芯片還跑x86,不是媚眼拋給瞎子看前联?
但是要讓項目在arm64下跑起來功戚,配置也不容易,經(jīng)過一番嘗試似嗤,解決方案大致如下:
解決方案2:
這里涉及3個編譯目標(biāo)啸臀,分別是:
pod依賴的第三方庫Target,包括源碼和Framework
本地用于編譯Framework的自有庫源碼Target
調(diào)用以上依賴并運(yùn)行在模擬器或真機(jī)上的應(yīng)用Target
運(yùn)行在模擬器或真機(jī)上的應(yīng)用Target
首先確保用于調(diào)用Framework和運(yùn)行模擬器的應(yīng)用項目Target本身的Build Settings配置如下:
Architectures為默認(rèn)值$(ARCHS_STANDARD)
在M1芯片下烁落,模擬器的默認(rèn)值應(yīng)該是arm64,?armv7
Build Active Architecture Only的Debug為Yes(前提是模擬器用Debug方式運(yùn)行)
這一步的作用是讓模擬器編譯目標(biāo)時只編譯arm64的代碼乘粒,不要嘗試x86等arch的編譯。因為它依賴的pod和自有庫的arch會被指定為只有一個arm64伤塌,如果嘗試其他arch編譯就會報錯灯萍。
刪除Excluded Architectures
這一步的作用是讓pod來管理此項參數(shù),不要手動設(shè)置值每聪。手動設(shè)置這項值時旦棉,pod安裝會有一段警告提示。
[!] The `Demo [Debug]` target overrides the `EXCLUDED_ARCHS[sdk=iphonesimulator*]` build setting defined in `../Pods/Target Support Files/Pods-Demo/Pods-Demo.debug.xcconfig'. This can lead to problems with the CocoaPods installation? ? - Use the `$(inherited)` flag, or? ? - Remove the build settings from the target.復(fù)制代碼
刪除Valid Architectures
xcode12的新項目應(yīng)該默認(rèn)移除了此項參數(shù)药薯。新版xcode不再需要用這個參數(shù)來指定archs绑洛。
pod依賴的第三方庫Target
在podfile中添加鉤子
post_installdo|installer|installer.pods_project.targets.eachdo|target|target.build_configurations.eachdo|config|config.build_settings['ONLY_ACTIVE_ARCH']='NO'endendend復(fù)制代碼
因為手動在xcode里修改pod的project是沒用的,pod install一執(zhí)行果善,一切修改都會還原诊笤。因此需要用鉤子來處理pod安裝的配置項。
這一步的作用是讓pod在編譯時編譯所有archs巾陕,也就是包括了x86和arm64.
之所以要這樣做讨跟,是因為模擬器環(huán)境的pod安裝時仍然會把開源的依賴以x86形式編譯(我推測),也就導(dǎo)致了上面那個building for iOS Simulator-x86_64 but attempting to link with file built for iOS Simulator-arm64錯誤鄙煤。因此我們用這段語句讓pod強(qiáng)制編譯所有arch晾匠。
本地用于編譯Framework的自有庫源碼Target
其余配置參考上面的應(yīng)用Target,但是Build Active Architecture Only這一項需要改為NO梯刚,也就是手動操作了上面pod的那段配置凉馆。
最后,記得刪除pods目錄亡资,刪除項目緩存澜共,然后再執(zhí)行編譯。
解決方案3
其他操作都類似方案2锥腻,但是將pod和自有庫的那個Build Active Architecture Only配置項嗦董,改為操作Excluded Architectures。具體操作為:
pod依賴的第三方庫Target
在podfile中添加鉤子
post_installdo|installer|installer.pods_project.build_configurations.eachdo|config|config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"]="arm64"endend復(fù)制代碼
本地用于編譯Framework的自有庫源碼Target
Debug下的Build Active Architecture Only保持YES瘦黑,但是Excluded Architectures設(shè)置為arm64京革。
這一步的作用是讓Pod依賴和自有庫模擬器編譯時奇唤,排除arm64。
出處:stackoverflow.com/a/63955114/…
按理說這樣arm64的模擬器運(yùn)行時應(yīng)該會報錯匹摇,但是實際上確實可以執(zhí)行咬扇,我也不知道為什么了╮(╯▽╰)╭
不過雖然應(yīng)用本身能正常運(yùn)行,但自有庫還需要在打包時包含所有的archs廊勃。之前在pod里面過濾了arm64懈贺,如果自有庫依賴了pod中的有源碼的開源庫,就會導(dǎo)致編譯打包時丟失arm64的arch坡垫,從而報錯隅居。因此如果項目本身是單純的應(yīng)用,使用方案3排除arm64會更節(jié)省資源葛虐,編譯更快速。如果是工具庫棉钧,就得使用方案2屿脐,編譯所有archs。
歡迎大家加入QQ群一起交流學(xué)習(xí):
464406500