检查SLServiceTypeFacebook和twitter时出错

时间:2013-01-19 14:36:48

标签: 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"); // for iOS 5 users
}
对于Twitter来说同样如此。但iOS 6 Simulator工作正常,但iOS 5模拟器出错。在iOS 5和iOS 6上添加facebook和twitter共享的任何帮助或教程。

EXC_BAD_ACCESS (code=2, address=0x0) isAvailableForServiceType:SLServiceTypeFacebook
isAvailableForServiceType:SLServiceTypeTwitter

更新项目以获得答案1后,请转错。

enter image description here 这是前缀文件 enter image description here

2 个答案:

答案 0 :(得分:4)

Social框架(SLComposeViewController)仅在iOS 6中引入。在iOS 5中,与任何社交网络的唯一本机连接是Twitter和TWTweetComposeViewController类。 iOS 6引入了Social框架,预先存在Twitter支持以及新的Facebook和新浪微博集成。

因此,在iOS 5上,您实际上无法对SLComposeViewController进行任何引用或调用,您将需要使用条件来查看用户设备正在运行的版本(iOS 5或6),然后进行任何操作/条件。

代码if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook])用于查看用户是否在“设置”应用程序中设置了Facebook帐户。

是的,所以你为iOS 5兼容性添加了Twitter框架,请确保Social框架设置为可选。

要查看设备的运行版本,请将其添加到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.");
}

答案 1 :(得分:4)

EXC_BAD_ACCESS (code=2, address=0x0)

所以这个错误是一个“分段错误”,因为社交框架是一个仅限iOS6的框架。由于你使用了弱链接(这就是将框架添加为“可选”的意思),SLComposeViewController类是Nil(即它实际指向无效的内存地址0x0),所以任何您尝试调用它的函数很可能会导致分段错误(因为无法取消引用此地址)。

您需要做的是检查此类是否为有效指针:

if (NSClassFromString(@"SLComposeViewController") != Nil) {
    // iOS 6
} else {
    // iOS 5, Social.framework unavailable, use Twitter.framework instead
}