iPhone用户的姓名是否能获取?

17

除了要求用户输入他们的姓名外,是否有任何方法可以从设备上获取它?

我尝试了这个库,它试图从[UIDevice currentDevice] name]中提取名称,但在很多情况下都不起作用:

https://github.com/tiboll/TLLNameFromDevice

在iOS 6中,用户的名字是否出现在电话簿或我们可以访问的任何其他地方?


1
我认为在iOS上不可能:http://stackoverflow.com/a/12715598/1813169 - MTCoster
5个回答

12

你可以遍历通讯录中的所有联系人,看是否有任何联系人被标记为所有者。

请注意,这样做会弹出"此应用程序要访问通讯录"消息。此外,苹果对此类事情并不太感兴趣。在应用程序审核指南中规定,应用程序不能未经用户允许使用个人信息。


13
终于有了一个不会立即重复懒人通常给出的“不可能”的回答...(+1) - user529758
5
这个“owner flag”在哪里? - devios1
1
@rckoenes,请详细说明一下这个“owner”标志。提供一些示例代码会非常有帮助。谢谢。 - Luke

9

3
您可以使用CloudKit。下面是一个Swift代码片段(忽略错误):
let container = CKContainer.defaultContainer()

container.fetchUserRecordIDWithCompletionHandler(
    {
        (recordID, error) in

        container.requestApplicationPermission(
            .PermissionUserDiscoverability,
            {
                (status, error2) in

                if (status == CKApplicationPermissionStatus.Granted)
                {
                    container.discoverUserInfoWithUserRecordID(
                        recordID,
                        completionHandler:
                        {
                            (info, error3) in

                            println("\(info.firstName) \(info.lastName)")
                        }
                    )
                }
            }
        )
    }
)

上述代码基于http://www.snip2code.com/Snippet/109633/CloudKit-User-Info的代码,旨在节省时间。Swift 4中的代码如下:
    let container = CKContainer.default()
    container.fetchUserRecordID(
        completionHandler: {
            (recordID, error) in
            guard let recordID = recordID else {
                return
            }
            container.requestApplicationPermission(
                .userDiscoverability,
                completionHandler: {
                    (status, error2) in

                    if (status == CKContainer_Application_PermissionStatus.granted)
                    {
                        if #available(iOS 10.0, *) {
                            container.discoverUserIdentity(withUserRecordID:
                                recordID,
                                                           completionHandler:
                                {
                                    (info, error3) in
                                    guard let info = info else {
                                        return
                                    }
                                    print("\(info.firstName) \(info.lastName)")
                            }
                            )
                        }
                    }
            }
            )
        }
    )

然而:CKUserIdentity不再公开名字的第一个或最后一个字母。因此,这个答案不再适用。

需要注意的是,如果尚未授予此权限,这将提示用户允许其他使用同一应用程序且在他们的通讯录中拥有其电子邮件地址的用户发现自己。 - algal
当我尝试这个时,我收到了错误消息:类型CKApplicationsPermissions没有成员'PermissionUserDiscoverability'。 - Tom Tallak Solbu

2

您可以使用:

NSLog(@"user == %@",[[[NSHost currentHost] names] objectAtIndex:0]);

我收到了编译器警告,提示找不到方法+currentHost-names。鉴于警告,我不确定苹果公司是否有意将其作为公开可访问的API提供(或不提供),但是在不需要包含任何额外的头文件或链接其他的libraries/frameworks的情况下,一切都按预期工作。 编辑1: 您还可以查看此链接 编辑2: 如果您已经将您的应用程序与Facebook集成,您可以轻松地检索用户信息,请参见Facebook获取用户数据

-2

对于SWIFT,您可以使用

NSUserName()返回当前用户的登录名。

func NSUserName() -> String


1
欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户了解它的内容和原因,然后引用您链接的页面中最相关的部分,以防目标页面不可用。仅仅提供链接的答案可能会被删除。 - Vickel
这将返回“mobile”。 - Troy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接