Managed App Configuration setup for iOS app

NOVASOLUTIONS.TECHNOLOGY is engaged in the development, support and maintenance of iOS, Android, PWA mobile applications. We have extensive experience and expertise in publishing mobile applications in popular markets like Google Play, App Store, Amazon, AppGallery and others.
Development and support of all types of mobile applications:
Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1 servicesAll 1735 services
Managed App Configuration setup for iOS app
Medium
from 1 business day to 3 business days
FAQ
Our competencies:
Development stages
Latest works
  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    445

Configuring Managed App Configuration for iOS Apps

Managed App Configuration—Apple MDM mechanism allowing IT admin to pass config to app without user involvement and without hardcoding parameters. MDM server sends plist dictionary, app reads from UserDefaults. Standard for any corporate iOS app—works with Jamf, Intune, Workspace ONE, MobileIron, any MDM.

How App Reads Managed Config

Everything stored in UserDefaults under key com.apple.configuration.managed:

func loadManagedConfiguration() {
    guard let config = UserDefaults.standard.dictionary(forKey: "com.apple.configuration.managed") else {
        // Device unmanaged or config not yet delivered
        applyDefaultConfiguration()
        return
    }

    let backendURL = config["BackendURL"] as? String ?? AppDefaults.backendURL
    let tenantID = config["TenantID"] as? String
    let sessionTimeout = config["SessionTimeoutMinutes"] as? Int ?? 30
    let enableDebugLogs = config["EnableDebugLogs"] as? Bool ?? false

    AppConfig.shared.apply(
        backendURL: backendURL,
        tenantID: tenantID,
        sessionTimeout: sessionTimeout,
        debugLogs: enableDebugLogs
    )
}

One gotcha: config may not arrive immediately on first launch, but after MDM checkin. App shouldn't block waiting—apply defaults, then update later.

Reacting to Configuration Changes

MDM can update config anytime—e.g., change backend URL during infrastructure migration. React without restart:

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(
        self,
        selector: #selector(managedConfigChanged),
        name: UserDefaults.didChangeNotification,
        object: nil
    )
}

@objc private func managedConfigChanged() {
    guard let newConfig = UserDefaults.standard.dictionary(forKey: "com.apple.configuration.managed") else { return }

    let newBackendURL = newConfig["BackendURL"] as? String
    if newBackendURL != AppConfig.shared.backendURL {
        // Reinitialize network layer with new URL
        NetworkManager.shared.reconfigure(baseURL: newBackendURL)
    }
}

UserDefaults.didChangeNotification fires on any UserDefaults change—filter relevant key to avoid reloading on every minor change.

Configuration Dictionary Structure

Recommended—JSON Schema documenting config keys. AppConfig Manager on app side:

struct ManagedConfig: Decodable {
    let backendURL: String
    let tenantID: String?
    let sessionTimeoutMinutes: Int
    let allowBiometricAuth: Bool
    let supportedLanguages: [String]
    let featureFlags: [String: Bool]?

    enum CodingKeys: String, CodingKey {
        case backendURL = "BackendURL"
        case tenantID = "TenantID"
        case sessionTimeoutMinutes = "SessionTimeoutMinutes"
        case allowBiometricAuth = "AllowBiometricAuth"
        case supportedLanguages = "SupportedLanguages"
        case featureFlags = "FeatureFlags"
    }
}

func decodeManagedConfig() -> ManagedConfig? {
    guard let dict = UserDefaults.standard.dictionary(forKey: "com.apple.configuration.managed"),
          let data = try? JSONSerialization.data(withJSONObject: dict),
          let config = try? JSONDecoder().decode(ManagedConfig.self, from: data) else {
        return nil
    }
    return config
}

Typed struct better than manual type casting from [AnyHashable: Any]—config errors caught earlier.

AppConfig in MDM Consoles

In Jamf Pro configure in Apps → App Configuration → XML Profile:

<dict>
    <key>BackendURL</key>
    <string>https://api.corp.example.com/v2</string>
    <key>TenantID</key>
    <string>CORP-EU-001</string>
    <key>SessionTimeoutMinutes</key>
    <integer>20</integer>
    <key>AllowBiometricAuth</key>
    <true/>
    <key>SupportedLanguages</key>
    <array>
        <string>en</string>
        <string>de</string>
    </array>
</dict>

In Intune via Apps → App Configuration Policies → Managed Devices → iOS/iPadOS → General. Values entered as key-value or XML. Intune sends via Apple MDM protocol—same com.apple.configuration.managed key.

Testing Without MDM Server

For development, simulate config via UserDefaults.standard.set() in launch args or separate debug screen:

#if DEBUG
func injectTestManagedConfig() {
    let testConfig: [String: Any] = [
        "BackendURL": "https://staging-api.corp.example.com",
        "TenantID": "TEST-001",
        "SessionTimeoutMinutes": 5,
        "AllowBiometricAuth": true
    ]
    UserDefaults.standard.set(testConfig, forKey: "com.apple.configuration.managed")
}
#endif

Also test in Simulator with Managed Preferences via defaults write in terminal—emulates real MDM delivery without actual MDM server.

Feedback Channel: Status Report to MDM

MDM can not only send config, but read app state via com.apple.configuration.managed.feedback. App writes status:

UserDefaults.standard.set([
    "LastSyncTime": ISO8601DateFormatter().string(from: Date()),
    "ConfigVersion": "2.1",
    "EnrollmentStatus": "active"
], forKey: "com.apple.feedback.managed")

MDM server (Jamf, Intune) reads key on checkin, displays in device inventory. Convenient for diagnostics without user contact.

Implementation Stages

Define config parameters → develop dictionary schema → implement reading + reaction → test without MDM → publish documentation for IT → configure profiles in MDM console → pilot → rollout.

Timeline: implement Managed App Configuration in ready app—1–2 weeks. Cost is calculated individually.