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

时间:2019-07-05 20:33:21

标签: ios swift macos xcode11

我在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),以便检查输出是否相似。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

在构建设置中徘徊时,我发现跨平台项目具有SUPPORTED_PLATFORMS = iOS,因此我可能无法找到解决问题的方法。 这表明它在某种程度上有不同的解释。