为 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 5.0.1 beta 版本的设备测试 iOS 应用
无法使用 iOS 4.3.5 设备在 Xcode 4.1 中构建源代码