iPhone 版本兼容性扫描器

4

我已经开发 iPhone 应用程序超过一年了,但还有一个问题仍然非常糟糕。

假设我想让我的应用程序与 iOS 3.0 兼容,我将 SDK 设置为最新版本,并将部署目标设置为 3.0。

但是,如果你不小心调用了只在 3.1.x 或更高版本可用的函数会发生什么?是的,它就会崩溃。

没有任何警告或指示来告诉你,某个函数仅在后续 iOS 版本中可用。由于模拟器不支持版本 < 4.0,因此无法测试应用程序是否真正工作。你甚至不能购买新设备,因为它们已经安装了更新的 iOS 版本。即使你有一台旧设备,有时也几乎不可能检查代码中的每个部分。

而我确实需要支持旧版本,因为我知道我的客户(约 2/3)仍在使用 3.x 版本。

难道没有任何代码分析器或类似工具可以扫描应用程序中调用的所有函数的可用性吗?

有一次应用程序崩溃是因为我调用了:

+ (id)sortDescriptorWithKey:(NSString *)key ascending:(BOOL)ascending

这是一个方便的方法,等同于alloc +

- (id)initWithKey:(NSString *)key ascending:(BOOL)ascending;

(此外,它是自动释放的) 但是sortDescriptorWithKey仅适用于4.0 @_@

3个回答

2
同样的问题在这里。我发现将项目和目标的Base SDK设置为3.0是唯一的解决方法。然后编译器就会检查您是否调用了一些不存在的方法。
但对于扫描仍然存在问题,因为上面的方法在使用ASI HTTP框架时会导致一些错误。所以我的步骤是:
  1. 将SDK更改为3.0
  2. 检查自己代码中的错误
  3. 更改方法以使其与3.0兼容
  4. 将项目的Base SDK设置回最新的SDK
您可能需要从之前的XCode版本安装一个SDK 3.0。而且没有必要将目标Base SDK设置回最新版本。我曾经将它设置为3.0,并且没有从ASI HTTP获得任何错误。
//编辑:XCode 3.2.1下载链接:Snow LeopardLeopard

下载链接已添加,您必须在下载之前使用您的开发者帐户登录 ;) - user207616
谢谢 :) 现在我同时安装了两个版本的Xcode,但至少我可以针对较旧的SDK进行编码。 - Infinite
你也可以只安装SDK而不需要XCode的副本:打开终端并导航到DVD,然后进入子目录/packages,那里有所有可以单独安装的SDK。确保同时安装设备和模拟器!安装完成后,你需要将新创建的文件夹移动到根目录(/)下的XCode目录中 ;) - user207616

0

尝试通过调用respondsToSelector方法来检查

if([your_obj respondsToSelector:@selector(sortDescriptorWithKey:ascending:)]){
  // call sortDescriptorWithKey
}
else
{
  // call another method
}

编译时会收到警告,但运行时不会崩溃。


这并不是问题的真正解决方案。你不能通过这样的分支运行每个方法,也没有好的方法来检查特定方法调用是否存在于之前的操作系统版本中。苹果真的需要开始在他们的发布中包含旧的SDK,这样你就可以轻松地将基础SDK设置为旧的版本,然后在模拟器上进行测试。 - kubi
当然你不能以这种方式检查每个方法,但如果需要检查几个方法,这可能会有所帮助。 - Andriy

0

尝试使用苹果框架/弱链接指南中建立的指导方针,用于那些您无法像@Andriy的答案中那样询问对象的函数。


问题不在于处理已知不可用的函数,而在于识别哪些函数不可用 ;) - Infinite
@Infinite,在这里尝试这个答案,至于在编码之前如何知道哪个是,检查头文件(跳转到定义)。它们会告诉你。 - Stephen Furlani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接