【问题标题】:How does an app with lower base sdk work?具有较低基础 sdk 的应用程序如何工作?
【发布时间】:2013-09-20 15:24:26
【问题描述】:

在 XCode 中,我可以指定 Base SDK。我想知道这在幕后是如何工作的?例如,如果我在具有 iOS 7 的设备上运行一个应用程序,而我的基础 SDK 是 iOS 6,那么该应用程序为什么具有旧的“外观和感觉”? XCode 是否编译旧版 SDK 并将其包含在我的应用程序中,还是新版 iOS 附带旧版库/SDK?

换句话说,运行时是否知道这个应用程序是用较低的基础 SDK 编译的,并且它知道在 UIKit 的代码中的某个地方:

if (lower SDK) {
  //show old look/feel
} else {
  //show new look/feel
}

或者应用程序本身是否包含旧库并加载它?

谢谢

【问题讨论】:

  • 所以,您基本上是在问“这是如何设计的?”和“为什么要这样设计?”。第一个问题我不确定,但对于第二个问题,苹果公司只有少数开发人员可以回答。

标签: ios objective-c cocoa-touch


【解决方案1】:

iOS 应用程序与新版本的 iOS 向前兼容。原因是:

几乎所有对 iOS 版本的更改都是附加的,因此 使用较低版本构建的应用程序仍可在较高版本的 iOS 上运行 版本。

不过,我们需要注意这一点:

随着框架在不同版本中的发展,API 被引入或 已弃用,现有 API 的行为可能偶尔会发生变化。 Apple 尽一切努力将可能导致的更改降至最低 不兼容,在某些情况下提供基于替代行为 在框架版本上。在极少数情况下,您的代码需要确定 框架版本并进行相应调整

要了解更多,请阅读this

【讨论】:

  • 链接中的另一个相关引用:“作为一种向后兼容机制,Apple 框架有时会检查构建应用程序的 SDK 版本,如果它是较旧的 SDK,请修改兼容性的行为。这是在 Apple 预测或发现兼容性问题的情况下完成的。”
【解决方案2】:

Apple 从不更改 / 删除 / 重命名类或方法。他们只添加新的。
如果他们不想让您再使用它,他们会将其标记为deprecated

这是非常重要的一点。
在编译时,编译器会检查所有类和方法签名是否在您构建应用程序的 SDK 中可用。

如果是这种情况,您可以构建和部署您的应用。因为这些类和方法永远不会从较新版本的框架中删除,所以您的应用可以正常运行。


另一方面,您可以构建应用并将其部署到实际上不支持当前 SDK 的系统。例如,您可以使用 Autolayout(NSLayoutConstraint 类自 10.7 起可用)并将其部署到 Mac OS X 10.6。编译器不会说一个字。

该应用会在 10.7 之前的系统上崩溃。

【讨论】:

    【解决方案3】:

    您应该将您的目标设置为 ios 5.0(通过您的项目目标设置),以确保不使用任何 ios6 方法(否则编译错误会阻止您构建它)。

    为了支持新功能并检查 ios6 在设备上是否可用,您有两种方法:

    在编译期间(因此您仍然可以同时构建具有较低目标和更新目标的应用)使用以下宏

    #if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_6_0
     // Your ios6 code goes here
    #endif
    2: During runtime : [[[UIDevice currentDevice] systemVersion] floatValue] > 6.0
    

    【讨论】:

    • 这些都不能回答问题。
    【解决方案4】:

    您的项目是根据当前 SDK 构建的。如果您有一个较旧的部署目标,那么您的代码库将针对该目标进行编译。因此,如果您针对 7.0 构建,但有 6.0 部署目标,则不会触发 iOS 7 特定的弃用。一切都将针对最旧的指定部署目标进行编译。

    然而,这会给作为开发人员的您带来压力,以确保您没有使用 iOS 7 特定代码。编译器仍将假定您的意思是允许新用户也运行您的应用程序,并且您和您的最新版本用户都可以使用所有最新方法。您可以使用较旧的设备或模拟器针对较旧的 SDK 测试您的代码库,以确保其运行良好,或者使用像 Deploymate 这样的应用程序来测试您正在使用的可能会导致问题的方法。

    如果您打算使用任何最新的方法,则需要将它们包装在编译器中的 if 语句(如 Peter Fidemraizer 回答)或在 Foundation 框架中检查版本的普通 if 语句中。

    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
       // Load resources for iOS 6.1 or earlier
    } else {
       // Load resources for iOS 7 or later
    }
    

    【讨论】:

      【解决方案5】:

      Base SDK 是指构建您的应用的 SDK。 SDK 有一些框架等,它们随着 SDK 版本的变化而不同。例如;

      假设您当前 XCode 中的 Base SDK 是 iOS 6:

      • 您可以拥有 iOS 6 SDK 为您提供的框架和功能。

      • 您的应用可以在您指定为“最低 iOS SDK”的任何 iOS SDK 中使用。最低 iOS 设备对使用的组件有一些限制。请注意这一点。

      • 您的应用程序也可以在 iOS 7 中使用,就像在 iOS 5 或 iOS 6 中一样。因为 iOS 版本具有向后兼容性。这意味着,iOS 7 也将运行在 iOS 6 中运行的应用程序。

      假设您当前的 Base SDK 是 iOS 6,而您希望将其升级为 iOS 7

      • 您的应用将使用全新的 SDK 构建,因此,如果新 SDK 包含 它有一些大的变化,你会立即看到差异 你运行应用程序。例如,在 iOS 7 SDK 中,您可以使用状态栏 (20 px)也作为视图组件。这可能会破坏您的视图层次结构。

      • 您需要再次测试您的应用以检查您的代码是否与 iOS 7 兼容

      • 如果你想使用新的 iOS 7 框架或功能,你的方法是正确的,你现在就可以使用它们:)

      简而言之,Base iOS SDK 是基于您的应用编译和构建的 iOS 版本。在 iOS X 上运行它?设备是一个不同的概念。

      希望对你有帮助

      【讨论】:

        【解决方案6】:

        Base SDK 是您要用于构建应用程序的 SDK。使用“部署目标”指定您希望应用运行的最低操作系统。

        如果你想知道iOS版本,check out this question

        【讨论】:

        • 抱歉,这并不能解决问题。
        【解决方案7】:

        在更新 Apple 框架本身时,Apple 负责对多个 iOS 版本的支持;但是您需要遵循一些基本检查,这些检查在 here 中进行了解释

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-22
          • 1970-01-01
          • 2014-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多