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

时间:2016-10-30 18:08:32

标签: ios swift ios10 cloudkit

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

我正在模拟器上运行,但我确认模拟器已同步我的所有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的新功能,我似乎无法找到相关信息。

1 个答案:

答案 0 :(得分:1)

CKDiscoverAllUserIdentitiesOperation返回任何结果之前必须完成相当多的工作。

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

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

最后,要让CKDiscoverAllUserIdentitiesOperation返回任何用户,此人必须拥有与完成上述所有步骤的其他用户匹配的电子邮件地址的联系人。