1

我正在使用 iOS 的 Facebook 集成来允许用户使用他们的 Facebook 帐户登录。

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

我正在创建一个ACAccounttype ACAccountTypeIdentifierFacebook

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

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

我测试了它,它工作。它适用于多种设备。

然后我们将它发送给我们的客户,他安装了它,但它没有工作。

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

经过快速调试会话后,我发现fullname密钥不存在。取而代之的是另外两个键,ACPropertyFullNameACUIAccountSimpleDisplayName

现在我获得全名的代码是:

NSDictionary *properties = [account valueForKey:@"properties"];
NSString *nameOfUser = properties[@"fullname"];
if (!nameOfUser) {
    nameOfUser = properties[@"ACUIAccountSimpleDisplayName"];
    if (!nameOfUser) {
        nameOfUser = properties[@"ACPropertyFullName"];
    }
}

所以我的问题实际上分为三个部分:

  1. 密钥是否可能发生同样的事情uid,如果是这样,存在哪些可能的密钥?

  2. 是否有任何其他键可以获得全名?

  3. Twitter 上是否也会发生同样的事情,或者它总是使用相同的密钥?

谢谢大家。

4

1 回答 1

1

您在valueForKey:@"properties"通话中所做的是访问私有财产,这将使您的应用程序被 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使用Social 框架查询当前用户

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);
        }
    }
}];
于 2013-10-31T23:18:13.677 回答