Facebook sdk v4.0を更新しました
カスタムログインUIの使用 のチュートリアルに従って
-(IBAction)facebookLoginClick:(id)sender {
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
if (error) {
// Process error
} else if (result.isCancelled) {
// Handle cancellations
} else {
// If you ask for multiple permissions at once, you
// should check if specific permissions missing
if ([result.grantedPermissions containsObject:@"email"]) {
// Do work
}
}
}];
}
しかし、結果は常にnilであり、エラーコードは304です私は何かを見逃していますか?
同様の問題がありました。
FBSDKLoginManager
を初期化した後、データと(Facebook)トークンを消去する行を追加しました。
FBSDKLoginManager *loginmanager= [[FBSDKLoginManager alloc]init];
[loginmanager logOut];
お役に立てれば。
したがって、OPが尋ねるとおり、「何かが足りないのですか?」
はい、どこでも見られる次の標準的なコード例は、単に間違っています。
-(IBAction)facebookLoginClick:(id)sender
{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
---- ONE MAGIC LINE OF CODE IS MISSING HERE ----
[login logInWithReadPermissions:@[@"email"]
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
{
if (error) {...}
else if (result.isCancelled) {...}
else { // (NB for multiple permissions, check every one)
if ([result.grantedPermissions containsObject:@"email"])
{ NSLog(@"%@",result.token); }
}
}];
}
あなたはこれをしなければなりません:
-(IBAction)facebookLoginClick:(id)sender
{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logOut]; //ESSENTIAL LINE OF CODE
[login logInWithReadPermissions:@[@"email"]
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
{
if (error) {...}
else if (result.isCancelled) {...}
else { // (NB for multiple permissions, check every one)
if ([result.grantedPermissions containsObject:@"email"])
{ NSLog(@"%@",result.token); }
}
}];
}
それ以外の場合、非常に単純に、アプリ動作しませんユーザーがデバイスでFBアカウントの変更に遭遇した場合。 (何らかの理由でアプリを再インストールしない限り!)
もう一度-ユーザーがFBアカウントを変更した場合、上記の一般的なサンプルコード単に機能しない(アプリは無限ループに入ります)。 logOut
呼び出しを行う必要があります。
これは、Info.plistファイル内のFacebook AppIDをテストFacebookアプリから本番Facebookアプリに切り替えたときに起こりました。たとえば、アプリがFacebookトークンをJWTを生成するサーバーに送信する場合、Facebook SDKは、削除するように指示されない限り、fbToken(FBSDKAccessToken.currentAccessToken()
)を永続化します。ユーザーがアプリからログアウトすると、実稼働環境でも発生する可能性があります。ログアウトAPIリクエストによりユーザーがログアウトされ、JWTがリセットされます。ただし、ログアウトAPIリクエストを送信する前であっても、クライアントはFBSDKLoginManager
インスタンスにログアウトするよう指示する必要があります。
if let currentAccessToken = FBSDKAccessToken.currentAccessToken() where currentAccessToken.appID != FBSDKSettings.appID()
{
loginManager.logOut()
}
IOSアプリの実行中にXcodeでFBアプリの詳細を変更すると、これが発生しました。デバイスからアプリを削除してから、新しいFBアプリのセットアップで再公開する必要があります。古いFB設定をクリアするには、再コンパイルするだけでは不十分です。
Swift 3.
func loginWithFacebook
{
let loginManager = FBSDKLoginManager()
if let currentAccessToken = FBSDKAccessToken.current(), currentAccessToken.appID != FBSDKSettings.appID()
{
loginManager.logOut()
}
loginManager.logIn(withReadPermissions: ["public_profile","email"], from: self, handler: { (result, error) in
if error != nil {
print("error\(String(describing: error))")
}
else if (result?.isCancelled)! {
}
else {
print(FBSDKAccessToken.current())
}
})
}
次のコードを使用して問題を解決できます。
[FBSDKAccessToken refreshCurrentAccessToken:^(FBSDKGraphRequestConnection *connection, id result, NSError *error){}
Swift 4.0、4.2、5.
FBSDKLoginManager().logOut()
ドキュメントによると、304 FBSDKLoginUserMismatchErrorCode
"ユーザーが変更されたために新しい権限を要求できないことを示します"。
前述の@ Adrian999のシナリオでは意味があります。
実際、その理由は非常に単純です。次の手順を試して、このエラーコードを簡単に再現できます。
「Facebookログイン失敗」には2つの理由があります。
- facebookからユーザー情報を取得できません。
- facebookの成功からユーザー情報を取得しますが、自分のサーバーへのアップロードは失敗します。
FBSDKLoginManager.m
のコードは次のとおりです。
- (void)validateReauthentication:(FBSDKAccessToken *)currentToken withResult:(FBSDKLoginManagerLoginResult *)loginResult
{
FBSDKGraphRequest *requestMe = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me"
parameters:nil
tokenString:loginResult.token.tokenString
HTTPMethod:nil
flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery];
[requestMe startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
NSString *actualID = result[@"id"];
if ([currentToken.userID isEqualToString:actualID]) {
[FBSDKAccessToken setCurrentAccessToken:loginResult.token];
[self invokeHandler:loginResult error:nil];
} else {
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
[FBSDKInternalUtility dictionary:userInfo setObject:error forKey:NSUnderlyingErrorKey];
NSError *resultError = [NSError errorWithDomain:FBSDKLoginErrorDomain
code:FBSDKLoginUserMismatchErrorCode
userInfo:userInfo];
[self invokeHandler:nil error:resultError];
}
}];
}
currentToken.userID
がactualID
と等しくない場合、FBSDKLoginUserMismatchErrorCode
はスローされます。
これで、ユーザーAのログインFacebookが失敗するとこの問題が再び発生しますが、失敗後に[FacebookSDKManager logOut]
がない場合、アプリはユーザーAのaccessTokenをキャッシュし、ユーザーAはFacebookアカウントをユーザーBに変更します。ユーザーBのログインFacebookに再度ログインすると、この問題が再び表示されます。
私もしばらくの間、この問題にこだわっていました。次に、.hファイルと.mファイルのviewDidLoadでFBSDKLoginManagerのオブジェクトを作成し、それを初期化してログアウトプロパティを設定します。
_fbLogin= [[FBSDKLoginManager alloc]init];
[_fbLogin logOut];
これは私を助け、あなたも助けてくれることを願っています。ではごきげんよう。
ありがとう
Swift 4.およびFBSDKCoreKit 4.
let loginManager = LoginManager()
if let currentAccessToken = AccessToken.current, currentAccessToken.appId != SDKSettings.appId
{
loginManager.logOut()
}
シングルサインオン
シングルサインオン (つまり、複数のユーザーがコンテンツを作成して1つのデバイスから共有するアプリ)を必要としないアプリがある場合、この問題が発生することもわかりました。
アプリの設定でシングルサインオンを変更できます https://developers.facebook.com/apps/your-app-id/settings/ 。
Objective-Cの私にとっては、次のように働きました
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
if ([FBSDKAccessToken currentAccessToken]) {
[login logOut];
}
問題は、ユーザーが@Vineeth Josephによって提案された別のユーザーとしてログインしようとしていたことでした