私のアプリにFacebookを統合したいので、新しいFacebook SDK v.4.1.0をダウンロードします。Facebookのログインボタンには、Swiftのコードの下にあるFBSDKLoginButton
のクラスを使用します。
if (FBSDKAccessToken.currentAccessToken() != nil)
{
// User is already logged in, do work such as go to next view controller.
// Or Show Logout Button
let loginView : FBSDKLoginButton = FBSDKLoginButton()
self.view.addSubview(loginView)
loginView.center = self.view.center
loginView.readPermissions = ["public_profile", "email", "user_friends"]
loginView.delegate = self
self.returnUserData()
}
else
{
let loginView : FBSDKLoginButton = FBSDKLoginButton()
self.loginButtonDidLogOut(loginView)
self.view.addSubview(loginView)
loginView.center = self.view.center
loginView.readPermissions = ["public_profile", "email", "user_friends"]
loginView.delegate = self
}
}
上記のコードのように、「Facebookでログイン」ボタンが表示されます。
ログインに成功したら、ログアウトボタンを表示します。ログアウトボタンをクリックすると、そのデリゲートが呼び出されます-デリゲートクラスFBSDKLoginButtonDelegate
ログアウトのデリゲートメソッド:
func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
println("User Logged Out")
FBSDKAccessToken.setCurrentAccessToken(nil)
FBSDKProfile.setCurrentProfile(nil)
let manager = FBSDKLoginManager()
manager.logOut()
}
デリゲートでは、私は明確なトークンであり、FBSDKLoginManager
のクラス内のログアウト機能とも呼ばれます。しかし、毎回ユーザーの承認された画面を取得します。別のユーザーがFacebookでログインできないように、ログイン画面を取得しません。ブラウザの履歴をクリアする必要があるたびに。
明確なブラウザ履歴がないと、ログインページが表示されないため、他のユーザーはログインできません。
Qusetion: Facebookバグ
ログアウト後の毎回の表示画面:
私も同じ場所で行き詰まっています。しかしサーフィンは次の結論に達しました。
最初にSingleSignOnの意味を知らせます:
シングルサインオン(SSO)は、複数の関連する独立したソフトウェアシステムのアクセス制御のプロパティです。このプロパティを使用すると、ユーザーは一度ログインすると、各システムで再度ログインするように求められることなく、すべてのシステムにアクセスできます。
ログアウトしたのに、再度ログインを求められないのはなぜですか?これは、シミュレーターで資格情報がSafariに保存されているためです(Facebookのログインを使用して初めて、アプリがSafariまたはFacebookアプリがインストールされている場合は開きます)。
「あなたはすでに認証されています...」というメッセージを確認できる情報はFacebookにあります。アプリから権限を取り消すには、グラフAPIをタップする必要があります。 https://developers.facebook.com/docs/reference/api/user/ の「削除」セクションにあるFBドキュメント
ログインの取り消し
また、このGraph APIエンドポイントを呼び出すことにより、アプリの完全な認証を解除したり、ログインを取り消したりすることができます:DELETE/{user-id}/permissions
例:Swift:
let deletepermission = FBSDKGraphRequest(graphPath: "me/permissions/", parameters: nil, HTTPMethod: "DELETE")
deletepermission.startWithCompletionHandler({(connection,result,error)-> Void in
println("the delete permission is \(result)")
})
しかし、ユーザーが資格情報を再入力するように求められるように、アプリから完全にログアウトするには、以下を参照してください:
facebookアプリからログアウトする必要があります。その後、本当にログアウトされ、アプリのみが再度資格情報を要求します。これは、電話のどこにもログインしていないためです。したがって、SSOルールはここには適用されません。アプリからのみログアウトしている場合(fbではなく)、safariからログインしているためログに記録されます。そのため、このアプリに対して既に承認されていることを示す同じメッセージが表示されます。
資格情報を初めて挿入するときにシミュレータでテストしてみてください。その後、Safariが開き、入力した資格情報がSafariに保存されます。したがって、次回ログアウトしてログインアプリを実行しても、資格情報は要求されません.safariが提供するため(または、そこに資格情報を入力した場合はFacebookアプリ)
これで、Safariを開いてFacebookを開きます。 Facebookがすでに開いており、Safariから自動的に取得する情報、またはそこからFacebookアプリがインストールされている場合に表示されます。そのため、Safariからログアウトし、アプリを再度開いてログアウトすると、アプリは資格情報を再度尋ねます
この回答は、根本原因の問題を特定するのに役立ちました。 2つのキーはSSOとSafariです。 FacebookはFacebookログインプロセスの文書化が不十分です。 SSOをオフにする必要がありました。これは、アプリが登録されているFacebook開発者サイトの[設定]にあります。しかし、より重要なのは、SafariではなくUIWebViewを使用するようにFBLoginManagerの動作を変更する必要があったことです。私はこれを次のスニペットで行いました:
FBSDKLoginManager *loginMgr = [[FBSDKLoginManager alloc] init];
loginMgr.loginBehavior = FBSDKLoginBehaviorWeb;
デフォルトの動作を使用する場合、FacebookアプリまたはブラウザーのSafariを介して、アプリから直接ではなく、ログアウトを管理します。 FBSDKLoginBehaviorWebは、ポップアップでiOS UIWebViewを使用します。これは完全に機能し、ログアウト後に毎回資格情報が必要になります。