我正在使用iOS的Facebook集成,以允许用户使用其Facebook帐户登录。

我在获取用户的全名时遇到了问题。

我正在创建ACAccount类型的ACAccountTypeIdentifierFacebook

经过一番搜索,我发现了这个小片段以获得全名:

// account is an ACAccount instance
NSDictionary *properties = [account valueForKey:@"properties"];
NSString *fullName = properties[@"fullname"];

我对其进行了测试,并且效果良好。它可以在多种设备上使用。

然后,我们将其发送给我们的客户,他安装了它,但是它不起作用。

经过几天的测试,我能够从同事那里得到在iPhone上发生的错误。

经过快速调试 session 后,我发现fullname密钥不存在。相反,还有另外两个键,ACPropertyFullNameACUIAccountSimpleDisplayName

现在我得到全名的代码是:
NSDictionary *properties = [account valueForKey:@"properties"];
NSString *nameOfUser = properties[@"fullname"];
if (!nameOfUser) {
    nameOfUser = properties[@"ACUIAccountSimpleDisplayName"];
    if (!nameOfUser) {
        nameOfUser = properties[@"ACPropertyFullName"];
    }
}

所以我的问题实际上分为三个部分:
  • uid键是否可能发生相同的情况?如果是,则存在哪些可能的键?
  • 还有其他键可以获取全名吗?
  • 在Twitter上是否发生相同的事情,还是始终使用相同的密钥?

  • 谢谢大家。

    最佳答案

    您使用valueForKey:@"properties"调用在那里所做的就是访问 private property ,这将使您的应用程序被Apple拒绝。

    如果您的项目是iOS 7项目,则可以在ACAccount类上使用名为userFullName的新属性。从ACAccount.h:

    // For accounts that support it (currently only Facebook accounts), you can get the user's full name for display
    // purposes without having to talk to the network.
    @property (readonly, NS_NONATOMIC_IOSONLY) NSString *userFullName NS_AVAILABLE_IOS(7_0);
    

    另外,您可以使用Graph API通过current user查询Social framework:
    SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                         requestMethod:SLRequestMethodGET
                                                   URL:[NSURL URLWithString:@"https://graph.facebook.com/me"]
                                            parameters:nil];
    request.account = account; // This is the account from your code
    [request performRequestWithHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error == nil && ((NSHTTPURLResponse *)response).statusCode == 200) {
            NSError *deserializationError;
            NSDictionary *userData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&deserializationError];
    
            if (userData != nil && deserializationError == nil) {
                NSString *fullName = userData[@"name"];
                NSLog(@"%@", fullName);
            }
        }
    }];
    

    07-27 17:10