<!--
{
  "availability" : [
    "iOS: 26.2.0 -",
    "iPadOS: 26.2.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "AccessoryTransportExtension",
  "identifier" : "/documentation/AccessoryTransportExtension/AccessoryTransportAppExtension",
  "metadataVersion" : "0.1.0",
  "role" : "Protocol",
  "symbol" : {
    "kind" : "Protocol",
    "modules" : [
      "Accessory Transport Extension"
    ],
    "preciseIdentifier" : "s:27AccessoryTransportExtension0ab3AppC0P"
  },
  "title" : "AccessoryTransportAppExtension"
}
-->

# AccessoryTransportAppExtension

A protocol for an extension that transmits data to an accessory you develop.

```
protocol AccessoryTransportAppExtension : AppExtension
```

## Overview

Implement this protocol in an extension with an `EXExtensionPointIdentifier` value of `com.apple.accessory-transport-extension` to relay data to your accessory. The extension supports sharing Wi-Fi networks and forwarding iOS system notifications.

> Important: The system requires your app extension to have the <doc://com.apple.documentation/documentation/BundleResources/Entitlements/com.apple.developer.accessory-transport-extension> entitlement to use this protocol.

## Wi-Fi network sharing

Use this extension with <doc://com.apple.documentation/documentation/WiFiInfrastructure> to share a Wi-Fi network with your accessory. The system calls your extension’s [`accept(sessionRequest:)`](/documentation/AccessoryTransportExtension/AccessoryTransportAppExtension/accept(sessionRequest:)) method when it needs to establish a transport session for Wi-Fi sharing.

In your extension’s target properties, specify the extension point identifier:

```xml
<plist>
    <dict>
        <key>EXAppExtensionAttributes</key>
        <dict>
            <key>EXExtensionPointIdentifier</key>
            <string>com.apple.accessory-transport-extension</string>
        </dict>
    </dict>
</plist>
```

In your extension’s Swift code, implement the protocol and provide an event handler:

```swift
@main
struct TransportExtension: AccessoryTransportAppExtension {
    func accept(sessionRequest: AccessoryTransportSession.Request) -> AccessoryTransportSession.Request.Decision {
        return sessionRequest.accept {
            MyTransportEventHandler(session: sessionRequest.session)
        }
    }
}

class MyTransportEventHandler: AccessoryTransportSession.EventHandler {
    func invalidationHandler(error: AccessoryTransportSession.Error?) {
        // Clean up when the session ends.
    }
}
```

After accepting a session, your extension connects directly to the accessory using <doc://com.apple.documentation/documentation/AccessorySetupKit/ASAccessorySession> and delivers Wi-Fi network data using <doc://com.apple.documentation/documentation/WiFiInfrastructure/WINetworkSharingProvider>.

## Notification forwarding

For notification forwarding, set up your extension the same way as for Wi-Fi network sharing. The system invokes your extension to relay encrypted notification data from your app’s [`AccessoryDataProvider`](/documentation/AccessoryTransportExtension/AccessoryDataProvider) extension to your accessory.

Implement [`dataEventHandler(event:)`](/documentation/AccessoryTransportExtension/AccessoryTransportSession/EventHandler/dataEventHandler(event:)) in your event handler to receive and transmit data:

```swift
class MyTransportEventHandler: AccessoryTransportSession.EventHandler {
    func dataEventHandler(event: AccessoryTransportSession.DataEvent) {
        switch event {
        case .ciphertext(let data, let featureID):
            // Transmit encrypted notification data to accessory over Bluetooth.
            sendToAccessory(data)
        case .plaintext(let data, let featureID):
            // Transmit plaintext data to accessory.
            sendToAccessory(data)
        }
    }
    
    func invalidationHandler(error: AccessoryTransportSession.Error?) {
        // Clean up when the session ends.
    }
}
```

The system encrypts data using keys through your app’s [`AccessoryTransportSecurity`](/documentation/AccessoryTransportExtension/AccessoryTransportSecurity) (ATS) extension and then delivers the encrypted data as `ciphertext` to your handler. Your extension transmits the encrypted data to the accessory, which decrypts the data using shared encryption keys.

> Note:
> Call ``doc://com.apple.AccessoryTransportExtension/documentation/AccessoryTransportExtension/AccessoryTransportSession/cancel(error:)`` on the session if your extension encounters an error that requires terminating the session.

## Topics

### Accepting session requests

[`accept(sessionRequest:)`](/documentation/AccessoryTransportExtension/AccessoryTransportAppExtension/accept(sessionRequest:))

Handles a new session request for the accessory.

[`Decision`](/documentation/AccessoryTransportExtension/AccessoryTransportSession/Request/Decision)

An opaque type returned from the incoming session handler of an event listener.

### Handling session events

[`EventHandler`](/documentation/AccessoryTransportExtension/AccessoryTransportSession/EventHandler)

A protocol that defines methods for handling transport session events.

[`DataEvent`](/documentation/AccessoryTransportExtension/AccessoryTransportSession/DataEvent)

An enumeration of data events that the transport extension receives.

### Managing sessions

[`AccessoryTransportSession`](/documentation/AccessoryTransportExtension/AccessoryTransportSession)

A class that manages a transport session between the extension and the system.

## Relationships

### Inherits From

[`AppExtension`](/documentation/ExtensionFoundation/AppExtension)

---

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)