# iOS app extension integration

iOS app extensions can be developed in both Swift and Objective-C.&#x20;

Appfigurate Library works in most types of iOS app extensions.

## Prerequisites <a href="#prerequisites" id="prerequisites"></a>

You must perform the following before starting iOS app extension integration:

* [iOS native app integration](/getting-started/ios-native-app-integration.md) of Appfigurate Library.

## Add AppfigurateLibrary.xcframework to the iOS app extension target

In Xcode, tap on your iOS app extension target.

Tap the `General` tab. Tap the `+` button under the `Frameworks, Libraries` section.

Select `AppfigurateLibrary` package.

## Share the iOS app APLConfiguration subclass with the iOS app extension

Share the iOS app's [<mark style="color:blue;">`APLConfiguration`</mark>](https://www.electricbolt.co.nz/api/Classes/APLConfiguration.html) subclass with the iOS app extension.&#x20;

Open your [<mark style="color:blue;">`APLConfiguration`</mark>](https://www.electricbolt.co.nz/api/Classes/APLConfiguration.html) subclass (e.g. `Configuration.swift/m` file) into the Xcode editor.&#x20;

In the `Target Membership` inspection pane tick on your iOS app extension target.

## **Setup Keychain Sharing in the iOS app extension**

Tap on your iOS app extension target.

Tap the `Signing & Capabilities` tabs. Add a `Keychain Sharing` capability with a `Keychain Groups` value that will be common across the iOS app and iOS app extension.&#x20;

We recommend you have a `.shared` suffix on *your* Keychain Groups value.

<figure><img src="/files/v0Ei5gnEF3z6SfstPJXF" alt=""><figcaption></figcaption></figure>

## **Setup Keychain Sharing in the iOS app**

Tap on your iOS app target.&#x20;

Tap `Signing & Capabilities` tabs.&#x20;

Add a `Keychain Sharing` capability with the same `Keychain Groups` value you entered for the iOS app extension above.

<figure><img src="/files/bD05kUxXJf4XE3oARBLQ" alt=""><figcaption></figcaption></figure>

## Edit Info.plist in the iOS app

In your iOS app's `Info.plist` file (right click, `Open As` ‣ `Source Code`) include the `APLKeychainAccessGroup` key replacing the value `nz.co.electricbolt.appfigurateexample.shared` with *your* `Keychain Sharing`'s `Keychain Groups` value.

> `Info.plist` example

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
     <key>APLKeychainAccessGroup</key>
     <string>nz.co.electricbolt.appfigurateexample.shared</string>
     ...
```

{% hint style="warning" %}
If the `APLKeychainAccessGroup` key is not defined, then keychain access group functionality is not used. Do not specify an empty or otherwise invalid `APLKeychainAccessGroup` value.
{% endhint %}

{% hint style="success" %}
iOS app extensions automatically use the `Info.plist` file from the containing iOS app. You do not need to modify the iOS app extension's `Info.plist` file.
{% endhint %}

## Test your iOS app extension

To test that you've successfully updated your iOS app extension to use Appfigurate:

* Compile and run your app to the Simulator instance.
* Launch the Appfigurate Simulator app.
* Tap your applications row. The app will be run and made visible, it's configuration read, and then swap back to Appfigurate.
* Appfigurate's [Configure app](/appfigurate-user-guide/configure-app.md) screen will now be displayed. You can now change the `debugLogging` and `serverURL` properties. Tap `Apply⌄` to apply the configuration to your app.
* Invoke your app extension. It should be using the shared configuration applied to the app.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.electricbolt.co.nz/getting-started/ios-native-app-integration/ios-app-extension-integration.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
