使用 iOS6 处理 MKDirectionsRequest 即使你的应用与 iOS5 兼容



我想让我们的应用程序与iOS6的MKDirectionsRequest(运输方向方法)兼容。 苹果表示,最好的方法是:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if ([MKDirectionsRequest isDirectionsRequestURL:url]){
        }
}

但是,确保此代码仅在 iOS6 而不是 iOS5 中运行时运行的最佳方法是什么? 该应用程序也必须与iOS5兼容,但我MKDirectionsRequest是iOS6。

我不能使用编译器指令,例如:

#ifdefine iOS5

什么的。

这是最好的方法吗?

BOOL atLeastIOS6 = [[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0;

然后:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
        if (atLeastIOS6)
        {
            if ([MKDirectionsRequest isDirectionsRequestURL:url]){
            }
        }
    }

我只想确保在检查打开URL时不会在iOS5上崩溃

不要依赖iOS版本。使用 NSClassFromString 检查该类是否存在:

Class directionsRequestClass = NSClassFromString(@"MKDirectionsRequest");
if (directionsRequestClass)
    // it exists, so you can use it
else
    // doesn't exist, do something else

您可以测试类 MKDirectionsRequest 是否可用:

if ([MKDirectionsRequest class]) { 
 ... 
}

我看到过许多不鼓励使用系统版本字符串的帖子。 这可能与将 6.0.1 转换为浮点数的棘手性有关,但不确定。

首选方法似乎是测试出现在特定版本中的选择器。 因此,我使用这两种方法分别测试iOS 5或6。

+ (BOOL)isOS5Capable {
    return ( [UINavigationBar respondsToSelector:@selector(appearance)] );
}
+ (BOOL)isOS6Capable {
    return ( [UIView respondsToSelector:@selector(requiresConstraintBasedLayout)] );
}

如果您浏览Apple框架中的标头,您会发现有很多NS_AVAILABLE宏指定选择器出现的版本。 为了为 iOS 6 创建此函数,我四处寻找了几分钟以找到一种静态方法来简化检查(这样我就不必分配类)。 通过遵循这种做法,你应该能够确保你的应用在将来更新时是安全的。

相关内容

最新更新