【问题标题】: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 这没什么区别。

标签: ios swift macos xcode11


【解决方案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,因此我可能无法找到解决问题的方法。 这表明它的解释方式有所不同。

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 2014-04-19
      • 2011-11-08
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      相关资源
      最近更新 更多