如何使用 iOS 4.3 的 iOS 5.0 方法构建应用程序?
Posted
技术标签:
【中文标题】如何使用 iOS 4.3 的 iOS 5.0 方法构建应用程序?【英文标题】:How to build app with iOS 5.0 methods for iOS 4.3? 【发布时间】:2012-02-14 07:47:17 【问题描述】:我正在为我的应用完成 iCloud 功能,但无法解决一个问题: 由于我正在使用一些新的 5.0 功能,例如 NSFileCoordinator,我无法为 4.3 构建我的应用程序,因为“dyld:未找到符号:_OBJC_CLASS_$_NSFileCoordinator”。 如何“取消定位”某些文件(具有 iCloud 方法)来构建 4.3 版本? 提前致谢!
【问题讨论】:
【参考方案1】:看看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 了解原因
您应该避免依赖版本字符串作为设备或操作系统功能的指示。
【讨论】:
感谢大家的回复。但这就是我需要的:)【参考方案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"))
...
*/
有了这个,你可以查看用户正在使用的系统版本,并且只为 5.0 构建,但如果它是低于 5.0 的版本,则输入功能代码。
【讨论】:
【参考方案3】:我认为最好完全关闭 4.3 版本的 iCloud 功能。您可以通过在运行时检查 ios 版本来做到这一点。在您的特定情况下,您可以使用 NSClassFromString()
函数检查 NSFileCoordinator
类的存在,但我很确定互联网上有更多体面的方法可以实现这一点。
【讨论】:
【参考方案4】:您可以创建一个新的构建目标并设置一个编译器预处理宏,例如 NO_CLOUD,然后使用
#ifdef NO_CLOUD
... code here ...#else
... cloud code here ... #endif
【讨论】:
这个解决方案的副作用是他最终会得到两个不同的应用程序。 是的确实......但他也明确要求'构建一个 4.3 版本'...... :-)(好吧,蹩脚的借口) 出于好奇,是否可以将这两个二进制文件作为同一个应用程序分发到 App Store 中?或者是否有必要拥有两个单独的应用程序(一个仅适用于 iOS 5,一个适用于 iOS 4.3 和 iOS 5)? 可能是第二个 - 它确实是两个不同的二进制文件,就像您使用完整版和精简版一样【参考方案5】:您必须弱链接到框架(当您将框架添加到项目时,只需将其设置为可选而不是必需的)。
只有在你有 ios 5 的情况下才需要在 h 文件中导入
#if defined(__IPHONE_5_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0
#import <Twitter/Twitter.h>
#import <Accounts/Accounts.h>
#endif
并且在 m 文件中,您必须尝试从字符串创建类并测试以查看您是否拥有该类。并且还测试顶部查看该类是否响应选择器。
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
我的示例是基于 twitter 引擎的,您必须使其适应您的课程。
【讨论】:
【参考方案6】:使用最新的 SDK (5.0) 构建它。它将调整 4.3 和 5.0
你可以查看IOS版本
if ([[UIDevice currentDevice] systemVersion] floatValue] >= 5.0f)
// iCloud
else
// iCloudless
【讨论】:
以上是关于如何使用 iOS 4.3 的 iOS 5.0 方法构建应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
AlAssetsLibrary 问题,代码适用于 4.3 但不适用于 5.0
为啥 heightForHeaderInSection 在 iOS 4.3 中不起作用?