<!--
{
  "availability" : [
    "iOS: 10.0.0 - 17.0.0",
    "iPadOS: 10.0.0 - 17.0.0",
    "macCatalyst: 13.1.0 - 17.0.0",
    "macOS: 10.12.0 - 14.0.0",
    "tvOS: 10.0.0 - 17.0.0",
    "visionOS: 1.0.0 - 1.0.0",
    "watchOS: 3.0.0 - 10.0.0"
  ],
  "documentType" : "symbol",
  "framework" : "CloudKit",
  "identifier" : "/documentation/CloudKit/CKDiscoverUserIdentitiesOperation",
  "metadataVersion" : "0.1.0",
  "role" : "Class",
  "symbol" : {
    "kind" : "Class",
    "modules" : [
      "CloudKit"
    ],
    "preciseIdentifier" : "c:objc(cs)CKDiscoverUserIdentitiesOperation"
  },
  "title" : "CKDiscoverUserIdentitiesOperation"
}
-->

# CKDiscoverUserIdentitiesOperation

An operation that uses the provided criteria to search for discoverable iCloud users.

```
class CKDiscoverUserIdentitiesOperation
```

## Overview

Use this operation to discover one or more iCloud users that match identity information you provide, such as email addresses and phone numbers.

Before CloudKit can return a user’s identity, you must ask for their permission by calling [`requestApplicationPermission(_:completionHandler:)`](/documentation/CloudKit/CKContainer/requestApplicationPermission(_:completionHandler:)). Do this as part of any onboarding where you can highlight the benefits of being discoverable within the context of your app.

The operation executes the handlers you provide on an internal queue it manages. You must provide handlers capable of executing on a background queue. Tasks that need access to the main queue must redirect as appropriate.

The operation calls [`discoverUserIdentitiesCompletionBlock`](/documentation/CloudKit/CKDiscoverUserIdentitiesOperation/discoverUserIdentitiesCompletionBlock) after it executes and returns results. Use the completion handler to perform housekeeping tasks for the operation. It should also manage any failures, whether due to an error or an explicit cancellation.

> Note: Because this class inherits from <doc://com.apple.documentation/documentation/Foundation/Operation>, you can also set the <doc://com.apple.documentation/documentation/Foundation/Operation/completionBlock> property. The operation calls both completion handlers if they’re both set.

CloudKit operations have a default QoS of <doc://com.apple.documentation/documentation/Foundation/QualityOfService/default>. Operations with this service level are discretionary. The system schedules their execution at an optimal time according to battery level and network conditions, among other factors. Use the <doc://com.apple.documentation/documentation/Foundation/Operation/qualityOfService> property to set a more appropriate QoS for the operation.

The following example shows how to create the operation, configure its callbacks, and execute it using the default container’s queue:

```swift
func fetchUserIdentities(withEmails emails: [String],
    completion: @escaping (Result<[CKUserIdentity], any Error>) -> Void) {

    var identities = [CKUserIdentity]()

    // Convert the email addresses into instances of
    // CKUserIdentity.LookupInfo, which CloudKit uses
    // to discover identities.
    let lookupInfos =
        CKUserIdentity.LookupInfo.lookupInfos(withEmails: emails)

    // Create the operation using the array of lookup objects.
    let operation = CKDiscoverUserIdentitiesOperation(
        userIdentityLookupInfos: lookupInfos)

    // Cache the user identities as CloudKit discovers them.
    operation.userIdentityDiscoveredBlock = { userIdentity, _ in
        identities.append(userIdentity)
    }

    // If the operation fails, return the error to the caller.
    // Otherwise, return the array of discovered user identities.
    operation.discoverUserIdentitiesCompletionBlock = { error in
        if let error = error {
            completion(.failure(error))
        } else {
            completion(.success(identities))
        }
    }

    // Set an appropriate QoS and add the operation to the
    // default container's queue to execute it.
    operation.qualityOfService = .userInitiated
    CKContainer.default().add(operation)
}
```

## Topics

### Creating an Operation

[`init()`](/documentation/CloudKit/CKDiscoverUserIdentitiesOperation/init())

Creates an operation for discovering user identities.

[`init(userIdentityLookupInfos:)`](/documentation/CloudKit/CKDiscoverUserIdentitiesOperation/init(userIdentityLookupInfos:))

Creates an operation for discovering the user identities of the specified lookup infos.

### Configuring the Operation

[`userIdentityLookupInfos`](/documentation/CloudKit/CKDiscoverUserIdentitiesOperation/userIdentityLookupInfos)

The lookup info for discovering user identities.

### Processing the Results

[`userIdentityDiscoveredBlock`](/documentation/CloudKit/CKDiscoverUserIdentitiesOperation/userIdentityDiscoveredBlock)

The closure to execute for each user identity.

[`discoverUserIdentitiesCompletionBlock`](/documentation/CloudKit/CKDiscoverUserIdentitiesOperation/discoverUserIdentitiesCompletionBlock)

The closure to execute when the operation finishes.



---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)