7

在马拉松式的编码会议之后,我添加了太多代码而没有跟踪所有内容,我现在有一个可能有一些 iOS 5.0 和 5.1 特定枚举、调用和框架的应用程序,但是,我希望我的应用程序支持 iOS 回到 4.3 .

我希望有一种简单的方法可以将 Xcode 设置为编译,就好像它正在为 iOS 4.3 编译一样,这样我就会得到所有需要调整和/或替代编码的违规代码的错误,对于较旧的IOS。

我想我可以通过使用编译器选项来实现:

-D__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_3

但这最终会在系统头文件中产生错误,而不是我的代码。

鉴于大多数枚举和框架的可用性都包含在头文件中,我不得不认为有一种简单的方法可以满足我的需要。

有没有人设法在不使用旧 SDK 下载旧 Xcode 的情况下做到这一点?在那里我可能会遇到在 Lion 下无法正常运行的 Xcode 问题(这就是我正在运行的)。

更新:似乎我无法在 Lion 上安装 Xcode 3.2.6。我现在必须找到一台 Snow Leopard Mac,除非我找到使用编译器选项或强制 Xcode 使用旧 SDK 的方法......

以下是@mattjgalloway 的回答为我所做的示例:

路明应用群

/Users/mz/Dev/Working/Lumin/Lumin/MyUIScreen.m

  • 'brightness' 已被弃用:太新了!
  • 'brightness' 已被弃用:太新了!
  • 'brightness' 已被弃用:太新了!
  • 'brightness' 已被弃用:太新了!

/Users/mz/Dev/Working/Lumin/Lumin/LuminViewController+Share.m

  • 'TWTweetComposeViewController' 已被弃用:太新了!
  • 'TWTweetComposeViewController' 已被弃用:太新了!
  • 'TWTweetComposeViewController' 已被弃用:太新了!

/Users/mz/Dev/Working/Lumin/Lumin/LuminViewController.m

  • 'scrollView' 已被弃用:太新了!
  • 'connectionWithMediaType:' 已弃用:太新了!
  • 'connectionWithMediaType:' 已弃用:太新了!
  • 'AVCaptureDeviceSubjectAreaDidChangeNotification' 已弃用:太新了!
  • 'setSubjectAreaChangeMonitoringEnabled:' 已弃用:太新了!

非常好。

我将以下内容放在项目的 .pch 文件中,并计划对所有项目都这样做:

#if DEBUG
#define __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED __IPHONE_OS_VERSION_MIN_REQUIRED
#import "MJGAvailability.h"
#endif

对于任何项目,我现在都会根据我所针对的最早的 iOS 自动监视 SDK 问题。虽然我仍然可能需要担心 SDK 更改,但至少我知道大多数框架添加在旧版 iOS 版本中是不可用的。

4

2 回答 2

4

看看我MJGAvailability.h 在 GitHub 上的这里。基本上,它定义了正确的预处理器#define,以便较新的 API 看起来像是已弃用,因此您会收到编译器警告。文件顶部有一些文档,但基本上你只需在 PCH 文件中执行此操作:

#define __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED __IPHONE_4_3
#import "MJGAvailability.h"

如果你想支持到 iOS 4.3。

它当然不是 100% 万无一失的,但我发现它对于做你要求的事情非常有用。

如果您想抑制警告,因为也许您知道使用该 API 是可以的(respondsToSelector例如,您已经用 a 包围了它),那么您可以执行以下操作:

UINavigationBar *navBar = self.navigationController.navigationBar;
if ([navBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    [navBar setBackgroundImage:[UIImage imageNamed:@"navbar_bg.png"] forBarMetrics:UIBarMetricsDefault];
#pragma clang diagnostic pop
}
于 2012-04-17T21:33:05.883 回答
1

对不起; 第一次完全搞砸了这个答案。让我们再试一次...

  • 部署目标设置您将使用的最低操作系统版本。
  • SDK 设置您将使用的最高操作系统版本

在部署目标和 SDK 之间,您必须有条件地检查 API。有关详细信息,请参阅SDK 兼容性指南

您可能只想改用旧的 SDK。

将旧 SDK 与较新版本一起使用的最简单方法是保存 .sdk 目录的副本,并在升级时将其复制到新版本中。

但是,您也可以下载旧的东西。苹果只是隐藏它。从面向 Apple 开发人员的下载开始。找到您想要的 Xcode 副本。为雪豹下载 Xcode 4.1;它包括 iOS SDK 4.3。您可以将它与 Xcode 4.3 并行安装,但您不必这样做。挂载磁盘。打开一个终端(这样更容易)。转到 /Volumes/Xcode/Packages。你会在那里找到所有的 SDK。

您可以尝试直接安装它,这可能适合您,也可能不适合您。您还可以解压缩 .pkg 并获取所需的文件。我通常使用一个名为The Unarchiver的程序。它几乎可以解压任何东西。这将为您提供一个目录,其中包含一个名为“Payload”的文件。如果你双击它,它会展开(它只是一个 tar.gz,它们不包含扩展名)。这将为您提供平台目录。将其复制到 Xcode 副本中的 Platforms 目录中,您应该是金色的。

综上所述,一旦系统运行良好,我通常会切换回使用最新的和使用部署目标进行编译。它使与没有旧 SDK 的其他人协作变得更加容易。由于与旧 SDK 的链接,Apple 可能会或可能不会拒绝。他们过去曾这样做过;我不知道那里目前的情况(有一段时间没有出现过)。但我倾向于建议提交针对最新版本构建的内容。

于 2012-04-17T21:39:39.350 回答