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

mah*_*udz 7 xcode ios ios-frameworks

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

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

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

-D__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_3
Run Code Online (Sandbox Code Playgroud)

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

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

有没有人设法做这样的事情,而不是使用旧的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

  • "亮度"已被弃用:太新了!
  • "亮度"已被弃用:太新了!
  • "亮度"已被弃用:太新了!
  • "亮度"已被弃用:太新了!

/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
Run Code Online (Sandbox Code Playgroud)

对于任何项目,我现在都会根据我目标最早的iOS自动查看SDK问题.虽然仍然可能有SDK更改,但我至少知道大多数旧版iOS发布的框架添加内容.

mat*_*way 4

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

#define __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED __IPHONE_4_3
#import "MJGAvailability.h"
Run Code Online (Sandbox Code Playgroud)

如果您想支持至 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
}
Run Code Online (Sandbox Code Playgroud)