前言
趁著Xcode10更新漫雕,第一時(shí)間下載并準(zhǔn)備開始踩坑滨嘱。接下來直接列出筆者遇到的問題和解決過程。
1:適配iPhone X/XS/XR/XS Max
總的來說這個(gè)問題比較簡單浸间,筆者直接放上一篇別人總結(jié)的文章太雨,講的非常詳細(xì)。(鏈接:新機(jī)型適配)
文章最后有具體的代碼魁蒜,作者通過是否有safeAreaInsets的底部來判斷是否為X系列機(jī)型囊扳,比較巧妙。
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以后兜看,興高采烈的運(yùn)行了項(xiàng)目锥咸。
Excuse me?這是什么鬼警告,作為一位強(qiáng)迫癥患者铣减,這一排排的??真的看不下去她君,著手解決。
方法1:刪除Pods葫哗、 Podfile.lock缔刹、xcworkspace文件球涛,然后重新pod install.(不推薦)
這樣的解決方法確實(shí)解決了問題,但不是很優(yōu)秀校镐,先不說執(zhí)行install會花費(fèi)很多的時(shí)間亿扁,就是Xcode下次更新如果將最低版本提升到了9,那又要重新install鸟廓,這樣就大大降低了開發(fā)者的效率从祝。
方法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
將這個(gè)判斷添加到Podfile
文件的最后,然后執(zhí)行pod install引谜,再次運(yùn)行項(xiàng)目牍陌,你會發(fā)現(xiàn)整個(gè)世界都清凈了。
上面對第三方庫進(jìn)行了判斷若DEPLOYMENT_TARGET<8.0就會切換成8.0员咽,可以說是一勞永逸毒涧,下次蘋果再去提高最低版本只需要修改版本號就可以了。
關(guān)于這個(gè)問題上筆者真要好好吐槽度娘了贝室,搜索出來的東西不夠精準(zhǔn)契讲,很多都是沒有一點(diǎn)關(guān)系的問題。最后沒辦法上了谷歌滑频,一擊命中效率可以說是真的高捡偏。(貼上鏈接:https://github.com/CocoaPods/CocoaPods/issues/8069)。
大致看了下老外們的激烈討論峡迷,大概知道了些原因:
Xcode 9 --> deployment target 4.3
Xcode 10 --> deployment target 8.0
Xcode10的這次更新直接把deployment target
提到了8.0银伟,所以對于之前的一些第三方庫會出現(xiàn)這樣的問題。
3:error: Multiple commands produce
這個(gè)問題筆者遇到的錯誤主要是因?yàn)槎鄠€(gè)target導(dǎo)致的plist文件重復(fù)凉当。但這個(gè)錯誤不是所有開發(fā)者都是相同的枣申,所以在這里筆者的解決方法是通過修改Build System來解決。
Xcode->點(diǎn)擊左上角file->Workspace Settings->Build System->選擇legacy Build System
這樣解決方法只是在編譯的時(shí)候隱藏了錯誤看杭,并沒有在根本上解決問題,所以開發(fā)者可以根據(jù)自己的實(shí)際報(bào)錯情況具體解決挟伙。如果暫時(shí)不影響開發(fā)楼雹,上面的解決方式也不失為一種好方法。
另外補(bǔ)充一個(gè)新的問題尖阔,Xcode10中新建文件贮缅,在別的類中導(dǎo)入時(shí)
#import
不提示。這個(gè)問題也是可以通過修改Build System設(shè)置來解決介却。
4:warning: Null passed to a callee that requires a non-null argument
出現(xiàn)的原因是由于Xcode10以后谴供,系統(tǒng)對新建類默認(rèn)加上NS_ASSUME_NONNULL_BEGIN
和NS_ASSUME_NONNULL_END
這樣的一對宏,但是我們對某些對象置nil而導(dǎo)致的齿坷。
知道了原因先來看下介這對宏的作用:我們都知道Swift將對象分為optional(?)
和non-optional(!)
的桂肌,但是OC卻沒有這一特性数焊。為了解決Swift和OC混編時(shí)的對象問題,Xcode6.3時(shí)蘋果推出了這樣的一對宏崎场。這對宏的主要作用是將在這兩個(gè)宏之間的代碼佩耳,所有簡單指針對象都會被假定為nonnull
,因此我們只需要去指定那些nullable
的指針谭跨。
因?yàn)樗袑ο蠖急患俣?code>nonnull了干厚,而這時(shí)將某一對象或參數(shù)置nil
,所以編譯器會報(bào)此警告螃宙。
解決的方法也很簡單蛮瞄,我們只要在申明對象時(shí)對需要nil
的對象或參數(shù),加上nullable
關(guān)鍵字即可谆扎。
從這個(gè)警告可以發(fā)現(xiàn)挂捅,蘋果一直想讓OC往Swift的方向發(fā)展兼容,從Xcode6.3的提出燕酷,到Xcode10的默認(rèn)添加都能看出籍凝。
總結(jié)
關(guān)于Xcode10更新后筆者也是暫時(shí)碰到了這些問題,可能不夠全面苗缩,后面遇到會持續(xù)補(bǔ)充饵蒂。