Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 检查SLServiceTypeFacebook和twitter时出错_Objective C_Facebook_Ios5_Twitter_Social Framework - Fatal编程技术网

Objective c 检查SLServiceTypeFacebook和twitter时出错

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")

我的应用程序支持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模拟器工作正常,但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
}