代码之家  ›  专栏  ›  技术社区  ›  inorganik

facebook-FBSessionState常量的问题

  •  0
  • inorganik  · 技术社区  · 10 年前

    我正在开发一个使用Facebook登录和共享的iOS应用程序。这需要检查各个位置的活动会话状态。

    Facebook提供的代码检查当前状态并决定是否打开新会话。然而,记录会话状态表明它可能是打开的,即使与FBSessionState常量的比较可能表明它是关闭的。

    例如,使用以下代码(facebook的),即使我的会话状态记录为 1 ,也不等于 FBSessionStateOpen FBSessionStateOpenTokenExtended ,并打开了一个新会话。

    NSLog(@"facebook session state: %lu", FBSession.activeSession.state);
    // log shows 1
    
    if (FBSession.activeSession.state == FBSessionStateOpen
        || FBSession.activeSession.state == FBSessionStateOpenTokenExtended) {
    
        NSLog(@"facebook session already open");
        // do stuff...
    
    } else {
        // new session opened anyway
        NSLog(@"open new facebook session");
        /* code to open a session omitted here
        ...
        */
    }
    

    尽管恒定的定义显示 1 = FBSessionStateOpen .

    FBSession.h:

    typedef NS_ENUM(NSUInteger, FBSessionState) {
    /*! One of two initial states indicating that no valid cached token was found */
    FBSessionStateCreated                   = 0,
    /*! One of two initial session states indicating that a cached token was loaded;
     when a session is in this state, a call to open* will result in an open session,
     without UX or app-switching*/
    FBSessionStateCreatedTokenLoaded        = 1,
    /*! One of three pre-open session states indicating that an attempt to open the session
     is underway*/
    FBSessionStateCreatedOpening            = 2,
    
    /*! Open session state indicating user has logged in or a cached token is available */
    FBSessionStateOpen                      = 1 | FB_SESSIONSTATEOPENBIT,
    /*! Open session state indicating token has been extended, or the user has granted additional permissions */
    FBSessionStateOpenTokenExtended         = 2 | FB_SESSIONSTATEOPENBIT,
    
    /*! Closed session state indicating that a login attempt failed */
    FBSessionStateClosedLoginFailed         = 1 | FB_SESSIONSTATETERMINALBIT, // NSError obj w/more info
    /*! Closed session state indicating that the session was closed, but the users token
     remains cached on the device for later use */
    FBSessionStateClosed                    = 2 | FB_SESSIONSTATETERMINALBIT, // "
    };
    

    这是一个bug还是facebook的代码真的应该打开一个新的会话?我应该与 int 状态值而不是常量?为什么记录的值与常量不一致?

    …此外,记录状态 之后 状态被重新打开,它记录为513或514,这与任何常数都不一致。

    1 回复  |  直到 10 年前
        1
  •  0
  •   inorganik    10 年前

    根据常数的typedef枚举 1 FBSessionStateCreatedTokenLoaded 。注释中表示“两个初始会话状态之一,表示缓存令牌已加载;当会话处于此状态时,调用open*将导致打开会话,而无需用户体验或应用程序切换”。

    因此,我采纳了这一建议,该解决方案运行良好,会话在没有用户体验或应用程序切换的情况下打开:

        if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) {
            NSLog(@"fb session state created token loaded.");
            [FBSession.activeSession openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
                if (FBSession.activeSession.state == FBSessionStateOpen) {
                    // do stuff
                }
            }];
        }
        else if (FBSession.activeSession.state == FBSessionStateOpen
            || FBSession.activeSession.state == FBSessionStateOpenTokenExtended) {
            NSLog(@"fb session already open");
            // do stuff
    
        } else {
            NSLog(@"open new facebook session");
            // open new session...
        }