在iOS应用中处理多个Facebook用户登录

 小晶晶妮妮宝贝 发布于 2023-02-10 08:13

我有一个可以拥有多个用户的iOS应用程序,我想将Facebook集成到其中.我想缓存每个用户的登录凭据.用户将拥有应用程序登录,因此每个用户只能使用自己的Facebook信用卡.Facebook的文档声明您可以通过在此处覆盖FBSessionTokenCachingStrategy对象来管理多个用户的会话令牌:

https://developers.facebook.com/docs/ios/login-tutorial/

我正在使用本地缓存方法,我让它在用户登录我的应用程序的地方工作,然后如果他们有相关的Facebook令牌,我将它们登录到那里会话.否则,我提示他们使用Facebook的API输入Facebook凭据,将用户重定向到Facebook网页登录页面.

[FBSession openActiveSessionWithReadPermissions:@[@"basic_info"]
                                   allowLoginUI:YES
                              completionHandler:
 ^(FBSession *session, FBSessionState state, NSError *error)
 {
     [self loginToFacebookEnd:session state:state error:error];
 }];

上述方法适用于第一用户.登录的第二个用户按预期重定向到Facebook Web登录页面,但第一个用户现在通过safari登录,第二个用户现在使用第一个用户凭据登录.

我希望能够让用户不必登录safari,或者能够使用嵌入式Web对话框之类的东西.然而,根据Facebook API文档,嵌入式对话框似乎不允许我在应用重启后加载用户令牌:

https://developers.facebook.com/docs/ios/login-tutorial/#control

"嵌入式WebView登录对话框的缺点:人们每次通过登录流程时都必须填写登录凭据."

此外,从嵌入式WebView保存令牌时,调用以下方法会清除我的令牌缓存:

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

有没有人知道如何支持多个用户从iOS应用程序登录Facebook而没有第一个用户的凭据在Safari中缓存?

更新1

好的,我知道现在可以使用Embedded WebView处理多个用户,因为Facebook包含的示例程序之一(SwitchUserSample)就是这样做的.加载我的FBSession似乎有些问题,因为很多值都是null,尽管我调用的代码与示例完全相同.有谁知道会导致会话恢复的原因如下:

, expirationDate: (null), refreshDate: (null), attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(null)>

如果我使用除FBSessionLoginBehaviorForcingWebView之外的任何行为,那么我将此作为我的反序列化标记:

, expirationDate: 2014-02-15 20:01:50 +0000, refreshDate: 2013-12-17 20:01:51 +0000, attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(
    "user_birthday",
    "user_friends"
)>

更新2

我已经确定它肯定与我的令牌被缓存的方式有关.我已经复制了Facebook示例正在使用的方法,但我仍然在FBSession中获取我的日期的空值.以下是我调用的缓存方法:

+ (FBSessionTokenCachingStrategy*)createCachingStrategyForSlot:(int)slot {
    FBSessionTokenCachingStrategy *tokenCachingStrategy = [[FBSessionTokenCachingStrategy alloc]
                                                           initWithUserDefaultTokenInformationKeyName:[NSString stringWithFormat:@"SUUserTokenInfo%d", slot]];
    return tokenCachingStrategy;
}

+ (FBSession*)createSessionForSlot:(int)slot {
    FBSessionTokenCachingStrategy *tokenCachingStrategy = [self createCachingStrategyForSlot:slot];
    FBSession *session = [[FBSession alloc] initWithAppID:nil
                                              permissions:@[@"basic_info",@"user_birthday"]
                                          urlSchemeSuffix:nil
                                       tokenCacheStrategy:tokenCachingStrategy];
    return session;
}

以下是我如何称呼它:

+ (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI
{
    BOOL openSessionResult = NO;    
    FBSession *session = [self createSessionForSlot:1];

    // If showing the login UI, or if a cached token is available, then open the session.
    if (allowLoginUI || session.state == FBSessionStateCreatedTokenLoaded)
    {
        // For debugging purposes log if cached token was found
        if (session.state == FBSessionStateCreatedTokenLoaded)
        {
            NSLog(@"Cached token found.");
        }

        // Set the active session
        [FBSession setActiveSession:session];

        // If the session state is not any of the two "open" states when the button is clicked
        if (FBSession.activeSession.state != FBSessionStateOpen && FBSession.activeSession.state != FBSessionStateOpenTokenExtended)
        {
            // Open the session.
            [session openWithBehavior:FBSessionLoginBehaviorForcingWebView
                    completionHandler:^(FBSession *session,
                                        FBSessionState state,
                                        NSError *error)
             {
                 [SocialInteraction loginToFacebookEnd:session state:state error:error];
             }];
        }

        // Return the result - will be set to open immediately from the session
        // open call if a cached token was previously found.
        openSessionResult = session.isOpen;
    }
    return openSessionResult;
}

令人沮丧的是,如果我将登录行为从FBSessionLoginBehaviorForcingWebView更改为FBSessionLoginBehaviorWithFallbackToWebView,则令牌正确加载!但是,这种行为对我的应用程序不起作用.必须有一些我错过的其他设置,让嵌入式WebView缓存其令牌.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有