如何使用 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 方法构建应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

ios 4.3 应用程序与 ios 5.0 的兼容性

AlAssetsLibrary 问题,代码适用于 4.3 但不适用于 5.0

为啥 heightForHeaderInSection 在 iOS 4.3 中不起作用?

iOS5 情节提要错误:情节提要在 iOS 4.3 及更低版本上不可用

iOS 5 中的弹出框变化?

如何使用 XCode 4 + 基本 SDK 4.3 为 iOS 4.0 设备构建?