似乎有很多人使用parse.com的ParseFacebookUtils.logIn()方法存在问题,我自己也遇到了一个非常奇怪的问题(我的问题与我在SO上看到的问题都不相似)。
我一直在开发一个应用程序已经有一段时间了,一切都运行得很好。直到我使用我的测试/开发电话上的应用程序退出UserA的Facebook帐户才能登录UserB的帐户测试目的,才开始出现问题。现在,每当任何用户使用Sign In With Facebook
按钮登录我的应用程序时,就会在我的应用程序的解析数据库中的User
类中创建一个新用户。很奇怪。我用于Facebook登录的代码与parse.com本身提供的示例应用程序相同,以演示如何执行此操作 - 没有任何自定义。这是:
private void onLoginButtonClicked() {
LoginActivity.this.progressDialog = ProgressDialog.show(
LoginActivity.this, "", "Logging in...", true);
List<String> permissions = Arrays.asList("public_profile", "user_friends",
"user_relationships", "user_birthday", "user_location");
ParseFacebookUtils.logIn(permissions, this, new LogInCallback() {
@Override
public void done(ParseUser user, ParseException err) {
LoginActivity.this.progressDialog.dismiss();
if (user == null) {
Log.d(TAG,
"Uh oh. The user cancelled the Facebook login.");
} else if (user.isNew()) {
Log.d(TAG,
"User signed up and logged in through Facebook!");
/*this will populate common info from the user's Facebook profile and store it in Parse backend */
facebookObject.getMyFacebookDetails();
showNewsFeedActivity();
} else {
Log.d(TAG,
"User logged in through Facebook!");
//facebookObject.getMyFacebookDetails();
ParseUser currentUser = ParseUser.getCurrentUser();
Logging.toast("Welcome back, " + currentUser.getString("firstName")+"("+currentUser.getObjectId()+")");
showNewsFeedActivity();
}
}
});
}
我的onActivityResult方法中也有以下内容,如示例所示:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CREATE_ACCOUNT_CODE){
showNewsFeedActivity();
}else if (requestCode == SIGN_IN_WITH_EMAIL_CODE){
showNewsFeedActivity();
}else if (requestCode == FORGOT_PASSWORD_CODE){
...
}
else{
ParseFacebookUtils.finishAuthentication(requestCode, resultCode, data);
}
}
以下是使用精确方法的parse.com示例应用https://parse.com/tutorials/integrating-facebook-in-android的链接。
自从我退出UserA的Facebook帐户,然后使用UserB的凭据登录,然后使用登录Facebook按钮登录我的应用程序,它现在创建了一个我可以看到的新用户在我的应用程序的用户类parse.com上的仪表板中。即使我重新登录UserA并尝试登录,即使已经有一个用户(我自己)拥有一个帐户,也会创建一个新用户。
我的问题:
1)我是否应该以不同的方式保存新用户?截至目前,我没有任何不同于ParseFacebookUtils.logIn()的逻辑,因为该调用表示如果一个用户尚未存在,它将自动创建一个新用户。我会假设对该方法的同一调用也能够以某种方式告诉具有该Facebook Id的用户已经存在但是这可能是我没有做或误解的(当然这是由ParseFacebookUtils内部处理所以我不应该& #39; t必须触摸任何一个)。
如果您对正在发生的事情有任何想法,我将非常感谢您听到它们。
修改:
每次登录时都会遇到user.isNew()方法。当通过对FacebookUserUtils.logIn()的调用创建用户时,对此函数的调用将为true。显然有些问题是因为这个用户实际上不是新用户(他们已经在我的应用程序的数据库中,但出于某种原因被忽略了)。
答案 0 :(得分:1)
事实证明发生这种情况的原因是因为我在注销时正在调用ParseFacebookUtils.unlink(user),这清除了与该用户的Facebook身份验证关联,这又会强制调用.login()来创建数据库中的新用户。因此,只有在您确实需要删除Facebook身份验证时才使用取消链接(在我的情况下,如果用户决定删除其帐户,则会使用取消链接)。