-4

可能重复:
如何仅为 iOS 6 导入社交框架?

需要检查预处理器宏中的条件。

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

/*
 *  Usage
 */



if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0"))
{
#import <Social/SLServiceTypes.h>
#import <Social/SLRequest.h>
#import <Social/Social.h>
#import <Social/SocialDefines.h>
}
4

3 回答 3

1

如前所述,#import是一个编译时指令——所有预处理器指令(以 开头的东西#)都是。因此,您似乎在这里尝试做的事情不会像您期望的那样工作。

只要您只使用最新的 SDK 构建,您就不需要有条件地#import标头 - 无论您构建的目标 iOS 版本如何,最新的标头都可供您使用。

如果您的代码需要在不同的 SDK 版本下构建——例如,如果您有一个队友的机器无法运行最新的 Xcode,那就是条件导入的时候了。但由于这是编译时的事情,您需要针对您的 SDK 版本进行编译时检查,而不是运行时检查。使用类似的东西:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_6_0
// building with iOS 6 SDK, safe to import Social framework
#endif

不过,如果您希望您的代码使用较旧的 SDK构建,您只需要这样做。

如果您希望您的应用程序在较旧的 iOS 版本上运行,但又想有条件地使用新的 iOS 功能,那么您就需要运行时检查。您还需要使用弱链接。然而,即便如此,Apple 还是建议您避免检查版本号——最好检查您需要的特定功能。例如,如果你想使用 Social 框架,弱链接整个框架(即使其成为 Optional),然后在使用之前检查你想要的类是否存在:

if ([SLComposeViewController class] {
    SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
    // ...
}

为什么要避免版本号检查?好吧,假设您在尝试使用社交框架 API 之前检查了高于 5.1 的 iOS 版本……然后假设 Apple 发布了另一个 5.1.x 更新以修复安全漏洞。现在,您的应用程序认为它在具有社交框架的版本上,尝试使用它,崩溃并在 App Store 上给您带来差评。如果您检查 6.0 怎么办……那么 Apple 可能会改变他们对轴系原始 iPad 用户的想法,并发布至少让我们拥有一些iOS6 功能的 5.x 更新,包括社交?现在您的应用程序不会崩溃,但它也不会让您的用户拥有新的 iOS 功能——再次获得一星评价。

于 2012-12-31T06:48:07.107 回答
1

您不能在运行时导入文件。imports在编译时工作。由于上述宏正在使用将在运行时计算值的方法,因此我认为您尝试实现的任何目标都不可能

于 2012-12-31T06:07:53.077 回答
0

结构非常简单:#IF ... #ENDIF

以下是一些有用的链接: First , Second , Third

于 2012-12-31T06:02:43.820 回答