底层SDK如何工作?

在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应用程序向前兼容新版本的iOS。 原因是 :

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

虽然,我们需要注意这一点:

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

要了解更多,请阅读

你应该把你的目标设置为ios 5.0(通过你的项目目标设置),以确保没有使用ios6方法(否则编译错误将阻止你构build它)。

为了支持新function,并检查设备上是否有ios6,您有两种方法:

编译期间(所以你仍然可以用更低的目标和更新的一起构build你的应用程序)使用下面的macros

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

Apple永远不会更改 / 删除 / 重命名类或方法。 他们只添加新的。
如果他们不希望你再使用它,他们将其标记为已弃用 。

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

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


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

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

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

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

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

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

基础SDK意味着您的应用将构build在其上的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构build,因此,如果新SDK发生了一些重大变化,您将在运行应用程序时立即看到差异。 例如,在iOS 7 SDK中,也可以使用状态栏(20像素)作为视图组件。 这可能会毁了你的视图层次结构。

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

  • 如果你想使用新的iOS 7框架或function,你是在正确的方式,你可以使用它们:)

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

希望这可以帮助

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

如果你想知道iOS版本, 请查看这个问题 。

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