我如何获得给定PFUser的Facebook用户名?

问题描述:

PFUser * aUser = [PFUser currentUser]; //可能不是当前用户NSLog(“username%@”,[aUser username]); //如果它不是一个FB用户,这可以。另外它给了我一个象征。我知道有一个[PFUser isLinkedWithUser:aUser]返回的是CURRENT LOGGED USER所链接的,但用户可能不是此设备中的电流。我如何获得给定PFUser的Facebook用户名?

该工程确定为currentUser:

+ (void)getUsernameWithCompletionBlock:(void(^)(NSString *username))handler { 
if([PFFacebookUtils isLinkedWithUser:[PFUser currentUser]]){ //<- 
    FBRequest *request = [FBRequest requestForMe]; 
    [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
    if (!error) { 
     NSDictionary *userData = (NSDictionary *)result; 
     NSString *name = userData[@"name"]; 
     handler(name); 
    }}]; 
} else { 
    handler([[PFUser currentUser] username]); 
} 

}

但我想是这样的

+(void)getUsernameWithUser:(PFUser *)user andCompletionBlock:(void(^)(NSString  *username))handler { 
if([PFFacebookUtils isLinkedWithUser:user]){ //<- THIS ALWAYS RETURN FALSE 
    //return the real facebook username 
    } else { 
     handler([user username]); 
    } 
} 

在医生说:isLinkedWithUser:

无论用户有他们的帐户链接到Facebook。

(BOOL)isLinkedWithUser :(PFUser *)user参数user用户检查facebook链接。用户必须在此设备上登录。 有什么建议吗?

当您拥有不是当前用户的用户时,不会发送authData。您有两种选择:

  1. 每个用户都可以在用户表中存储他们的Facebook用户名(以及任何其他想要公开访问的数据)。
  2. 创建一个使用主密钥检索authData并查询Facebook用户名的云代码函数。

对于方案二,你的云代码应该做类似如下的内容:

Parse.Cloud.define("facebookAlias", function(request, response) { 
    Parse.Cloud.useMasterKey(); 
    new Parse.Query(Parse.User).get(request.params.user_id).then(function(user) { 
    var authData = user.get("authData"); 

    // Quit early for users who aren't linked with Facebook 
    if (authData === undefined || authData.facebook === undefined) { 
     response.success(null); 
     return; 
    } 

    return Parse.Cloud.httpRequest({ 
     method: "GET", 
     url: "https://graph.facebook.com/me", 
     params: { 
     access_token: authData.facebook.access_token, 
     fields: "username", 
     } 
    }); 

    }).then(function(json) { 
    response.success(JSON.parse(json)["username"]); 

    // Promises will let you bubble up any error, similar to a catch statement 
    }, function(error) { 
    response.error(error); 
    }); 
}); 

免责声明:上面的代码大致是从一个个人项目,但足够作了调整,我不保证反对语法错误。