使用 @available 導致舊版本 Xcode 編譯出錯。
在 Xcode 11 的 SDK 工程的代碼里面使用了 @available 判斷當前系統版本,打出來的靜態庫放在低版本 Xcode 中編譯,會出現一下錯誤:
Undefine symbols for architecture i386:
"__isPlatformVersionAtLeast", referenced from:
...
ld: symbol(s) not found for architecture i386
從錯誤信息來看,是 __isPlatformVersionAtLeast 方法沒有具體的實現,但是工程里根本沒有這個方法。實際測試無論在哪里使用@available ,并使用 Xcode 11 打包成動態庫或靜態庫,把打包的庫添加到 Xcode 10 中編譯都會出現這個錯誤,因此可以判斷是 iOS 13 的 @available 的實現中使用了新的 api。
- 解決方案
如果你的 SDK 需要適配舊版本的 Xcode,那么需要避開此方法,通過獲取系統版本來進行判斷:
if ([UIDevice currentDevice].systemVersion.floatValue >= 13.0) {
...
}
坑的一批