CloudKit:获取用户名/姓

时间:2017-07-25 19:28:05

标签: ios cloudkit

我试图使用云工具包获取用户名,但以下代码未获得用户名,并且将firstNameFromFunction变量留空。有谁知道如何在iOS 10中实现这一目标?

let container = CKContainer.default()        
container.fetchUserRecordID { (recordId, error) in
            if error != nil {
                print("Handle error)")
            }else{

                self.container.discoverUserInfo(
                    withUserRecordID: recordId!, completionHandler: { (userInfo, error) in
                        if error != nil {
                            print("Handle error")
                        }else{
                            if let userInfo = userInfo {
                                print("givenName =   \(userInfo.displayContact?.givenName)")
                                print("familyName = \(userInfo.displayContact?.familyName)")
                                firstNameFromFunction = userInfo.displayContact?.givenName
                            }else{
                                print("no user info")
                            }
                        }
                })
            }
        }

3 个答案:

答案 0 :(得分:1)

在第一次询问IMO时出现的权限屏幕措辞非常糟糕。他们需要改变这一点。它说"允许人们使用你的应用程序'通过电子邮件来查找你?知道您的电子邮件地址的人将能够看到您使用此应用程序。"这没有任何意义。这与要求用户获取他们的iCloud名字,姓氏,电子邮件地址无关。

说到电子邮件地址 - 这和来自lookupInfo属性的电话号码丢失了 - 即设置为nil,即使这些值是合法且正确的。今晚提交一个错误。

答案 1 :(得分:1)

首先,您需要获得访问用户信息的权限。

然后,您可以使用CKDiscoverUserIdentitiesOperation。这与任何其他CKOperation(例如修改记录操作)一样。您只需使用useridentitylookupinfo创建一个新操作。然后,您还需要创建一个完成块来处理结果。

这是我创建的示例函数:

    func getUserName(withRecordID recordID: CKRecordID,
                 completion: @escaping (String) -> ()) {
    if #available(iOS 10.0, *) {
        let userInfo = CKUserIdentityLookupInfo(userRecordID: recordID)
        let discoverOperation = CKDiscoverUserIdentitiesOperation(userIdentityLookupInfos: [userInfo])
        discoverOperation.userIdentityDiscoveredBlock = { (userIdentity, userIdentityLookupInfo) in
            let userName = "\((userIdentity.nameComponents?.givenName ?? "")) \((userIdentity.nameComponents?.familyName ?? ""))"
            completion(userName)
        }
        discoverOperation.completionBlock = {
            completion("")
        }
        CKContainer.default().add(discoverOperation)
    } else {
        // iOS 10 and below version of the code above,
        // no longer works. So, we just return an empty string.
        completion("")
    }
}

答案 2 :(得分:0)

首先,您需要询问用户是否允许被发现。

使用CKContainer.default().requestApplicationPermission方法在applicationPermission参数上传递.userDiscoverability。

在iOS 10上不推荐使用CKContainer.default().discoverUserInfo方法。而是使用CKContainer.default().discoverUserIdentity method.

做类似的事情:

CKContainer.default().requestApplicationPermission(.userDiscoverability) { (status, error) in
                    CKContainer.default().fetchUserRecordID { (record, error) in
                        CKContainer.default().discoverUserIdentity(withUserRecordID: record!, completionHandler: { (userIdentity, error) in

                            print("\(userIdentity?.nameComponents?.givenName)")
                            print("\(userIdentity?.nameComponents?.familyName)")

                        })
                    }
                }