本文介紹了支持xcode10和適配iphone xs max、iphone xr的方法,分享給大家,具體如下,
目前我們項目已做了xcode10(swift4.0)和新機型的適配,總結一下遇到的問題和修改的內容,希望幫助到其他人,如果您有不同的看法或遺漏,歡迎指出!
1.第三方庫編譯報錯
如果項目里用到了mixpanel-swift和swiftlint,這兩個在xcode10上會報錯,目前作者已提交新版本分別是2.4.5和0.27.0,更新后即可解決報錯。
2.library not found for - lstdc++.6.0.9
pod工程編譯通過后會進行主工程的編譯,如果依賴了libstdc++.tbd和libstdc++.6.0.9.tbd,就會報這個error,原因是蘋果在xcode10和ios12中移除了libstdc++這個庫,由libc++這個庫取而代之,蘋果的解釋是libstdc++已經標記為廢棄有5年了,建議大家使用經過了llvm優化過并且全面支持c++11的libc++庫。
臨時的解決方法就是把libstdc++.6.0.9.tbd這個文件導入到xcode10中,分別放到以下目錄 /applications/xcode.app/contents/developer/platforms/iphoneos.platform/developer/sdks/iphoneos.sdk/usr/lib/ 和 /applications/xcode.app/contents/developer/platforms/iphonesimulator.platform/developer/sdks/iphonesimulator.sdk/usr/lib/ 這時編譯可以通過。
但這只是臨時的解決方案,如果你自己的業務模塊使用了libstdc++,那么就把模塊代碼重新調整為依賴libc++,然后重新檢查是否存在問題,重新編譯。如果你引用的第三方廠商提供的sdk中依賴了libstdc++,那么抓緊聯系廠商,要求版本升級。
3.enum case '...' not found in type '...'
解決好上面兩個報錯,編譯程序時還會顯示這個error,具體場景如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
posvisitquestiontype: string { case text case textarea = "text_area" case dropdownlist = "drop_down_list" case radiobutton = "radio_button" } let type: posvisitquestiontype! ... switch type { case .text, .textarea: errortext = nslocalizedstring( "please enter the following options" , comment: "" ) case .dropdownlist, .radiobutton: errortext = nslocalizedstring( "click the right button to get current location" , comment: "" ) default : break } |
xcode10建議每個case 情況下加“?”
原因可能是 type是可選的,所以每個case情況要與type類型保持一致,所以提示加 “?”,可能是xcode10編譯器更新的原因。
修改的方法是如果確定type會被賦值,那在定義的時候就把“!”去掉,如果不確定type是否有值就按照xcode提示修改。
4.適配iphone xs max、iphone xr
我們項目在獲取機型等信息用的是devicekit這個第三方庫,所以也需要更新一下才能獲取到新機型的信息,最新版是1.8.1。在最新版有這樣一個變量
1
2
3
4
|
/// all face id capable devices static public var allfaceidcapabledevices: [device] { return [.iphonex, .iphonexs, .iphonexsmax, .iphonexr] } |
由于iphone x、iphone xs、iphone xs max、iphone xr這些機型的navigationbar高度以及tabbar高度都一致,所以可以用allfaceidcapabledevices是否包含當前設備,來判斷當前設備是否有“齊劉海”。
示例:
1
2
3
4
5
6
7
8
9
|
static let faceiddevicearray = device.allfaceidcapabledevices static let navigationheight: cgfloat = { if faceiddevicearray.contains(currentdevice) { return faceiddevicenavheight } else { return ordinarydevicenavheight } }() |
同時devicekit中也提供這樣一個方法,運行模擬器的時候調用,也會返回真實的設備名稱
1
2
3
4
5
6
7
8
|
/// get the real device from a device. if the device is a an iphone8plus simulator this function returns .iphone8plus (the real device). /// if the parameter is a real device, this function returns just that passed parameter. /// /// - parameter device: a device. /// /// - returns: the underlying device if the `device` is a `simulator`, /// otherwise return the `device`. public static func realdevice(from device: devicekit.device) -> devicekit.device |
示例:
1
2
3
4
|
static let currentdevice = device.realdevice(from: device()) if currentdevice == .iphonex {} // 取代以下寫法 if device() == .iphonex || device() == .simulator(.iphonex) {} |
最后別忘了再切兩張啟動圖,因為iphone xs和尺寸和iphone x是一樣的,所以iphone xs可以忽略
iphone xr:828px x 1792px
iphone xs max: 1242px x 2688px
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://www.jianshu.com/p/24920e577e07