如何确定跨平台项目中的架构类型?

How to determine architecture type in cross-platform project?

我在 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。

我只是不明白为什么上面建议的代码不起作用。我目前正在准备 space 安装 beta 3(128gb 存储 ftw)以检查输出是否相似。

在构建设置中徘徊时,我发现 cross-platform 项目有 SUPPORTED_PLATFORMS = iOS,因此我可能无法找到解决问题的方法。 这表明它以某种方式被不同地解释。

你提到使用 #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
}

更新:

我还没有机会使用新的交叉编译功能,但我猜你正在为 Mac 和 iOS 编译一次代码。

由于代码只编译一次,预处理器命令也只运行一次。这使得它总是默认为 iOS 或 Mac 并省略另一个的代码。在你的情况下它似乎是 iOS.

我建议删除预处理器检查并改为运行时检查。肯定有更清洁的方法,但大致如下:

let isMac = NSClassFromString("NSView") != nil