前言
趁著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以後,興高采烈的執行了專案。
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_BEGIN
和NS_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更新後筆者也是暫時碰到了這些問題,可能不夠全面,後面遇到會持續補充。