轻松检测我是否使用旧版iOS不可用的框架

时间:2012-04-16 10:25:10

标签: xcode ios-frameworks ios

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

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

我以为我会通过使用编译器选项得到它:

-D__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_3

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

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

有没有人设法做这样的事情而不诉诸旧SDK下载旧的Xcodes?在那里,我可能会遇到在Lion下无法正常运行的Xcodes问题(这就是我正在运行的)。

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

以下是@ mattjgalloway的答案为我做的一个示例:

Lumin App Group

/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发行版无法使用的框架。

2 个答案:

答案 0 :(得分:4)

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

#define __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED __IPHONE_4_3
#import "MJGAvailability.h"

如果你想支持iOS 4.3。

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

如果您想要取消警告,因为您可能知道使用该API是可以的(例如,您已用respondsToSelector包围它),那么您可以执行以下操作:

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
}

答案 1 :(得分:1)

抱歉;完全吹响第一次回答。让我们再试一次......

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

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

您可能只想使用旧的SDK。

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

但是,你也可以下载旧的东西。 Apple只是隐藏它。从Downloads for Apple Developers开始。找到您想要的Xcode副本。下载Snow Leopard的Xcode 4.1;它包括iOS SDK 4.3。您可以与Xcode 4.3并行安装它,但您不必这样做。挂载磁盘。打开一个终端(这样更简单)。转到/ Volumes / Xcode / Packages。你会在那里找到所有的SDK。

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

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