Ios Facebook会话在关闭应用程序后无效

Ios Facebook会话在关闭应用程序后无效,ios,facebook,single-sign-on,Ios,Facebook,Single Sign On,我目前正在开发一个应用程序,它使用来自Facebook的SSO登录。我已经在他们的iOS开发者网站上学习了教程,现在我有了一个有效的登录和注销系统:) 但是,每次我启动应用程序时,会话都无效(不再),它要求我授权应用程序。即使在我关闭应用程序后,会话是否可能保持有效?我将如何实现这一点?我已经尝试了以下代码: // Restore previously saved Facebook credentials (If any) delegate.facebook.accessToken = [

我目前正在开发一个应用程序,它使用来自Facebook的SSO登录。我已经在他们的iOS开发者网站上学习了教程,现在我有了一个有效的登录和注销系统:)

但是,每次我启动应用程序时,会话都无效(不再),它要求我授权应用程序。即使在我关闭应用程序后,会话是否可能保持有效?我将如何实现这一点?我已经尝试了以下代码:

// Restore previously saved Facebook credentials (If any)
delegate.facebook.accessToken    = [[NSUserDefaults standardUserDefaults] stringForKey:@"FBAccessToken"];
delegate.facebook.expirationDate = (NSDate *) [[NSUserDefaults standardUserDefaults] objectForKey:@"FBExpirationDate"];

// Trigger SSO Facebook authentication if required
if ([delegate.facebook isSessionValid] == NO) {
    [delegate.facebook authorize:nil];
} else {
    [self fbLoginWithUsername:username andPassword:password];
}
但它仍然要求我授权。用户每次登录时都会看到授权窗口,这非常烦人。有人对此有想法吗


提前谢谢

确保用于
accessToken
NSUserDefaults
字符串不是
nil
并且正确保存。

确保用于
accessToken
NSUserDefaults
字符串不是
nil
并且正确保存。

我更愿意扩展它Facebook类具有单例样式类别,并实现:

static Facebook *shared = nil;

    + (Facebook *)shared {
        @synchronized(self) {
            if(shared == nil)
                shared = [[self alloc] init];
        }
        return shared;
    }

    - (id)init {
        if ((self = [self initWithAppId:kFacebookAppID andDelegate:self])) {
            [self addSessionData];
        }
        return self;
    }

    -(void)addSessionData{
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        if ([defaults objectForKey:kFBAccessTokenKey] && [defaults objectForKey:kFBExpirationDateKey]) {
            self.accessToken = [defaults objectForKey:kFBAccessTokenKey];
            self.expirationDate = [defaults objectForKey:kFBExpirationDateKey];
        }
    }

    - (void)authorize {

        if (![self isSessionValid]) {
            NSArray *permissions =  [NSArray arrayWithObjects:@"email", @"user_about_me", nil];
            [self authorize:permissions];
        }
    }

    - (void)fbDidLogin {

        NSLog(@"User is logged in to Facebook");

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:[self accessToken] forKey:kFBAccessTokenKey];
        [defaults setObject:[self expirationDate] forKey:kFBExpirationDateKey];
        [defaults synchronize];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"FBDidLogin" object:self];
    }

    - (void)fbDidNotLogin:(BOOL)cancelled {

        if (cancelled) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"FBLoginCancelled" object:self];
        } else {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"FBLoginFailed" object:self];
        }

        [[NSNotificationCenter defaultCenter] postNotificationName:@"FBDidNotLogin" object:self];
    }

    - (void)fbDidLogout {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults removeObjectForKey:kFBAccessTokenKey];
        [defaults removeObjectForKey:kFBExpirationDateKey];
        [defaults synchronize];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"FBDidLogout" object:self];
        NSLog(@"Logged out of Facebook");
    }

    - (void)fbDidExtendToken:(NSString*)accessToken expiresAt:(NSDate*)expiresAt{
        NSLog(@"Facebook access token extended");
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:accessToken forKey:kFBAccessTokenKey];
        [defaults setObject:expiresAt forKey:kFBExpirationDateKey];
        [defaults synchronize];
    }


    - (void)fbSessionInvalidated{

    }

我知道代码是有效的。幸运的是,我们不必在iOS6中做这些垃圾

我更喜欢使用单例风格的类别扩展Facebook类,并实现:

static Facebook *shared = nil;

    + (Facebook *)shared {
        @synchronized(self) {
            if(shared == nil)
                shared = [[self alloc] init];
        }
        return shared;
    }

    - (id)init {
        if ((self = [self initWithAppId:kFacebookAppID andDelegate:self])) {
            [self addSessionData];
        }
        return self;
    }

    -(void)addSessionData{
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        if ([defaults objectForKey:kFBAccessTokenKey] && [defaults objectForKey:kFBExpirationDateKey]) {
            self.accessToken = [defaults objectForKey:kFBAccessTokenKey];
            self.expirationDate = [defaults objectForKey:kFBExpirationDateKey];
        }
    }

    - (void)authorize {

        if (![self isSessionValid]) {
            NSArray *permissions =  [NSArray arrayWithObjects:@"email", @"user_about_me", nil];
            [self authorize:permissions];
        }
    }

    - (void)fbDidLogin {

        NSLog(@"User is logged in to Facebook");

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:[self accessToken] forKey:kFBAccessTokenKey];
        [defaults setObject:[self expirationDate] forKey:kFBExpirationDateKey];
        [defaults synchronize];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"FBDidLogin" object:self];
    }

    - (void)fbDidNotLogin:(BOOL)cancelled {

        if (cancelled) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"FBLoginCancelled" object:self];
        } else {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"FBLoginFailed" object:self];
        }

        [[NSNotificationCenter defaultCenter] postNotificationName:@"FBDidNotLogin" object:self];
    }

    - (void)fbDidLogout {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults removeObjectForKey:kFBAccessTokenKey];
        [defaults removeObjectForKey:kFBExpirationDateKey];
        [defaults synchronize];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"FBDidLogout" object:self];
        NSLog(@"Logged out of Facebook");
    }

    - (void)fbDidExtendToken:(NSString*)accessToken expiresAt:(NSDate*)expiresAt{
        NSLog(@"Facebook access token extended");
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:accessToken forKey:kFBAccessTokenKey];
        [defaults setObject:expiresAt forKey:kFBExpirationDateKey];
        [defaults synchronize];
    }


    - (void)fbSessionInvalidated{

    }
我知道代码是有效的。幸运的是,我们不必在iOS6中做这些垃圾

我发现了我的错误

登录时,我将密钥保存为
FBAccessTokenKey
,但我尝试读取
FBAccessToken

有点愚蠢,我知道;)现在它正在按预期工作

我发现了我的错误

登录时,我将密钥保存为
FBAccessTokenKey
,但我尝试读取
FBAccessToken


有点愚蠢,我知道;)现在它正在按预期工作

是的,子类化Facebook类并将其作为一个单例使用确实比在应用程序委托中使用Facebook对象要好。当我解决了最初的问题后,我将尝试实现这一点!好。。。你必须使用facebook ios sdk,除非你只想支持ios 6Yeah,将facebook类子类化并将其作为一个单例使用确实比在应用程序委托中使用facebook对象要好。当我解决了最初的问题后,我将尝试实现这一点!好。。。除非您只想支持ios 6My,否则您必须使用facebook ios sdk。当我将其保存为NSUserDefault时,accessToken不是nil。保存之后,我使用[Default synchronize]。这怎么会错呢?当我将accessToken保存到NSUserDefaults时,它不是零。保存之后,我使用[Default synchronize]。这怎么会错呢?这应该是一个评论。所以我的答案是正确的。。。请将其标记为选中以接受答案。这应该是一个注释。所以我的答案是正确的。。。请将其标记为选中以接受答案。