已弃用的方法
如果您的目标是在不推荐使用这些方法之前发布的 iOS 版本,则可以使用不推荐使用的方法。但是假设您的部署目标设置正确,您将不会收到任何编译器错误,除非那些不推荐使用的方法始终针对您的目标版本不推荐使用。换句话说,如果您在代码中看到弃用警告,则需要修复它们或检查您的部署目标设置是否正确。不要忽视他们!
Xcode 设置级别
您提到可以在目标和项目级别定义部署目标设置的事实。目标级别的 Xcode 构建设置将覆盖项目设置。因此,仅在其中一个级别定义部署目标,然后转到另一个并单击删除,这样您就没有重复的值。如果您只有一个目标,那么在目标或项目级别定义它并不重要。
向后和向前兼容性
最后,有许多因素会影响向后和向前兼容性。有时会有新的 iOS 6 方法,比如supportedInterfaceOrientations
在旧的 iOS 版本上会被忽略。其他时候您需要添加显式检查:
如果你在一个对象上调用一个方法并且这个方法只在 iOS 6 中被引入,你需要respondsToSelector:
像这样添加一个检查:
// only available on iOS 6
if ([locationManager respondsToSelector:@selector(pausesLocationUpdatesAutomatically)]) {
locationManager.pausesLocationUpdatesAutomatically = YES;
}
如果要检查当前 iOS 版本上是否存在特定类,可以检查 +class 方法的返回值,如下所示:
// Only available on iOS 6
if ([UICollectionView class]) {
// ...
} else {
// class doesn't exist in this iOS version
}
如果要检查特定功能是否可用,请对其执行简单的 if 语句:
// Only available in iOS 6
if (ABAddressBookCreateWithOptions) {
ABAddressBookCreateWithOptions(...);
} else {
ABAddressBookCreate(...);
}
最后,如果你想检查一个常量是否可用,检查它的地址:
// Only available in iOS 4
if (&UIApplicationProtectedDataDidBecomeAvailable) {
// subscribe to notification
}
您的 Base SDK 设置应始终设置为“最新”。
如果您遵循所有这些准则,您将能够解决大部分问题,而无需添加显式版本检查。检查 iOS 版本或设备 ID 非常脆弱,很可能会导致您的应用在未来的版本中崩溃。你真的想避免它。