17

除了要求用户输入他们的名字之外,还有什么方法可以将其从设备中取出?

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

https://github.com/tiboll/TLLNameFromDevice

用户的姓名是否存在于电话簿或我们在 iOS 6 中可以访问的任何其他地方?

4

5 回答 5

12

好吧,您可以浏览地址簿中的所有联系人,看看其中是否有任何人标有所有者标志。

请注意,这样做会弹出“此应用程序想要访问地址簿”消息。苹果也不是很热衷于这类事情。在应用审查指南中规定,未经用户许可,应用不得使用个人信息。

于 2013-06-03T13:19:43.030 回答
8

您可以使用Square 的解决方案

  1. 获取设备的名称(例如“John Smith's iPhone”)。
  2. 浏览电话上的联系人并查找名为“John Smith”的联系人。

JBDeviceOwnerABGetMe都会为您执行此操作。

于 2014-01-24T22:26:09.977 回答
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的代码

为了节省人们的时间。在 swift4 中:

    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 不再公开名字或姓氏

所以这个答案不再有效。

于 2014-10-22T22:10:15.180 回答
2

您可以使用:

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

我确实收到了编译器警告,这些方法+currentHost-names没有找到。鉴于警告,我不确定 Apple 是否打算将其作为可公开访问的 API 提供(或不提供),但是,一切似乎都按预期工作,无需包含任何额外的头文件或额外的libraries/链接frameworks

编辑1: 您也可以看看这个链接

编辑 2: 如果您已将应用程序与 Facebook 集成,则可以轻松检索用户信息,请参阅Facebook Fetch User Data

于 2013-06-03T13:28:41.190 回答
-2

对于 SWIFT,您可以使用

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

func NSUserName() -> String

于 2019-11-11T18:11:55.813 回答