7

在 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
}

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

谢谢

4

7 回答 7

5

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

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

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

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

要了解更多信息,请阅读

于 2013-09-12T05:39:19.963 回答
4

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

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

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


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

该应用程序将在 10.7 之前的系统上崩溃。

于 2013-09-20T07:24:26.170 回答
2

您应该将目标设置为 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
于 2013-09-12T04:43:11.803 回答
1

基础 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 上运行它?设备是一个不同的概念。

希望这可以帮助

于 2013-09-17T13:50:19.063 回答
1

您的项目是针对当前 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
}
于 2013-09-16T11:18:44.063 回答
0

在更新 Apple 框架本身的同时,Apple 负责对多个 iOS 版本的支持;但是您需要遵循一些基础检查,这些在此处进行了说明

于 2013-09-16T10:43:10.000 回答
0

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

如果您想了解 iOS 版本,请查看此问题

于 2013-09-12T04:42:01.927 回答