Objective c 检查SLServiceTypeFacebook和twitter时出错
我的应用程序支持iOS 5+。现在我想添加facebook和twitter。 我添加了social.framework作为可选,并在facebook btn上进行了检查Objective c 检查SLServiceTypeFacebook和twitter时出错,objective-c,facebook,ios5,twitter,social-framework,Objective C,Facebook,Ios5,Twitter,Social Framework,我的应用程序支持iOS 5+。现在我想添加facebook和twitter。 我添加了social.framework作为可选,并在facebook btn上进行了检查 if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) { NSLog(@"Facebook iOS 6 avaliable"); } else { NSLog(@"Feature not supported")
if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
NSLog(@"Facebook iOS 6 avaliable");
}
else
{
NSLog(@"Feature not supported"); // for iOS 5 users
}
twitter也是如此。但iOS 6模拟器工作正常,但iOS 5模拟器出现错误。在iOS 5和iOS 6上添加facebook和twitter共享的任何帮助或教程
EXC_BAD_ACCESS (code=2, address=0x0) isAvailableForServiceType:SLServiceTypeFacebook
isAvailableForServiceType:SLServiceTypeTwitter
在为答案1更新项目后,转到此错误
这是前缀文件
社交框架(
SLComposeViewController
)仅在iOS 6中引入。在iOS 5中,与任何社交网络的唯一本地连接是Twitter和tweetcomposeviewcontroller
类。iOS 6推出了社交
框架,该框架具有现有的Twitter支持以及新的Facebook和新浪微博集成
因此,在iOS 5上,您实际上无法引用或调用SLComposeViewController
,您需要使用条件来查看用户设备正在运行的版本(iOS 5或6),然后执行任何操作/条件
代码if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook])
用于查看用户是否在设置应用程序中设置了Facebook帐户
是的,因此您添加了iOS 5兼容性的Twitter
框架,顺便确保Social
framework设置为可选
要检查设备正在运行的版本,请将其添加到您的MyApp Prefix.pch
文件中:
#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)
然后您可以在任何类中使用它,因为前缀文件会自动导入到所有类中:
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0") && SYSTEM_VERSION_LESS_THAN(@"6.0")) {
NSLog(@"This is called when device is running iOS 5, 5.0.1, 5.1 etc.");
}
else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {
NSLog(@"iOS 6.0, 6.0.1, 6.0.2, 6.1 etc.");
}
因此,这个错误是一个“分割错误”,因为社会框架是一个只有iOS6的框架。由于您使用了弱链接(这就是添加框架作为“可选”的意思),SLComposeViewController
类是Nil
(即,它实际上指向无效的内存地址0x0
),因此您尝试调用它的任何函数都很可能导致分段错误(因为不可能取消对该地址的引用)
您需要做的是检查该类是否为有效指针:
if (NSClassFromString(@"SLComposeViewController") != Nil) {
// iOS 6
} else {
// iOS 5, Social.framework unavailable, use Twitter.framework instead
}
如果([SLComposeViewController可用于服务类型:SLServiceTypeFacebook]),那么为什么要使用此代码呢okx..还有一件事..如果我有twitter共享。那么我必须添加social.framwork和twitter.framework以支持iOS 6和iOS 5。?同时告诉我如何检查iOS版本并运行为iOS 6和iOS 5编写的desire方法。这不允许你在iOS 5和iOS 6上运行应用程序,因为它在编译时检测到一个功能。OP寻找的是runtime正在检查可用的功能。@user777304更新了答案,但我很惊讶您需要我告诉您使用@H2CO3答案,而不是我的答案。如果(SLComposeViewController!=Nil)出现错误…预期标识您可以将社交框架设置为“可选”,然后Xcode将仅在iOS 6或above@RohanKapur同样,这是一个运行时检查,而不是编译时检查。此外,链接与编译器错误OP had无关。哦,好吧,我现在明白了。很抱歉造成混淆。是的,你是对的。这意味着无需在iOS 6和iOS 5的应用程序中签入此共享…功能?
if (NSClassFromString(@"SLComposeViewController") != Nil) {
// iOS 6
} else {
// iOS 5, Social.framework unavailable, use Twitter.framework instead
}