<!--
{
  "availability" : [
    "iOS: 18.0.0 -",
    "iPadOS: 18.0.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "ContactProvider",
  "identifier" : "/documentation/ContactProvider/ContactProviderExtension",
  "metadataVersion" : "0.1.0",
  "role" : "Protocol",
  "symbol" : {
    "kind" : "Protocol",
    "modules" : [
      "ContactProvider"
    ],
    "preciseIdentifier" : "s:15ContactProvider0aB9ExtensionP"
  },
  "title" : "ContactProviderExtension"
}
-->

# ContactProviderExtension

The protocol your app extension implements, which provides contact items to the system-wide Contacts ecosystem.

```
protocol ContactProviderExtension : ContactItemEnumerating, AppExtension
```

## Overview

For the system to recognize your app extension, use the following identifier in the extension’s `Info.plist` file:

```
<key>EXAppExtensionAttributes</key>
<dict>
    <key>EXExtensionPointIdentifier</key>
    <string>com.apple.contact.provider.extension</string>
</dict>
```

Installing the host app installs your extension, but the system won’t run the extension until the extension domain is enabled. When the extension runs, the system first calls the extension’s [`configure(for:)`](/documentation/ContactProvider/ContactProviderExtension/configure(for:)) method. Then you set up the enumerator that provides contact items from your data store.

The following shows a basic implementation of a `ContactProviderExtension`. Because `ContactProviderExtension` inherits from [`ContactItemEnumerating`](/documentation/ContactProvider/ContactItemEnumerating) the implementation also implements [`enumerator(for:)`](/documentation/ContactProvider/ContactItemEnumerating/enumerator(for:)) which returns a [`ContactItemEnumerator`](/documentation/ContactProvider/ContactItemEnumerator) on demand. In this example, the extension sets up a `RootContainerEnumerator` to provide its contact items; see the [`ContactItemEnumerator`](/documentation/ContactProvider/ContactItemEnumerator) discussion for details of how `RootContainerEnumerator` works.

```swift
import ContactProvider

@main
class ExtensionExample: ContactProviderExtension {
    private let rootContainerEnumerator: RootContainerEnumerator
    
    required init() {
        rootContainerEnumerator = RootContainerEnumerator()
    }
    
    func configure(for domain: ContactProviderDomain) {
        rootContainerEnumerator.configure(for: domain)
    }
    
    func enumerator(for collection: ContactItem.Identifier) -> any ContactItemEnumerator {
        return rootContainerEnumerator
    }

    func invalidate() async {
        // Stop the enumeration and clean up, in preparation for the extension to terminate.
    }
}
```

## Topics

### Configuring an extension

[`configure(for:)`](/documentation/ContactProvider/ContactProviderExtension/configure(for:))

Configures the extension instance for a domain.

### Managing the extension life cycle

[`invalidate()`](/documentation/ContactProvider/ContactProviderExtension/invalidate())

Invalidates the extension.



---

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)