ios - 在 iOS 上使用现有 token 数据打开 FBSession

标签 ios facebook facebook-ios-sdk

我有一个后端服务,可以让我登录我的应用程序,并返回一个来自之前登录的扩展 facebook token ,可能来自另一台设备(因此没有凭证缓存在此设备上)。我想使用此 token 启动 Facebook session 。我正在使用类似的东西:

FBSession* session = [[FBSession alloc] initWithPermissions:@[@"publish_actions"]];
FBAccessTokenData* tokenData = 
[FBAccessTokenData createTokenFromString:token
                             permissions:@[@"publish_actions"]
                          expirationDate:nil
                               loginType:FBSessionLoginTypeTestUser
                             refreshDate:nil];


[session openFromAccessTokenData:tokenData completionHandler:nil];

为了清楚起见,我在这里传递“nil”,在我的代码中,我正在处理完成并登录返回的 session 对象,该对象似乎处于打开状态且没有错误。当我尝试使用 session 时,出现如下错误:

Error Domain=com.facebook.sdk Code=5 "The operation couldn’t be completed. (com.facebook.sdk error 5.)" UserInfo=0xb8b1680 {com.facebook.sdk:HTTPStatusCode=403, com.facebook.sdk:ParsedJSONResponseKey={
    body =     {
        error =         {
            code = 200;
            message = "(#200) The user hasn't authorized the application to perform this action";
            type = OAuthException;
        };
    };
    code = 403;
}, com.facebook.sdk:ErrorSessionKey=<FBSession: 0xa2b62a0, state: FBSessionStateOpen, loginHandler: 0xa29e9b0, appID: 131721883664256, urlSchemeSuffix: , tokenCachingStrategy:<FBSessionTokenCachingStrategy: 0xa273f60>, expirationDate: 4001-01-01 00:00:00 +0000, refreshDate: 2013-07-26 16:21:10 +0000, attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(
    email,
    "publish_actions"
)>}

有什么建议...?

最佳答案

我找到了一个解决方案:(前提是你有一个现有的 token )

首先将 FBSessionTokenCachingStrategy 类子类化为 MySessionTokenCachingStrategy 并覆盖以下方法:

- (FBAccessTokenData *)fetchFBAccessTokenData 
{
    NSMutableDictionary *tokenInformationDictionary = [NSMutableDictionary new];

    // Expiration date
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationExpirationDateKey"] = [NSDate dateWithTimeIntervalSinceNow: 3600];

    // Refresh date
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationRefreshDateKey"] = [NSDate date];

    // Token key
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationTokenKey"] = self.token;

    // Permissions
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationPermissionsKey"] = self.permissions;

    // Login key
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationLoginTypeLoginKey"] = @0;

    return [FBAccessTokenData createTokenFromDictionary: tokenInformationDictionary];
}

然后使用上面的类创建

MySessionTokenCachingStrategy* tokenCachingStrategy = 
[[MySessionTokenCachingStrategy alloc] initWithToken:token
                                      andPermissions:@[@"read_stream"]];



FBSession *session = [[FBSession alloc] initWithAppID: nil
                                          permissions: @[@"read_stream"]]
                                      urlSchemeSuffix: nil
                                   tokenCacheStrategy: tokenCachingStrategy];

    if (session.state == FBSessionStateCreatedTokenLoaded)
    {
        // Set the active session
        [FBSession setActiveSession: session];

        // Open the session, but do not use iOS6 system acount login
        // if the caching strategy does not store info locally on the
        // device, otherwise you could use:
        // FBSessionLoginBehaviorUseSystemAccountIfPresent
        [session openWithBehavior: FBSessionLoginBehaviorWithFallbackToWebView
                completionHandler: ^(FBSession *session,
                                     FBSessionState state,
                                     NSError *error) {
                    if (!error)
                    {
                        if (session.isOpen)
                        {
                            successBlock();
                        }
                    }
                    else
                    {
                        failureBlock([error description]);
                    }
                }];
    }

关于ios - 在 iOS 上使用现有 token 数据打开 FBSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17883028/

相关文章:

ios - UIButton 的 IB_DESIGNABLE 无法呈现实例

ios - 如何使用 facebook sdk 4.x 在 iOS 应用程序中以编程方式注销

ios - 使用 Facebook sdk 与 UIImage 分享图表故事

ios - 如何卸载 NSBundle?

iOS 无法从不同的 View Controller 向按钮添加操作

javascript - 检查页面加载时的 Facebook 登录状态

swift - 尝试获取用户电子邮件时的 FBSDKLoginManagerLoginResult valueForUndefinedKey

ios - 您如何打开一个 FBSession,其完成处理程序不会在每次 session 状态更改时被保留和调用?

ios - Facebook iOS SDK 3.0 贴墙

ios - .ondelete 带有部分的 SwiftUI 列表