Iphone 根据iOS版本启用不同的功能

Iphone 根据iOS版本启用不同的功能,iphone,objective-c,ios,version,Iphone,Objective C,Ios,Version,在我们正在构建的应用程序中,我们希望使用UILocalNotifications,它仅在4.0中可用 检查对象是否响应选择器非常容易,但是如何根据操作系统在类上定义委托方法呢?我遇到的问题是,我的应用程序委托实现了 -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 方法,使应用程序在iOS 3.2设备(ipad)上启动时

在我们正在构建的应用程序中,我们希望使用UILocalNotifications,它仅在4.0中可用

检查对象是否响应选择器非常容易,但是如何根据操作系统在类上定义委托方法呢?我遇到的问题是,我的应用程序委托实现了

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
方法,使应用程序在iOS 3.2设备(ipad)上启动时崩溃


最好不要发布多个版本。

一个好方法是检查以下内容:

#ifdef __IPHONE_4_0 // if iPhoneOS is 4.0 or greater then __IPHONE_4_0 will be defined

    //code
#endif

如果您正在处理低于4.0的操作系统,If甚至在该编译器指令中看不到任何代码。

您可以将委托方法更改为使用
id
作为3.2上不可用的类的类型,即:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(id)notification 
在方法体中,像往常一样检查UILocalNotification。
notification
参数可以类型转换为UILocalNotification


我很惊讶这会导致崩溃,因为不应该调用该方法。如果更改方法定义中的类型没有帮助,则可能是由于某种原因调用了该方法。在这种情况下,请尝试在方法中设置断点以找出原因。

您需要使用称为“弱链接”的功能,该功能将适用于iOS 3.1或更高版本。您需要遵循一些非常具体的步骤,如4.2所述(在文档中搜索“弱链接”)


马可·阿蒙特(Marco Arment)最近发表了一篇关于这一问题的文章,其中有很好的见解:


谢谢,但是如果目标低于4.0,使用#ifdef不会简单地从编译中删除代码吗?当然,但是如果设备低于4.0,您不需要删除该方法吗?确实,但是如果您设置了iOS部署目标,我可能需要为不同的iOS版本设置多个目标,对吗(在目标设置的“生成”选项卡中)对于您正在使用的最低SDK,从基本SDK到最高SDK,编译器实际上会处理所有可能的分支。我有一个与您有相同问题的应用程序,这种方法对于使用相同目标的两个设备都非常有效。试试吧!如果它对您有效,我很确定这是因为其他示例中描述的弱链接支持答:如果基本SDK设置为4.0或更高版本,则预处理器将始终包含iPhone 4.0的代码,无论设置了什么部署目标。实际上没有“多路径”由于没有创建实例的路径,所以要编写代码,只有组成各种方法声明和实例变量的类型。引用该类将导致GCC将其包含在应用程序的符号中,如果找不到符号,则会导致其在运行时崩溃。您需要遵循一些特定规则来创建弱链接奥克。