是什么让 CKDiscoverAllUserIdentitiesOperation 可以发现用户?

What makes a user discoverable to CKDiscoverAllUserIdentitiesOperation?

我正在尝试使用以下代码发现用户的联系人(该代码是 UITableViewController 的实现。我在两个代码块中都放置了断点,并且我确定 userIdentityDiscoveredBlock 在调用 completionBlock 时未被调用。这表明该操作正按预期进行 运行,它只是没有找到任何联系人。

我在模拟器上 运行ning,但我确认模拟器已同步我所有的 iCloud 联系人(在模拟器上打开联系人应用会显示我的所有联系人)。

override func viewDidLoad() {
    super.viewDidLoad()

    let op = CKDiscoverAllUserIdentitiesOperation()

    op.discoverAllUserIdentitiesCompletionBlock = { error -> Void in
        // reload my data table
    }

    op.userIdentityDiscoveredBlock = { user -> Void in
        if user.hasiCloudAccount {
            self.iCloudUsers.append(user)
        } else {
            self.nonICloudUsers.append(user)
        }
    }

    CKContainer.default().add(op)
}

所以我的问题是 - 是否还有其他事情需要做才能发现联系人?这是模拟器问题吗?

我搜索了 documentation 和其他问题,但我似乎找不到这方面的信息,因为该操作是 iOS 10.

的新操作

CKDiscoverAllUserIdentitiesOperation 将 return 任何结果之前必须完成很多工作。

首先,您应用的每个用户都必须授予通过电子邮件查找的权限。您的应用使用 CKContainer requestApplicationPermission.

发出此请求

您的应用程序的每个用户还必须登录 iCloud 帐户。用户还必须启用 iCloud Drive。

最后,对于 CKDiscoverAllUserIdentitiesOperation 到 return 的任何用户,此人的联系人的电子邮件地址必须与完成上述所有步骤的其他用户相匹配。