i在Xcode 11 Beta 2中创建了项目,并带有新引入的跨平台功能,该功能均针对iOS和MACOS。我有麻烦,确定该应用是在一个平台上还是另一个平台运行的。
假设我添加了枚举,这有助于识别平台
enum Platform {
case iOS
case macOS
case unknown
}
现在,如果我尝试以下代码,无论我运行什么环境,我总是会获得平台是iOS。
#if canImport(UIKit)
let platform: Platform = .iOS
#elseif canImport(AppKit)
let platform: Platform = .macOS
#else
let platform: Platform = .unknown
#endif
我也尝试了不同的惯例 #if os(iOS) || os(watchOS) || os(tvOS)
,但是由于我使用的swift版本是5.0,所以无关紧要。
我想到的唯一解决方案是根据我使用的体系结构在构建设置中添加不同的好的,我只是尝试将其设置为OTHER_SWIFT_FLAGS
。OTHER_SWIFT_FLAGS[sdk=macosx*] = "-D" "MACOS"
,并且仍然像iOS一样对待。
我只是不明白为什么上面提出的代码不起作用。我目前正在准备更多的空间安装Beta 3(128GB存储ftw(,以检查输出是否相似。
您使用#if os(iOS)
提到,但不要谈论使用macOS
标志。您是否尝试过这样的解决方案?
enum Platform {
case iOS
case macOS
case unknown
}
var compiledPlatform: Platform {
#if os(iOS)
return .iOS
#elseif os(macOS)
return .macOS
#else
return .unknown
#endif
}
更新:
我没有机会玩新的Cross编译功能,但我的猜测是,您正在为Mac和iOS进行一次编译一次。
由于代码仅编译一次,因此预处理器命令也仅运行一次。这使得它始终默认为iOS或MAC,并省略对方的代码。在您的情况下,似乎是iOS。
我建议删除预处理器检查并将其作为运行时检查。肯定有更干净的方法,但沿此目的有些简洁:
let isMac = NSClassFromString("NSView") != nil
在通过构建设置中徘徊时,我发现跨平台项目具有SUPPORTED_PLATFORMS = iOS
,因此我可能无法找到解决问题的解决方案。这表明它以某种方式解释了。