【问题标题】:Find the Deployment Target at runtime of a framework that I can't recompile在我无法重新编译的框架的运行时找到部署目标
【发布时间】:2014-10-08 09:51:41
【问题描述】:

在编译时使用宏 __IPHONE_OS_VERSION_MIN_REQUIRED 确定应用的部署目标非常简单。查找应用程序在运行时运行的当前 iOS 版本也很简单。我试图在运行时找出应用程序的部署目标。我需要在已经编译的框架中使用它。是否有公共 API 方法来确定这一点?我找不到。

只是为了清楚。我希望在运行时从我的框架中获取 iOS 应用程序的部署目标。不是编译时间。在我的框架中,我需要提醒框架的用户,如果他们的部署目标太远,某些功能将无法工作。

我在编译时很容易做到这一点,但我的框架已经编译,我不想要求框架的用户在他们的代码中添加宏,以便我的框架确定他们的部署目标。

【问题讨论】:

  • 如果您解释了为什么需要在运行时了解部署目标,这可能会有所帮助。这很不寻常。这样做的目的是什么?
  • 还有LSMinimumSystemVersion,但是可以手动改成与部署目标不匹配。
  • Josh,抱歉,我没有指定我希望在 iOS 中执行此操作。这在 iOS 中是私有的。
  • 为什么不在公共头文件中包含编译时逻辑并通过编译时警告警告它们?更好的是,关于使用特定功能的编译时警告,也许是通过可用性属性?
  • 不知道这是否对 iOS 有帮助,但在 OS X 上,此信息可在 LC_VERSION_MIN_MACOSXMach-O 加载器命令中获得,该命令可通过使用 @987654324 访问的 Mach-O 标头访问@。您将使用 /usr/include/mach-o/loader.h 中定义的 Mach-O 结构来解析加载命令。

标签: objective-c runtime deployment-target


【解决方案1】:

这是一个老问题,但我刚刚验证了答案,所以这里是:

在 iOS 上,您应该使用 Info.plist 中的 MinimumOSVersion 键来查找运行时支持的最低版本。

来源其实是linked from the documentation那个Josh Caswell posted,大约是LSMinimumSystemVersion

请注意,文档解释说,作为开发人员,您不应自己设置 MinimumOSVersion 值,并且 Xcode 在构建期间会自动为您填充。这解释了本文档另一部分中的rather cryptic "Do Not Use"

在此处发布此密钥的描述,以供后人使用(2016 年 12 月),以防文档更改:

MinimumOSVersion(字符串 - iOS)。当您构建 iOS 应用程序时,Xcode 使用项目的 iOS 部署目标设置来设置 MinimumOSVersion 键的值。不要在 Info.plist 文件中自己指定这个键;它是系统编写的密钥。当您将应用发布到 App Store 时,应用商店会根据此密钥指示您的应用可以在哪些 iOS 版本上运行。相当于 macOS 中的 LSMinimumSystemVersion 键。

我通过在测试应用中打印出值来验证这一点(并将 Xcode 项目的部署目标更改为不同的值:

if let infoPlist = Bundle.main.infoDictionary {
  let minimumVersion = infoPlist["MinimumOSVersion"]
  if let minimumVersion = minimumVersion {
    print("Minimum version is \(minimumVersion)")
  }
}

【讨论】:

    【解决方案2】:

    我不明白为什么这段代码不适合你!

    NSLog(@"Deployment target: %i", __IPHONE_OS_VERSION_MIN_REQUIRED);
    

    【讨论】:

    • 这不是答案。这是一条评论。
    • 我不同意 - 措辞有点尴尬,但他确实提出了解决问题的潜在方法(顺便说一句,我不知道这是否是一个好的或可行的解决方案)。
    • @JeenBroekstra 这如何回答这个问题?他们所做的只是NSLogging __IPHONE_OS_VERSION_MIN_REQUIRED 所以这一切要做的就是登录到控制台。 NSLogging 根本不会向 OP 提供它们的本质。因此,这是一个非常糟糕的答案,值得一票否决或者是评论,我想说评论,因为这样其他人会阅读它并且他们不会再对评论投反对票,而如果答案不好,它将得到更多投反对票,没有人会看两次。
    • @Popeye 很公平 - 我最初将这个问题读作“在运行时查看部署目标的某种方式”,对此,登录到控制台似乎已经足够了。但在重新阅读后,我发现这并不是 OP 所要求的。
    猜你喜欢
    • 2021-11-02
    • 2019-01-17
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多