0

我想让我们的应用程序与 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]){
            }
        }
    }

我只是想确保在检查 openURLs 时不会在 iOS5 上崩溃

4

3 回答 3

4

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

Class directionsRequestClass = NSClassFromString(@"MKDirectionsRequest");

if (directionsRequestClass)
    // it exists, so you can use it
else
    // doesn't exist, do something else
于 2012-10-01T21:43:04.137 回答
2

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

if ([MKDirectionsRequest class]) { 
 ... 
}
于 2012-10-01T20:54:52.273 回答
1

我看到许多不鼓励使用系统版本字符串的帖子。这可能与将 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 创建这个函数,我花了几分钟寻找一个静态方法来简化检查(这样我就不必分配一个类)。通过遵循这种做法,您应该能够确保您的应用程序对于未来的更新是版本安全的。

于 2012-10-01T20:31:24.763 回答