0

現在、FacebookからのSSOログインを使用するアプリに取り組んでいます。iOS用の開発者向けWebサイトのチュートリアルに従いましたが、ログインおよびログアウトシステムが機能しています:)

ただし、アプリを起動するたびに、セッションは(もう)有効ではなく、アプリを承認するように求められます。アプリを閉じた後でもセッションが有効である可能性はありますか?それをどのように実装しますか?私はすでに次のコードを試しました:

// 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];
}

しかし、それでも私に承認を求めています。ユーザーがログインするたびに認証ウィンドウが表示されるのは非常に面倒です。誰かがこれについて考えを持っていますか?

前もって感謝します!

4

3 に答える 3

1

NSUserDefaultsに使用する文字列がそうでaccessTokenはないことnil、および正しく保存していることを確認してください。

于 2012-07-07T13:18:27.273 に答える
1

私は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ではこのゴミを出す必要はありません!

于 2012-07-07T13:20:39.687 に答える
1

エラーが見つかりました!

ログインすると、キーをとして保存しますFBAccessTokenKeyが、を読み込もうとしましたFBAccessToken

ちょっとばかげている、私は知っている;)今それは期待通りに働いている!

于 2012-07-07T13:55:28.410 に答える