Xcode10和iOS12踩坑

寰宇發表於2018-06-05

原文同步釋出在devhy.com/2018/06/05/…

前言

熬夜看完了WWDC 2018,睡前電腦掛著下載Xcode10。手機裝好了iOS12,體驗了一番,感覺比iOS11快多了,看了一眼各家App和我司的App,鬆了一口氣,初步看來今年應該不需要做太多的適配工作,然後就睡了。(然而, 果然不能立flag!?)

早上晚到了一些,Xcode10解壓了一下,開始初步評估一下適配。emmmm,工程跑不起來了...好了果然不能低估,開幹。

問題與解決

重複檔案報錯

一上來就是build沒2秒就報錯了,看報錯的說法是有重複的info.plist。

xcode10_ios12_01

我們元件化後把一些三方庫和封裝方法打成了一個私有庫。進去看了一下,我們使用了阿里雲統計 + 推送 + Alipay,裡面確實有好幾個info.plist,刪除了就好了。

xcode10_ios12_02

補充

臨時解決方案也可以參考 掘金@來來來小牛仔 在評論中提到的:

參考Stack Overflow中Xcode 10 Error: Multiple commands produce,修改Xcode編譯配置Xcode->File->Project Settings/Workspace Setting-> Build System -> Legacy Build System.

這裡定義為臨時解決方案的原因是:使用了Xcode10編譯的新特性而丟擲錯誤,既然是編譯器的特性,那麼最好還是接受它的報錯去修復。作為短暫的過渡使用老的編譯方式是可以的,長期我個人覺得是不合適的。

c++.6.0.9消失了?

報錯:library not found for -lstdc++.6.0.9

xcode10_ios12_03

第一反應是去Build Phases裡的Link Binary With Libraries進行新增,然後發現選擇frameworks and libraries裡已經沒有了這個庫了?,又回去看了一下Xcode9裡是有的。

xcode10_ios12_04

但是因為之前在Xcode9上是正常跑的專案,而且我們元件化後,依賴是在私有庫的podspec裡定義的,全域性搜了下所有的podspec並沒有依賴過這個lib。

想起來pod isntall後會有一個Pods-xxxx.xcconfig檔案,果然找到了這個-l stdc++.6.0.9,但是這邊是彙總了所有的依賴,無法找到源頭。

xcode10_ios12_05

那如果直接在這裡刪掉這個依賴呢?是不是會爆出更清晰的錯? 答案是就如下圖,因為刪掉了這個依賴,那依賴這個lib的原始碼就出現了一些呼叫方法的報錯,如下圖,很明顯的發現了這個叫libQYSDK.a的庫。恩,就是三方庫七魚客服了?,趕緊聯絡了一波工具提供方。

xcode10_ios12_06

補充

臨時方案可以參考:掘金@End 在評論區提到

將Xcode9的libstdc++6.0.9.tbd拷貝到Xcode10中使用。

感謝 掘金@vvveiii 提醒,之前在文件裡沒有查到相關資訊,剛剛再去開發者論壇中看到Where is libstdc++.6.dylib in xcode10 beta 以及 libstdc++ is not supported by the tvOS platform? 中 staff的迴應是請遷移到libc++庫。

所以Xcode10libstdc++相關的3個庫(libstdc++libstdc++.6libstdc++6.0.9)應該都是被徹底廢棄了,如果你使用的三方庫中有依賴,請儘快和提供方溝通,告知他們遷移吧。如果自己開發使用,也儘快考慮遷移的事宜吧。

Copy Pods Resources失效

經過上面一波操作後,終於編譯通過了,也跑起來,就在以為一切都正常起來的時候,突然 崩!潰!了!

一看報錯原因,是Profile.StoryBoard沒有找到,我們做了元件化後很多資原始檔是在各自的pod裡的,理論上這個sb應該在執行Copy Pods Resources後被copy到在*.app的包裡

xcode10_ios12_07

於是去檢視了一下編譯後生成的Product,所有元件庫的資原始檔 都!不!在!

懷疑是這個指令沒有執行,然後clear重新編譯,盯著編譯過程。果然,只執行了Check Pods Manifest.lockEmbed Pods Frameworks

xcode10_ios12_08

看了下CocoaPods的issues裡沒有人提到這些,估計新版是好的,趕緊裝了CocoaPods-1.5.3再把Pods資料夾刪了重新install一下,就好了。

補充

確實是需要升級CocoaPods版本>=1.4.0以上,可見Github上的一個issues Xcode10 beta can't load bundles from CocoaPods


至此我們的工程已經能正常通過Xcode 10編譯,並執行在iOS 12 beta的手機上了。

粗略對一些業務場景進行了使用,沒有發現明顯需要進行處理的問題?

後續如果有發現有意義的問題會繼續更新~