具有较低基础sdk的应用程序如何工作?

时间:2013-09-12 04:38:22

标签: ios objective-c cocoa-touch

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

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

由于

7 个答案:

答案 0 :(得分:5)

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

  

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

但是,我们需要注意这一点:

  

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

要了解更多信息,请阅读this

答案 1 :(得分:3)

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

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

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


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

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

答案 2 :(得分: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

答案 3 :(得分:1)

您的项目是针对Current SDK构建的。如果您有较旧的部署目标,那么您的代码库将根据该目标进行编译。因此,如果您要针对7.0构建,但具有6.0部署目标,则不会触发iOS 7特定的弃用。将根据最早的指定部署目标编译所有内容。

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

如果您计划使用任何最新方法,则需要将它们包含在编译器if语句(如Peter Fidemraizer的答案)或正常if语句中检查Foundation框架中的版本。

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

答案 4 :(得分:1)

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像素)作为视图组件。这可能会破坏您的视图层次结构。

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

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

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

希望这有帮助

答案 5 :(得分:0)

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

如果您想了解iOS版本check out this question

答案 6 :(得分:0)

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