我正在为我的应用程序完成iCloud功能,无法解决一个问题: 由于我正在使用一些新的5.0功能,如NSFileCoordinator,因为“dyld:未找到符号:_OBJC_CLASS _ $ _ NSFileCoordinator”,我无法构建我的应用程序4.3。 如何“解锁”一些用于构建4.3版本的文件(具有iCloud方法)? 提前谢谢!
答案 0 :(得分:4)
查看this。
Class cls = NSClassFromString (@"NSFileCoordinator");
if (cls) {
// Create an instance of the class and use it.
} else {
// Alternate code path to follow when the
// class is not available.
}
同时检查此answer以查看原因
您应该避免依赖版本字符串作为设备或操作系统功能的指示。
答案 1 :(得分:2)
将它们从源代码复制中删除:
或者您可以从项目中删除它(只删除引用而不是删除文件),它也将从此部分中删除它。
或者您可以创建预处理器宏来检查用户是否可以运行函数
// System Versioning Preprocessor Macros
#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_LESS_THAN(@"4.0")) {
...
}
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"3.1.1")) {
...
}*/
有了这个,您可以检查用户正在使用的systen版本,并且仅针对5.0进行构建,但如果版本低于5.0,则会输入正常运行的代码。
答案 2 :(得分:0)
我认为最好关闭4.3版本的iCloud功能。你可以通过在运行时检查iOS版本来做到这一点。在您的特定情况下,您可以检查是否存在具有NSFileCoordinator
功能的NSClassFromString()
类,但我很确定在互联网上有更好的方法可以实现此功能。
答案 3 :(得分:0)
您可以创建一个新的构建目标并设置编译器预处理宏,如NO_CLOUD,然后使用
#ifdef NO_CLOUD
... code here ...#else
... cloud code here ... #endif
答案 4 :(得分:0)
你必须弱化到框架的链接(当你向项目添加一个框架时,只需将它设置为不需要的选项)。
在h文件中,只有在拥有ios 5
时才需要导入#if defined(__IPHONE_5_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0
#import <Twitter/Twitter.h>
#import <Accounts/Accounts.h>
#endif
并且在m文件中你必须尝试从string创建类并测试以查看你是否有类。并且还测试顶部,看看该类是否响应选择器。
Class TWTweetComposeViewControllerClass = NSClassFromString(@"TWTweetComposeViewController");
if (TWTweetComposeViewControllerClass != nil) {
if([TWTweetComposeViewControllerClass respondsToSelector:@selector(canSendTweet)]) {
UIViewController *twitterViewController = [[TWTweetComposeViewControllerClass alloc] init];
[twitterViewController performSelector:@selector(setInitialText:)
withObject:NSLocalizedString(@"TwitterMessage", @"")];
[twitterViewController performSelector:@selector(addURL:)
withObject:url];
[twitterViewController performSelector:@selector(addImage:)
withObject:[UIImage imageNamed:@"yourImage.png"]];
[self.navigationController presentModalViewController:twitterViewController animated:YES];
[twitterViewController release];
}
} else {
//do something else
}
我的例子基于推特引擎,你必须让它适应你的课程。
答案 5 :(得分:0)
使用最新的SDK(5.0)构建它。它将调整4.3和5.0
您可以查看IOS版本
if ([[UIDevice currentDevice] systemVersion] floatValue] >= 5.0f) {
// iCloud
} else {
// iCloudless
}