<!--
{
  "availability" : [
    "iOS: 16.0.0 -",
    "iPadOS: 16.0.0 -",
    "macCatalyst: -",
    "macOS: 15.0.0 -",
    "visionOS: 1.0.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "DeviceDiscoveryExtension",
  "identifier" : "/documentation/DeviceDiscoveryExtension",
  "metadataVersion" : "0.1.0",
  "role" : "Framework",
  "symbol" : {
    "kind" : "Framework",
    "modules" : [
      "DeviceDiscoveryExtension"
    ],
    "preciseIdentifier" : "DeviceDiscoveryExtension"
  },
  "title" : "DeviceDiscoveryExtension"
}
-->

# DeviceDiscoveryExtension

Stream media to a third-party device that a user selects in a system menu.

## Overview

Use DeviceDiscoveryExtension (DDE) to discover third-party media receivers to which your app can stream AV content.

When a user invokes your app’s media-streaming UI, you can offer a third-party, local-network, or Bluetooth device as a streaming destination in a route picker view (<doc://com.apple.documentation/documentation/AVKit/AVRoutePickerView>). The figure below illustrates actors in the discovery process. As depicted in the System section, your app’s device discovery extension loads when the view displays.

![A flowchart with four boxes in a horizontal row from left to right, each labeled respectively: user, app, system, and third-party device. Lines that represent channels extend downward from each box. At the top of the user channel is the start of a continuous arrow that traces a path with switchbacks through all the channels. Multiple steps of the device discovery process are shown in this path with arrows that indicate the order in which they occur, from the user invoking it until the third-party device plays the media.](images/com.apple.devicediscoveryextension/media-4056835@2x.png)

Once the extension loads:

- The extension runs in a system process and searches the local network and Bluetooth devices for a specific media receiver.
- When the extension finds the device, it returns the device to the system, which displays it in the picker view as an available option.
- The user makes a selection and the system passes the chosen device to the app, which can then stream media to the device.

Because DDE runs in a system sandbox, the extension doesn’t need to ask the user for local-network or Bluetooth permissions. The picker view displays discovered third-party devices and protocols in the same system menu as AirPlay, which provides a unified device-selection experience.

> Note:
> To stream to a third-party device that you don’t manufacture, bundle your app with the device discovery extension that the manufacturer provides as part of its SDK.

## Topics

### Essentials

[Discovering a third-party media-streaming device](/documentation/DeviceDiscoveryExtension/discovering-a-third-party-media-streaming-device)

Build an extension that streams media to a server app in iOS or macOS.

  <doc://com.apple.documentation/documentation/BundleResources/Entitlements/com.apple.developer.media-device-discovery-extension>

### Extension

[`DDDiscoveryExtension`](/documentation/DeviceDiscoveryExtension/DDDiscoveryExtension)

A specification that enables the framework to start and stop the extension’s discovery process.

[`DDDiscoverySession`](/documentation/DeviceDiscoveryExtension/DDDiscoverySession)

An object that relays device discovery events from the extension to the system.

[`DDDiscoveryExtensionConfigurationProtocol`](/documentation/DeviceDiscoveryExtension/DDDiscoveryExtensionConfigurationProtocol)

A specification that provides a communication channel between the extension and the framework.

### Life cycle

[`DDDeviceEvent`](/documentation/DeviceDiscoveryExtension/DDDeviceEvent)

An object that provides a device or communicates its change in status.

[`DDDeviceEvent.EventType`](/documentation/DeviceDiscoveryExtension/DDDeviceEvent/EventType-swift.enum)

Identifiers for the types of events that occur in the device discovery life cycle.

[`DDEventTypeToString(_:)`](/documentation/DeviceDiscoveryExtension/DDEventTypeToString(_:))

Returns human-readable text for the specified event identifier.

[`DDEventHandler`](/documentation/DeviceDiscoveryExtension/DDEventHandler)

A function that the extension invokes to signal an event.

### Device information

[`DDDevice`](/documentation/DeviceDiscoveryExtension/DDDevice)

An object that describes a discovered device of interest.

[`DDDevice.Category`](/documentation/DeviceDiscoveryExtension/DDDevice/Category-swift.enum)

An option that determines the icon for the device in the picker UI.

[`DDDeviceState`](/documentation/DeviceDiscoveryExtension/DDDeviceState)

A state that represents the level of user interaction with the device.

[`DDDeviceCategoryToString(_:)`](/documentation/DeviceDiscoveryExtension/DDDeviceCategoryToString(_:))

Returns human-readable text for the specified identifier that describes a device’s category.

[`DDDeviceStateToString(_:)`](/documentation/DeviceDiscoveryExtension/DDDeviceStateToString(_:))

Returns human-readable text for the specified identifier that describes a device’s status.

[`DDDevice.Protocol`](/documentation/DeviceDiscoveryExtension/DDDevice/Protocol-swift.enum)

An identifier for the manner in which an app interacts with a device.

[`DDDeviceProtocolToString(_:)`](/documentation/DeviceDiscoveryExtension/DDDeviceProtocolToString(_:))

Returns human-readable text for the specified protocol identifier.

[`DDDeviceProtocolString`](/documentation/DeviceDiscoveryExtension/DDDeviceProtocolString)

String values for the manner in which an app interacts with a device.

[`DDDeviceMediaPlaybackStateToString(_:)`](/documentation/DeviceDiscoveryExtension/DDDeviceMediaPlaybackStateToString(_:))

Returns human-readable text for the specified media playback state.

### Errors

[`DDError`](/documentation/DeviceDiscoveryExtension/DDError)

An error that the framework reports.

[`DDError.Code`](/documentation/DeviceDiscoveryExtension/DDError/Code)

Codes that identify errors that can occur during the framework’s use.

[`DDErrorHandler`](/documentation/DeviceDiscoveryExtension/DDErrorHandler)

A function that executes code you provide when an operation returns an error or completes successfully.

[`DDErrorOutType`](/documentation/DeviceDiscoveryExtension/DDErrorOutType)

A type for framework functions that return error references.

[`DDErrorDomain`](/documentation/DeviceDiscoveryExtension/DDErrorDomain)

A unique error domain for the framework.

### Reference

[DeviceDiscoveryExtension Enumerations](/documentation/DeviceDiscoveryExtension/devicediscoveryextension-enumerations)



---

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)