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

Posted

技术标签:

【中文标题】如何确定跨平台项目的架构类型?【英文标题】:How to determine architecture type in cross-platform project? 【发布时间】:2019-07-05 20:33:21 【问题描述】:

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

【问题讨论】:

如果在条件句之前声明platform然后在条件句中设置值会有什么不同吗? @Chris 这没什么区别。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何确定跨平台项目的架构类型?的主要内容,如果未能解决你的问题,请参考以下文章

跨平台项目架构

如何确定 kotlin-multiplatform 项目中的构建类型

如何确定机器上的硬件(CPU 和 RAM)?

微服务架构下持续交付平台如何建设?管理500+项目Spock平台案例参考

综述:轻量级CNN架构设计

大数据平台粗略架构和数仓设计步骤