这个问题与Facebook SDK for iOS , on iOS 4.0 device非常相似,但由于我无法在那里发表评论,我提出了一个新问题。我认为问题不一样:
当尝试将我的应用程序的facebook集成更新到facebook 3.1时,我没有让facebook会话打开sessionStateChanged回调总是以FBSessionStateClosedLoginFailed结束。在我的设置中,我在appdelegate中有回调
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
// attempt to extract a token from the url
// return [self.session handleOpenURL:url];
return [FBSession.activeSession handleOpenURL:url];
}
但它从未被调用过!不应该被称为?我按照facebook文档调用
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
NSArray *permissions = [NSArray arrayWithObjects:@"publish_actions", nil];
return [FBSession openActiveSessionWithPublishPermissions:permissions
defaultAudience:FBSessionDefaultAudienceFriends
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error) {
[self sessionStateChanged:session
state:state
error:error];
}];
}
我也试过
带有openActiveSessionWithReadPermissions
的{p> nil
用于Facebook教程示例中的权限,以便稍后重新授权使用publish_actions权限。相同的结果:FBSessionStateClosedLogin再次失败。
我甚至尝试过调用
ACAccountStore *accountStore;
ACAccountType *accountTypeFB;
if ((accountStore = [[ACAccountStore alloc] init]) &&
(accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){
NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
id account;
if (fbAccounts && [fbAccounts count] > 0 &&
(account = [fbAccounts objectAtIndex:0])){
[accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
//we don't actually need to inspect renewResult or error.
if (error){
}
}];
}
}
在尝试打开会话之前,我从未在我的ios6设备(iphone 4s)上打开它。在应用程序中我被要求获得许可,但之后没有任何事情继续,因为会话始终具有状态FBSessionStateClosedLoginFailed!我对会话状态的回调是
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState) state
error:(NSError *)error
{
switch (state) {
case FBSessionStateOpen:
if (!error) {
// We have a valid session
NSLog(@"User session found");
}
break;
case FBSessionStateClosed:
NSLog(@"FBSessionStateClosed");
case FBSessionStateClosedLoginFailed:
NSLog(@"FBSessionStateClosedLoginFailed");
[FBSession.activeSession closeAndClearTokenInformation];
break;
default:
break;
}
[[NSNotificationCenter defaultCenter]
postNotificationName:FBSessionStateChangedNotification
object:session];
if (error) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"facebook Hinweis"
message:@"facebook Login nicht möglich, bitte versuchen Sie es erneut."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
NSLog(@"Facebook session error: %@", error.localizedDescription);
}
}
在ios 5上使用facebook 3.0我从未遇到过问题所以我的脸书应用程序设置正确。我真的很感激任何帮助wchich让我只能打开facebook会话,没想到用facebook 3.1遇到这些问题而且文档在这一点上没有帮助我,thx
答案 0 :(得分:40)
我遇到了同样的问题,因为我忘了实施
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [FBSession.activeSession handleOpenURL:url];
}
在我的AppDelegate
中答案 1 :(得分:19)
虽然JohnG的回答是正确的,但该特定的委托方法现在已经deprecated。使用is this的正确委托方法:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [FBSession.activeSession handleOpenURL:url];
}
将它放在我的应用程序委托中为我解决了这个问题。如果没有这个,iOS 6.0本机登录将起作用,但Facebook应用程序登录将失败。
答案 2 :(得分:2)
我遇到了同样的问题。如果用户没有在系统偏好设置中配置Facebook帐户,则会出现Facebook登录对话框,一切正常。但是,如果用户在设备中配置了帐户,则我总是遇到FBSessionStateClosedLoginFailed
错误。
它与handleOpenURL:url
无关,因为在iOS 6或更高版本的“本机登录流程”中,没有快速应用更改。因此,您的应用永远不会进入后台,也不需要URL重定向。
解决了配置Facebook应用程序的问题。您需要启用“本机iOS登录”部分并放置应用程序的软件包ID。如果您的应用程序尚未在Apple Store中,我担心您需要将沙盒模式设置为ON。一旦您的应用程序在Apple Store中发布,我认为您需要将沙箱模式设置为OFF并在Facebook配置中设置Apple Store ID。
答案 3 :(得分:1)
即使我无法发表评论,也可以将其写成答案。 我不确定,让我分析潜在的原因 1)你说:“但它永远不会被召唤!不应该被召唤吗?” - 对于
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
要调用,在info.plist文件中,url方案应该正确设置,即转到URL类型 - > Item0 - > URL方案--->项目0这里的值应该是fbAPPID ie fb附加你的实际facebookappID [FacebookAppID也可能出现在info.plist中或硬编码在代码中]。
2)你说: “sessionStateChanged Callback总是以FBSessionStateClosedLoginFailed结束”
在sessionStateChanged切换方法中检查会话状态,如果创建或创建了TopLoaded,则尝试打开会话。
注意:[FBSession openActiveSessionWithPublishPermissions ....]这是一个静态方法将创建一个新会话并设置为FBSession.activeSession,其中openWithCompletionHandler是一个实例方法,只有在已经创建会话时才能工作。
case FBSessionStateCreated:
case FBSessionStateCreatedTokenLoaded:{
[session openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
//handle the updating of views according to the sate of session
}];
break;
答案 4 :(得分:0)
我同意JohnG的观点:
请注意,如果您在handleOpenURL:
内有多个案例,则可以过滤:
if ([sourceApplication isEqualToString:@"com.facebook.facebook"] ||
[sourceApplication isEqualToString:@"com.facebook.Facebook"]){
//Do Stuff
}
这很奇怪,但我能够在多个设备上复制sourceApplication
作为“Facebook”和“脸谱”回来。
答案 5 :(得分:0)
在FB SDK 3.5上,您可以使用以下命令终止令牌:
[[FBSessionTokenCachingStrategy defaultInstance] clearToken];