Xcode10更新的那些坑(持續更新)

Tioks0發表於2018-09-19

前言

趁著Xcode10更新,第一時間下載並準備開始踩坑。接下來直接列出筆者遇到的問題和解決過程。

1:適配iPhone X/XS/XR/XS Max

總的來說這個問題比較簡單,筆者直接放上一篇別人總結的文章,講的非常詳細。(連結:新機型適配) 文章最後有具體的程式碼,作者通過是否有safeAreaInsets的底部來判斷是否為X系列機型,比較巧妙。

2.The iOS Simulator deployment target is set to x.x, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'xxx')

更新了Xcode10以後,興高采烈的執行了專案。

Xcode10更新的那些坑(持續更新)
Excuse me?這是什麼鬼警告,作為一位強迫症患者,這一排排的⚠️真的看不下去,著手解決。

方法1:刪除Pods、 Podfile.lock、xcworkspace檔案,然後重新pod install.(不推薦)

這樣的解決方法確實解決了問題,但不是很優秀,先不說執行install會花費很多的時間,就是Xcode下次更新如果將最低版本提升到了9,那又要重新install,這樣就大大降低了開發者的效率。

方法2:在Podfile檔案中新增判斷(推薦)
post_install do |installer|
  installer.pods_project.targets.each do |target|
 target.build_configurations.each do |config|
  if config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f < 8.0
    config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '8.0'
   end
  end
 end
end
複製程式碼

將這個判斷新增到Podfile檔案的最後,然後執行pod install,再次執行專案,你會發現整個世界都清淨了。 上面對第三方庫進行了判斷若DEPLOYMENT_TARGET<8.0就會切換成8.0,可以說是一勞永逸,下次蘋果再去提高最低版本只需要修改版本號就可以了。

關於這個問題上筆者真要好好吐槽度娘了,搜尋出來的東西不夠精準,很多都是沒有一點關係的問題。最後沒辦法上了谷歌,一擊命中效率可以說是真的高。(貼上鍊接:github.com/CocoaPods/C…)。

大致看了下老外們的激烈討論,大概知道了些原因:

Xcode 9 --> deployment target 4.3

Xcode 10 --> deployment target 8.0

Xcode10的這次更新直接把deployment target提到了8.0,所以對於之前的一些第三方庫會出現這樣的問題。

3:error: Multiple commands produce

這個問題筆者遇到的錯誤主要是因為多個target導致的plist檔案重複。但這個錯誤不是所有開發者都是相同的,所以在這裡筆者的解決方法是通過修改Build System來解決。

Xcode->點選左上角file->Workspace Settings->Build System->選擇legacy Build System

解決方法

這樣解決方法只是在編譯的時候隱藏了錯誤,並沒有在根本上解決問題,所以開發者可以根據自己的實際報錯情況具體解決。如果暫時不影響開發,上面的解決方式也不失為一種好方法。

另外補充一個新的問題,Xcode10中新建檔案,在別的類中匯入時#import不提示。這個問題也是可以通過修改Build System設定來解決。

4:warning: Null passed to a callee that requires a non-null argument

警告⚠️

出現的原因是由於Xcode10以後,系統對新建類預設加上NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END這樣的一對巨集,但是我們對某些物件置nil而導致的。 知道了原因先來看下介這對巨集的作用:我們都知道Swift將物件分為optional(?)non-optional(!)的,但是OC卻沒有這一特性。為了解決Swift和OC混編時的物件問題,Xcode6.3時蘋果推出了這樣的一對巨集。這對巨集的主要作用是將在這兩個巨集之間的程式碼,所有簡單指標物件都會被假定為nonnull,因此我們只需要去指定那些nullable的指標。 因為所有物件都被假定為nonnull了,而這時將某一物件或引數置nil,所以編譯器會報此警告。

解決的方法也很簡單,我們只要在申明物件時對需要nil的物件或引數,加上nullable關鍵字即可。

從這個警告可以發現,蘋果一直想讓OC往Swift的方向發展相容,從Xcode6.3的提出,到Xcode10的預設新增都能看出。

總結

關於Xcode10更新後筆者也是暫時碰到了這些問題,可能不夠全面,後面遇到會持續補充。

相關文章