web-dev-qa-db-ja.com

ios facebook sdk 4.0ログインエラーコード304

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です私は何かを見逃していますか?

62
jim

同様の問題がありました。

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呼び出しを行う必要があります。

201
Vineeth Joseph

これは、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()
    }
7
amosel

IOSアプリの実行中にXcodeでFBアプリの詳細を変更すると、これが発生しました。デバイスからアプリを削除してから、新しいFBアプリのセットアップで再公開する必要があります。古いFB設定をクリアするには、再コンパイルするだけでは不十分です。

7
Adrian999

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())
            }
        })
}
4
Abhishek Jain

次のコードを使用して問題を解決できます。

[FBSDKAccessToken refreshCurrentAccessToken:^(FBSDKGraphRequestConnection *connection, id result, NSError *error){}
4
Piyush Patel

Swift 4.0、4.2、5.

FBSDKLoginManager().logOut()
2
Tanjima Kothiya

ドキュメントによると、304 FBSDKLoginUserMismatchErrorCode"ユーザーが変更されたために新しい権限を要求できないことを示します"

前述の@ Adrian999のシナリオでは意味があります。

2
Joseph Lin

実際、その理由は非常に単純です。次の手順を試して、このエラーコードを簡単に再現できます。

Facebookログイン失敗」には2つの理由があります。

  1. facebookからユーザー情報を取得できません。
  2. 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.userIDactualIDと等しくない場合、FBSDKLoginUserMismatchErrorCodeはスローされます。

これで、ユーザーAのログインFacebookが失敗するとこの問題が再び発生しますが、失敗後に[FacebookSDKManager logOut]がない場合、アプリはユーザーAのaccessTokenをキャッシュし、ユーザーAはFacebookアカウントをユーザーBに変更します。ユーザーBのログインFacebookに再度ログインすると、この問題が再び表示されます。

2
iCrany

私もしばらくの間、この問題にこだわっていました。次に、.hファイルと.mファイルのviewDidLoadでFBSDKLoginManagerのオブジェクトを作成し、それを初期化してログアウトプロパティを設定します。

 _fbLogin= [[FBSDKLoginManager alloc]init];    
 [_fbLogin logOut];

これは私を助け、あなたも助けてくれることを願っています。ではごきげんよう。

ありがとう

2
Kunal Gupta

Swift 4.およびFBSDKCoreKit 4.

let loginManager = LoginManager()
if let currentAccessToken = AccessToken.current, currentAccessToken.appId != SDKSettings.appId
{
    loginManager.logOut()
}
2
Maxime Felici

シングルサインオン

シングルサインオン (つまり、複数のユーザーがコンテンツを作成して1つのデバイスから共有するアプリ)を必要としないアプリがある場合、この問題が発生することもわかりました。

アプリの設定でシングルサインオンを変更できます https://developers.facebook.com/apps/your-app-id/settings/

0
Neil Japhtha

Objective-Cの私にとっては、次のように働きました

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
if ([FBSDKAccessToken currentAccessToken]) {
             [login logOut];
        }

問題は、ユーザーが@Vineeth Josephによって提案された別のユーザーとしてログインしようとしていたことでした

0
Chirag Purohit