iOS native app integration

Integrating Appfigurate Library into iOS native apps

iOS native apps can be developed in both Swift and Objective-C.

For Mobile Flutter apps, jump to Mobile Flutter integration. For React Native apps, jump to React Native integration.

Prerequisites

You must have the following:

  • Xcode 15.2+

  • iOS SDKs and associated Simulators.

  • AppfigurateSE macOS app.

  • Appfigurate Simulator app installed into one or more iOS Simulators (use the AppfigurateSE macOS app for easy 1 click installation).

  • Your iOS app must target iOS 13.0+ in order to link Appfigurate Library.

Add AppfigurateLibrary.xcframework to the iOS app target

Choose one of the following integration methods (all of which are compatible with both Swift and Objective-C):

Add a package dependency File ‣ Add Package Dependencies with the URL https://github.com/electricbolt/appfiguratesdk

Add new app into Appfigurate Simulator

Run Appfigurate in the iOS Simulator.

Tap Add app.

Select app type iOS.

Enter a URL scheme that will be used by Appfigurate to launch your app in order to read or apply configuration. The URL scheme must be 4-64 ASCII characters in length and must be unique to your app. e.g. YOUR-APP-URLSCHEME

Tap Add app.

Output source code snippets

Tap YOUR-APP-URLSCHEME.

The Edit app screen will be displayed.

Under the SWIFT/IOS LIBRARY INTEGRATION section:

Tap Output implementation then tap Clipboard.

Create APLConfiguration subclass

In Xcode, tap FileNewNew "Configuration.swift" file from Clipboard.

Note: your public key copied into the clipboard in the Output source code snippets section above will be different to the public key in the following example.

Swift Configuration example

import Foundation
import AppfigurateLibrary

@objcMembers class Configuration: APLConfiguration {

    @BoolProperty(description: "Log debug output to console", restart: false)
    var debugLogging: Bool

    @StringPropertyListEdit(regex: #"https://[\w\.-]+\.yourappserver.com/.*"#, description: "Application server url", restart: false, values: ["Dev":"https://dev.yourappserver.com/api", "Prod":"https://www.yourappserver.com/api"])
    var serverURL: String

    override func allowInvalidSignatures() -> Bool {
        return !ENCRYPTED()
    }

    override func publicKey() -> String {
        // 41 36 87 71 0D 05
        return "-----BEGIN PUBLIC KEY-----\n" +
            "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4TZnKfGeXttN7Rr3eiAZ\n" +
            ...
            "ywIDAQAB\n" +
            "-----END PUBLIC KEY-----\n";
    }

    override func reset() {
        debugLogging = true
        serverURL = "https://www.yourappserver.com/api"
    }

}

@_cdecl("APLConfigurationClass")
func APLConfigurationClass() -> AnyClass {
    return Configuration.self
}

The APLConfigurationClass function with C calling convention must be implemented in your app otherwise a linker error will be issued. The recommended place to implement is at the bottom of your APLConfiguration subclass.

Edit Info.plist

In your apps Info.plist file (right click, Open AsSource Code) include the following. Replace the text YOUR-APP-URLSCHEME with your own app's URL Scheme - the same value you added in the section Add new app into Appfigurate Simulator above.

Info.plist example

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>appfigurate.YOUR-APP-URLSCHEME</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>YOUR-APP-URLSCHEME</string>
        </array>
    </dict>
</array>

If you already have an existing CFBundleURLTypes array in your Info.plist file, then insert just the <dict> ... </dict> portion.

UIApplicationDelegate

In your apps AppDelegate.swift/.m file, include calls to APLApplicationOpenURL and APLDidFinishLaunchingWithOptions. Create any missing delegate methods as appropriate.

Swift UIApplicationDelegate example

import AppfigurateLibrary

...

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    // When your app opens a URL while running or suspended in memory.
    return APLApplicationOpenURL(url)
}

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // After launch.
    APLApplicationDidFinishLaunchingWithOptions(launchOptions)
    return true
}

For apps using UIWindowSceneDelegate

If your app has a UIWindowSceneDelegate, in your apps SceneDelegate.swift/m file, include calls to APLApplicationOpenURL. Create any missing delegate methods as appropriate.

Swift UIWindowSceneDelegate example

import AppfigurateLibrary

...

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    // When your app opens a URL while running or suspended in memory.
    if let url = URLContexts.first?.url {
        APLApplicationOpenURL(url)
    }
}

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // After launch.
    if let url = connectionOptions.urlContexts.first?.url {
        APLApplicationOpenURL(url)            
    }
}

Test your iOS app

To test that you've successfully updated your app 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 screen will now be displayed. You can now change the debugLogging and serverURL properties. Tap Apply⌄ to apply the configuration to your app.

Now jump to Supported property types.

Last updated