2014-07-08 5 views
2

ParseFacebookUtils를 사용하여 Android 앱에 Parse & Facebook 플로우를 구현했습니다.Android ParseFacebookUtils가 로그인 및 로그 아웃으로 연결

TL; DR

  1. 로그 아웃 한국어 (ParseFacebookUtils.logIn) (ParseFacebookUtils.logOut & ParseUser.logOut)
  2. 로 로그인 (및 링크) 후 파싱 사용자 등재
  3. Facebook으로 다시 로그인하면 이전 구문을 가져 오는 대신 새로운 구문 분석 이 생성됩니다.

긴 버전 : 로그인 흐름은 작동 - ParseFacebookUtils.logIn 호출이 페이스 북 대화 상자를 실행하고 생성하고 사용자의 페이스 북 계정에 연결되는 새로운 구문 분석 사용자를 수용 한 후.

로그 아웃 (ParseFacebookUtils.logOut 및 ParseUser.logOut)하고 동일한 Parse 사용자에게 다시 로그인하려고하면 문제가 발생합니다. Facebook 대화 상자가 잠시 나타나서 앱으로 리디렉션됩니다 (이미 해당 Facebook 사용자에게 승인 된대로).하지만 관련 파 페이스 사용자의 이전 대화 상자를 찾는 대신 새로운 Parse 사용자가 생성되는 것처럼 보입니다.

질문 : 이러한 흐름을 활성화하는 방법이 있습니까? 이미 생성 된 사용자를 수동으로 가져와야합니까? 모든 로그인 논리가 상주하는 내 MainActivity에 대한

코드 :

public class MainActivity extends Activity { 

    private ProgressBar progressBar; 
    private Button loginButton; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    progressBar = (ProgressBar) findViewById(R.id.splash_loading_spinner); 
    loginButton = (Button) findViewById(R.id.splash_facebook_login); 
    loginButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
     onLoginButtonClicked(); 
     } 
    }); 

    ParseAnalytics.trackAppOpened(getIntent()); 

    // Check if there is a currently logged in user 
    // and they are linked to a Facebook account. 
    ParseUser currentUser = ParseUser.getCurrentUser(); 
    if ((currentUser != null) && ParseFacebookUtils.isLinked(currentUser)) { 
     // load data from Parse user and launch the next activity immediately 
     retrieveData(); 
    } else { 
     failedLoggingIn(); 
    } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    ParseFacebookUtils.getSession().onActivityResult(this, requestCode, resultCode, data); 
    } 

    // this method will link the current ParseUser to the used Facebook account if needed 
    private boolean linkFacebookUser() { 
    ParseUser user = ParseUser.getCurrentUser(); 

    // save fb_id and email to the parse user 
    Request.newMeRequest(ParseFacebookUtils.getSession(), new Request.GraphUserCallback() { 
     @Override 
     public void onCompleted(GraphUser fbUser, Response response) { 
     if (fbUser == null) { 
      Log.e("Facebook Me Request", "Failed fetching user Facebook Graph object."); 
     } else { 
      Log.d("Facebook Me Request", "Received Facebook graph object for "+fbUser.getId()+"("+fbUser.getProperty("email").toString()+")"); 

      ParseUser.getCurrentUser().put("fb_id", fbUser.getId()); 
      ParseUser.getCurrentUser().setEmail(fbUser.getProperty("email").toString()); 
      ParseUser.getCurrentUser().setUsername(fbUser.getProperty("email").toString()); 
      ParseUser.getCurrentUser().setPassword(UUID.randomUUID().toString()); 
      ParseUser.getCurrentUser().signUpInBackground(new SignUpCallback() { 
      @Override 
      public void done(ParseException e) { 
       if (e == null) { 
       Log.d("Parse signup user", "Successfully saved a new Parse-Facebook user!"); 
       retrieveData(); 
       } else { 
       Log.e("Parse signup user", "FAILED saving a new Parse-Facebook user. Error: " + e.getMessage()); 
       e.printStackTrace(); 
       } 
      } 
      }); 
     } 
     } 
    }).executeAsync(); 

    return true; 
    } 

    private void retrieveData() { 
    // fetch data needed to show movie recommendations 
    Log.d("Parse Facebook Login Info", "fb_id=" + ParseUser.getCurrentUser().get("fb_id")); 

    startActivity(new Intent(this, BrowseMoviesActivity.class)); 
    finish(); 
    } 

    private void failedLoggingIn() { 
    ParseUser.logOut(); 
    progressBar.setVisibility(View.GONE); 
    loginButton.setVisibility(View.VISIBLE); 
    } 

    private void onLoginButtonClicked() { 
    Log.d("UI", "Clicked the Facebook login button"); 
    progressBar.setVisibility(View.VISIBLE); 
    loginButton.setVisibility(View.GONE); 

    List<String> permissions = Arrays.asList(
     "public_profile", 
     "user_friends", 
     "user_actions.video", 
     ParseFacebookUtils.Permissions.User.EMAIL, 
     ParseFacebookUtils.Permissions.User.ABOUT_ME, 
     ParseFacebookUtils.Permissions.User.RELATIONSHIPS, 
     ParseFacebookUtils.Permissions.User.BIRTHDAY, 
     ParseFacebookUtils.Permissions.User.LOCATION 
    ); 

    ParseFacebookUtils.logIn(permissions, this, new LogInCallback() { 
     @Override 
     public void done(ParseUser user, ParseException err) { 
     MainActivity.this.progressBar.setVisibility(View.GONE); 
     if (user == null) { 
      Log.d("ParseFacebookLogin", "Uh oh. The user cancelled the Facebook login."); 
      if (err != null) { 
      Log.d("ParseFacebookLogin", "Error: " + err.getLocalizedMessage()); 
      } 

      failedLoggingIn(); 
     } else if (user.isNew()) { 
      Log.d("ParseFacebookLogin", "User signed up and logged in through Facebook!"); 
      // we should probably use this scenario to set fb id to the Parse user 
      linkFacebookUser(); 
     } else { 
      Log.d("ParseFacebookLogin", "User logged in through Facebook!"); 
      if (user.get("fb_id") == null) { 
      linkFacebookUser(); 
      } else { 
      retrieveData(); 
      } 
     } 
     } 
    }); 
    } 
} 
+0

developers.facebook.com에서 자세한 버그 보고서를 열 것을 권장합니다. 나는이 행동이 예상된다고 생각하지 않는다. – Fosco

+0

"새로운 Parse 사용자가 만들어지고있는 것처럼 보입니다"라고 말하면 어떻게 생각하십니까? 사용자를 디버깅하고 있습니까? 사용자 ID를 기록하여 동일하거나 새로운 지 확인할 수 있습니다. –

+0

@TimothyWalters. 첫 번째 생성시 FB id를 저장하고 있으며 상세한 흐름에 따라 설정되지 않습니다. 또한 구문 분석 사용자를 저장할 수 없습니다. 먼저 서명해야한다는 오류가 표시됩니다. –

답변

2

나는 같은 문제가 있었다. 실제로 그것은 sdk를 파싱하는 버그 였고 문제는 내 코드를 변경하지 않고 해결되었습니다. 단지 최신 파싱 안드로이드 SDK (작성 시점에 1.8.1)를 설치하는 것뿐입니다.