如何使用适用于iOS 4.3的iOS 5.0方法构建应用程序?

时间:2012-02-14 07:47:17

标签: iphone objective-c ios build icloud

我正在为我的应用程序完成iCloud功能,无法解决一个问题: 由于我正在使用一些新的5.0功能,如NSFileCoordinator,因为“dyld:未找到符号:_OBJC_CLASS _ $ _ NSFileCoordinator”,我无法构建我的应用程序4.3。 如何“解锁”一些用于构建4.3版本的文件(具有iCloud方法)? 提前谢谢!

6 个答案:

答案 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)

将它们从源代码复制中删除:

  1. 单击您的项目文件。
  2. 转到“构建阶段”。
  3. 展开“编译源代码”。
  4. 选择您不想要的文件,然后按下“ - ”按钮 该部分的底部。
  5. 或者您可以从项目中删除它(只删除引用而不是删除文件),它也将从此部分中删除它。

    或者您可以创建预处理器宏来检查用户是否可以运行函数

    // 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
}