19

facebook-ios-sdk の README で説明されているように、私のアプリは API 呼び出しを実行する前に Facebook#authorize:delegate: を呼び出します。

この方法では、ユーザーが (Facebook アプリまたは Safari で) 認証する必要があり、その後、制御を iPhone アプリに戻します。問題は、メソッドを呼び出すたびにユーザーに認証を求めることです。アプリに既に許可を与えている場合は、アプリが既に承認されていることを示すメッセージが表示され、アプリに戻るには [OK] を押す必要があります。とてもプロフェッショナルに見えません。

だから私は2つの質問があります:

  1. ユーザーは Facebook の呼び出しを行うために常に再認証する必要がありますか? アクセストークンをどこかに、おそらくユーザーのデフォルトに保存して、再認証する必要がないように常に考えていました。

  2. ユーザーが毎回再認証する必要がない場合、ユーザーがそのメッセージを見て [OK] を押す必要がないように、アプリに既にアクセス許可があるかどうかを確認する方法はありますか?

4

5 に答える 5

23

Facebook SDK が自動的に処理しないのは残念です。自分で SDK に組み込む以外に、最も簡単な方法は次のとおりです。

_facebook を割り当てるたびに:

_facebook = [[Facebook alloc] initWithAppId:@"SuperDuperAppID"];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *accessToken = [prefs stringForKey:@"facebook-accessToken"];
NSString *expirationDate = [prefs stringForKey:@"facebook-expirationDate"];
_facebook.accessToken = accessToken;
_facebook.expirationDate = expirationDate;

NSUserDefaults に何も保存していない場合は、nil 値が設定されます。何も起こらなかった。それ以外の場合は、真の値が設定され、[_facebook isSessionValid];適切な値を示す TRUE を返す必要があります。先に進んで、ログインしているかのように Facebook SDK 呼び出しを行います (ログインしている)。false の場合は、呼び出します

[facebook authorize:permissions delegate:self]; 

いつものように。

次に、次の Facebook デリゲート メソッドがサポートされていることを確認します。

- (void)fbDidLogin {
NSString *accessToken = _facebook.accessToken;
NSString *expirationDate = _facebook.expirationDate;
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:accessToken forKey:@"facebook-accessToken"];
[prefs expirationDate forKey:@"facebook-expirationDate"];
[prefs synchronize];
}

このコードをアプリで使用していますが、完全に機能します。記憶で作ったのでコピペでうまくいかなかったらすみません。どこかにタイプミスがあり、メモリ管理が不適切である可能性があります。オフライン許可を取得しない限り、アクセス トークンの有効期限が切れることを忘れないでください。いずれにせよ、上記のコードはすべてを処理します。

于 2011-04-21T19:53:13.737 に答える
6

問題は、メソッドを呼び出すたびにユーザーに認証を求めることです。アプリに既に許可を与えている場合は、アプリが既に承認されていることを示すメッセージが表示され、アプリに戻るには [OK] を押す必要があります。

1) ユーザーは、Facebook の呼び出しを行うために常に再認証する必要がありますか? アクセストークンをどこかに、おそらくユーザーのデフォルトに保存して、再認証する必要がないように常に考えていました。

毎回サインオン プロセスを実行する必要があるのは、最初のサインオンに成功した後、Facebook SDK が永続的な方法でアクセス トークンを保存しないためです。

2) ユーザーが毎回再認証する必要がない場合、アプリに既にアクセス許可があるかどうかを確認する方法があるので、ユーザーはそのメッセージを表示して [OK] を押す必要はありませんか?

Facebook SDK がアクセス トークンを保存しないという事実は、自分でそれを行うことができないという意味ではありません。次のコードは、NSUserDefaults からアクセス トークンを保存/取得する方法を示しています。

-(void)login {
    // on login, use the stored access token and see if it still works
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    facebook.accessToken = [defaults objectForKey:ACCESS_TOKEN_KEY];
    facebook.expirationDate = [defaults objectForKey:EXPIRATION_DATE_KEY];

    // only authorize if the access token isn't valid
    // if it *is* valid, no need to authenticate. just move on
    if (![facebook isSessionValid]) {
        NSArray * permissions = [NSArray arrayWithObjects:@"read_stream", @"offline_access", @"email", nil];
        [facebook authorize:permissions delegate:self];
    }
}

/**
 * Called when the user has logged in successfully.
 */
- (void)fbDidLogin {
    // store the access token and expiration date to the user defaults
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:facebook.accessToken forKey:ACCESS_TOKEN_KEY];
    [defaults setObject:facebook.expirationDate forKey:EXPIRATION_DATE_KEY];
    [defaults synchronize];
}
于 2011-04-21T20:53:25.560 に答える
4

ユーザーがログインすると、アクセス トークンと有効期限が表示されます。アクセス トークンを保存すると、有効期限がまだ切れていない限り再利用できます。Facebook SDK には、このチェックを行うメソッド [fbConnect isSessionValid] がありますが、誤検知が発生する場合があるため、リクエストが失敗した場合はユーザーにログインさせます。

于 2011-04-06T19:37:53.327 に答える
2

1) いいえ、Facebook *fbConnect = [[Facebook alloc] init]; [fbConnect logout:self];ユーザー セッションを削除する必要がありました

2)アクセストークンを呼び出してFacebook.m確認できると思います

于 2011-04-06T19:32:56.570 に答える