如何取消之前的 Facebook 重新授权通话?

Posted

技术标签:

【中文标题】如何取消之前的 Facebook 重新授权通话?【英文标题】:How do I cancel a previous Facebook reauthorize call? 【发布时间】:2012-09-04 06:21:36 【问题描述】:

关于 ios 版 Facebook SDK 的简短问题。我正在尝试实现用户授予我的应用访问扩展权限的功能。

虽然当用户接受扩展权限请求(从用户被重定向到的 Facebook iOS 应用程序)时代码可以正常工作,但我无法检测到用户何时返回应用程序而没有接受权限,或单击取消然后返回应用程序。

如果我单击“取消”并将多任务返回应用程序,则不会记录任何内容,屏幕上也不会显示任何内容。当我再次尝试重新授权时,Facebook SDK 会抛出异常:

FBSession:在之前的重新授权调用尚未完成时重新授权无效。

虽然我可以捕捉到异常,但它仍然无济于事,因为我不知道如何停止之前的调用以允许用户再次尝试重新授权。

这是我目前正在使用的代码:

@try 
    [[FBSession activeSession] reauthorizeWithPermissions:[self requiredPermissions]
                                             behavior:FBSessionLoginBehaviorWithFallbackToWebView
                                    completionHandler:^(FBSession *session, NSError *error) 
        if (!error) 
            [self fetchUserPermissionsWithCompletionHandler:^(BOOL extendedGranted) 
                if (extendedGranted) 
                    [self setCanPostToActivityStream:YES];
                
            ];
        
        else 
            NSLog(@"%@", [error localizedDescription]);
        
    ];

@catch (NSException *exception) 
    NSLog(@"%@", exception);

现在,问题不在于上面的代码 - 代码运行良好。我再次遇到的问题是当用户在允许权限后未成功返回应用程序时取消 previous 重新授权调用。 Facebook SDK 本身似乎并没有以任何方式提醒应用程序这种情况。

【问题讨论】:

你是否清除了你上次的会话? 老Q,但是你在实现 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 吗? 是的,我正在实施。如果不实施,Facebook 登录将无法工作。如果用户取消重新授权这是一个真正的问题,Facebook SDK 不会实际通知我! 约翰·罗杰斯,你能解决这个问题吗?如果是这样,你能告诉我你是怎么做到的吗? 【参考方案1】:

从您的应用程序委托中,当调用- (void)applicationDidBecomeActive:(UIApplication*)application 时,您需要调用活动会话的handleDidBecomeActive 方法。执行此操作后,将调用与您的 reauthorizeWithPublishPermissions 调用关联的完成处理程序,并提供相应的错误。

- (void)applicationDidBecomeActive:(UIApplication*)application

    [[FBSession activeSession] handleDidBecomeActive];

【讨论】:

【参考方案2】:

您应该从 SDK 中看到来自重新授权完成处理程序的错误。


    "com.facebook.sdk:ErrorLoginFailedReason" = "com.facebook.sdk:ErrorReauthorizeFailedReasonUserCancelled";

我使用以下设置测试了类似的东西:Xcode 4.5、iOS 5、针对 m.facebook.com 授权。初始授权后,我输入代码以重新授权,然后单击取消并收到此错误。

    [FBSession.activeSession
     reauthorizeWithPublishPermissions:
     [NSArray arrayWithObject:@"publish_actions"]
     defaultAudience:FBSessionDefaultAudienceFriends
     completionHandler:^(FBSession *session, NSError *error) 
        if (!error) 
            // Success case
         else 
            // Check the error, info
            // [[error userInfo] objectForKey:@"com.facebook.sdk:ErrorLoginFailedReason"]
        
    ];

如果您没有看到此内容,则说明这是一个错误,您可能需要将其提交给 Facebook。

【讨论】:

嗨 C 阿伯纳西!如果我们使用 reauthorizeWithPermissions 请求更多权限,那么我们之前的会话是否过期?还是使用相同的令牌保持不变???我们是否需要重新评估 appDelegate.session 和 appDelegate.facebook.session?它显示的是权限 UI 中的“登录”按钮,而不是“允许”按钮。 上一个会话没有过期。您想使用具有新权限的更新会话,因此如果需要,请根据您的授权代码设置方式重新分配权限。

以上是关于如何取消之前的 Facebook 重新授权通话?的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 的 Sharekit(Graph API 版本)注销方法未完全注销或取消授权用户

如何检测用户何时从 Facebook 删除应用

Google OAuth2 是不是有取消授权回调?

Facebook的视频通话如何运作[关闭]

在 Parse ios SDK 中重新授权 Facebook 应用程序

设置API:wx.openSetting,wx.getSetting使用说明(示例:地图授权与取消授权后的重新授权)