为 iOS4.3 和 iOS5.0 构建的问题

Posted

技术标签:

【中文标题】为 iOS4.3 和 iOS5.0 构建的问题【英文标题】:Problems building for both iOS4.3 and iOS5.0 【发布时间】:2011-10-15 13:29:50 【问题描述】:

我在尝试将一些特定于 ios5 的库合并到针对 iOS5 和 iOS4.3 的应用程序中时遇到了问题。我已经完成了以下步骤:

通过在“Link Binary with Libraries”中将其设置为可选来弱链接 Twitter 框架

在 Other Linker Flags 中使用 `-framework Twitter.framework' 将其作为 iOS5.0 SDK 的框架添加

在类头中有条件地链接框架:

#if defined(__IPHONE_5_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0
#import <Twitter/Twitter.h>
#import <Accounts/Accounts.h>
#endif

然后在方法本身中,我会检查用户是否设置了 Twitter:

if ([TWTweetComposeViewController class]) 
    self.canTweet = [TWTweetComposeViewController canSendTweet];

这在 5.0 和 4.3 模拟器上运行良好。但是,我无法让它在实际设备上运行或存档。

当我安装了运行 5.0 的 3GS 或附加了运行 5.0 的 4 时,两者都会在 Scheme 下拉菜单中显示两次。选择最上面的一个,然后尝试构建或运行项目失败,并出现 Use of unidentified identifier 'TWTweetComposeViewController' 错误。

使用第二个设备条目,构建失败并出现ld: framework not found Twitter.framework 错误。

我确定我在这里缺少一些东西,但我很难过。谁能给点建议?

【问题讨论】:

【参考方案1】:

如果您使用的是一周链接,那么您必须使用以下方法检查 API 的首次可用性 NSClassFromString、respondsToSelector、instancesRespondToSelector 等。 所以,改变你的 if 条件。首先尝试使用上面指定的运行时函数获取您的类对象。 这是一个链接,详细解释了如何执行此操作。 link

【讨论】:

谢谢 - 已根据建议对其进行了修改。看来我在这里遇到了两个问题,因为我也遇到了未找到框架的错误...【参考方案2】:

展示推特控制器的代码

在此之前,如果 iOS 是最低 iOS 5,您必须将框架添加为可选并在 h 文件中导入

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];
                
             

【讨论】:

【参考方案3】:

进一步挖掘编译器返回的错误表明它忽略了弱链接标志。虽然我不知道如何或为什么,但它已通过重新安装 XCode 修复。

【讨论】:

【参考方案4】:

如果您链接到 4.2 或更高版本并部署到 3.1 或更高版本,您可以使用新的弱链接功能来简化此检查。

您必须将 Twitter 框架添加为可选,然后

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];
     
 

【讨论】:

以上是关于为 iOS4.3 和 iOS5.0 构建的问题的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 iOS 5.0.1 beta 版本的设备测试 iOS 应用

无法使用 iOS 4.3.5 设备在 Xcode 4.1 中构建源代码

iAD 仅在某些设备上工作

如何创建一个向后兼容iOS 5.0的新Xcode 5项目? - 错过故事板错误

程序在 iOS 5 中崩溃而在 iOS 4 中正常?