実際の 'FBLoginView' を使用することに加えて、自分の設定 UI でユーザーに「ログイン済み」/「ログインしていない」メッセージを公開するため、ログイン状態を理解するのに役立つ、私が作成した Facebook ユーティリティ クラスを含めています。ユーザーが承認状態を切り替えることができるようになると、コンポーネント。
以下のコードは、このgistからも入手できます。
switch ステートメントですべてのFBSessionState
型を正しく解釈できていない可能性がありますが、これまでのところ、テストしたケースではうまく機能しています (これをまとめただけです)。
注意すべき重要なことは、他の人がほのめかしたことですが、キャッシュされた認証トークンをすぐに使用できない場合がありますが、Facebookopen
呼び出しを行うと、それを再利用可能 (更新) にすることができます。このオープン呼び出しは、UI をトリガーしたり、OAuth ウィンドウ/アプリの切り替えを妨げたりすることなく、舞台裏で機能します (キャッシュされたトークンがある場合)。
メソッドのコメントを参照してくださいisLoggedInAfterOpenAttempt
。状態を確認する方法に注意してください。FBSessionStateCreatedTokenLoaded
その後、呼び出しを行います
-openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error)
.
このクラスに関するその他の情報:
- ここには、protocol に準拠するタイプの、ログインしているユーザーをキャッシュするためのプロパティがあります
FBGraphUser
。ただし、ここで説明するログイン方法では使用されません。
- Facebook SDK 3.0 for iOS のサンプル コードでは、単純なアプリ以上のものがある場合、これらの種類の操作を保持して管理する独自のクラスを構築することを提案しています。以下の私のこのクラスは、私のアプリのアイデアの始まりです。
- これを機能させるには、'log4Info' および 'log4Debug' マクロを NSLog に置き換えることができます。
#import "UWFacebookService.h"
@implementation UWFacebookService
// 静的
static const int ddLogLevel = LOG_LEVEL_DEBUG;
// 強い
@synthesize facebookGraphUser = _facebookGraphUser;
#pragma mark - お問い合わせ
- (BOOL)isSessionStateEffectivelyLoggedIn:(FBSessionState)state {
BOOL effectiveLoggedIn;
スイッチ (状態) {
ケース FBSessionStateOpen:
log4Info(@"Facebook セッション状態: FBSessionStateOpen");
効果的にLoggedIn = YES;
壊す;
ケース FBSessionStateCreatedTokenLoaded:
log4Info(@"Facebook セッション状態: FBSessionStateCreatedTokenLoaded");
効果的にLoggedIn = YES;
壊す;
ケース FBSessionStateOpenTokenExtended:
log4Info(@"Facebook セッション状態: FBSessionStateOpenTokenExtended");
効果的にLoggedIn = YES;
壊す;
デフォルト:
log4Info(@"Facebook セッション状態: オープンまたはオープン可能なタイプのいずれでもない。");
効果的にLoggedIn = NO;
壊す;
}
効果的にLoggedInを返します。
}
/**
* Facebook セッションが承認済みの状態であるかどうかを判断します。キャッシュされている場合は、まだ開く必要がある場合があります
* トークンですが、この呼び出しの目的は、ユーザーが許可されているかどうか、少なくとも許可されていないかどうかを判断することです。
*明示的に何かを尋ねました。
*/
- (BOOL)isLoggedIn {
FBSession *activeSession = [FBSession activeSession];
FBSessionState 状態 = activeSession.state;
BOOL isLoggedIn = activeSession && [self isSessionStateEffectivelyLoggedIn:state];
log4Info(@"Facebook のアクティブなセッションの状態: %d; ログに記録された結論: %@", state, (isLoggedIn ? @"YES" : @"NO"));
isLoggedIn を返します。
}
/**
* 有効なトークンが読み込まれている場合 (おそらくバックグラウンドで更新が必要)、Facebook セッションを静かに開こうとします。
* その試行の後、セッションが有効な許可された状態の 1 つにあるという基本概念に従います。
*/
- (BOOL)isLoggedInAfterOpenAttempt {
log4Debug(@"FBSession.activeSession: %@", FBSession.activeSession);
// キャッシュされたトークンがない場合、ここで open を呼び出すと、UX がログインに
// 発生する; ユーザーが [設定] でログイン ボタンをクリックしない限り、それが発生することは望ましくありません。
// ここで、open を呼び出す前にトークンがあることを確認します
if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) {
log4Info(@"キャッシュされたトークンがあるため、ユーザーのログインを再確立します。");
// キャッシュされたトークンがあったとしても、セッションを使用可能にするためにログインする必要があります:
[FBSession.activeSession openWithCompletionHandler:^(FBSession *セッション、FBSessionStateステータス、NSError *エラー) {
log4Info(@"ログイン セッションの開始が完了しました。状態: %d", status);
}];
}
そうしないと {
log4Info(@"アクティブなセッションは状態 'FBSessionStateCreatedTokenLoaded' ではありませんでした。状態は %d です", FBSession.activeSession.state);
}
[自分はログインしています]を返します。
}
@終わり