Configuring SnapKiosk
via MDM.
SnapKiosk reads its homepage, idle behavior, and lockscreen branding from Apple's standard Managed App Configuration. Push a single dictionary from your MDM and every iPad in your fleet picks it up — no per-device typing, no QR codes, no on-device admin steps. This page documents every key, the validation rules, and how to wire it up in the major MDMs.
On this page
1.How it works
iOS exposes MDM-delivered settings to every app via a standard UserDefaults key: com.apple.configuration.managed. When you push a Managed App Configuration profile, iOS writes the dictionary you supplied under that key — and SnapKiosk reads it at launch.
SnapKiosk uses a single dictionary with up to nine string/number/bool fields. Push it once, paired with the app install, and the kiosk arrives ready to run. If the dictionary is missing, SnapKiosk falls back to the welcome screen (where an on-device admin would type the URL manually).
Precedence
If both MDM config and an on-device saved config exist, MDM wins. The Settings UI on-device shows a "Managed by your IT team" banner and disables editing. To change a managed kiosk's settings, update the profile in your MDM and re-push.
2.The configuration schema
Every key SnapKiosk reads from com.apple.configuration.managed. Field names are case-sensitive.
| Key | Description |
|---|---|
homeURLRequired
String
|
The page the kiosk loads on launch and after every idle reset. Must be a fully-qualified http:// or https:// URL with a host. Anything else is rejected and the kiosk reverts to the welcome screen. |
idleResetSecondsOptional
Number
|
Seconds of no touch input before SnapKiosk wipes cookies, cache, IndexedDB, HTTP credentials, and back-history and reloads the home page. Default 300. Minimum effectively 10 seconds. |
idleWarningSecondsOptional
Number
|
Seconds before the reset at which the "Still there?" warning popup appears with a "Keep going" button. Default 30. Set to 0 to disable the warning entirely — the screensaver / wipe still fires at the full idleResetSeconds threshold. |
screensaverEnabledOptional
Bool
|
When true (default), the kiosk shows a full-screen "Tap to begin" attract overlay at the idle threshold and waits for the next user's touch before wiping + reloading. When false, the wipe + reload fires silently at the threshold with no visible overlay. |
lockscreenTitleOptional
String — MDM-only
|
Replaces the default "Tap to begin" headline on the attract screen. Empty strings are treated as "unset" so you can clear the override by sending "". |
lockscreenSubtitleOptional
String — MDM-only
|
Replaces the default "Touch anywhere on the screen to start" subtitle. Also surfaced inside the error overlay when the homepage can't load (paired with "Contact your IT administrator") — admins typically put their helpdesk address here so customers see who to call when a kiosk goes down. |
lockscreenLogoURLOptional
String — MDM-only
|
HTTPS URL to a PNG or JPG logo. SnapKiosk fetches and caches it for the attract screen, replacing the default pulsing tap icon. Renders at up to 260×180 pt. |
lockscreenTintHexOptional
String — MDM-only
|
Accent color for the attract screen — used on the tap icon, retry buttons, and logo glow. Accepts #RGB, #RRGGBB, or #RRGGBBAA hex. Falls back to the SnapKiosk default blue if invalid. |
lockscreenBackgroundHexOptional
String — MDM-only
|
Background color for the attract and error screens. Same hex formats as above. Falls back to black if invalid. |
The five lockscreen* keys are intentionally MDM-only — they're not surfaced in the on-device Settings UI because branding belongs to IT, not to the customer-facing tablet.
3.A minimal example
The smallest valid payload — just point the kiosk at a URL and accept every default.
<?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>homeURL</key>
<string>https://kiosk.example.com</string>
</dict>
</plist>
Defaults applied: 5-minute idle reset, 30-second "Still there?" warning, attract screensaver on, SnapKiosk-blue accent on the default attract icon.
4.A complete example (with branding)
Every supported key, with reasonable production values. Push this to a fleet to get a fully-branded kiosk with the IT contact line visible to customers when something breaks.
<?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>
<!-- Core kiosk behavior -->
<key>homeURL</key>
<string>https://kiosk.acme.corp/check-in</string>
<key>idleResetSeconds</key>
<integer>180</integer>
<key>idleWarningSeconds</key>
<integer>20</integer>
<key>screensaverEnabled</key>
<true/>
<!-- Lockscreen / attract branding -->
<key>lockscreenTitle</key>
<string>Welcome to Acme</string>
<key>lockscreenSubtitle</key>
<string>Tap anywhere to start. Need help? helpdesk@acme.corp</string>
<key>lockscreenLogoURL</key>
<string>https://cdn.acme.corp/branding/logo-white.png</string>
<key>lockscreenTintHex</key>
<string>#FF6B00</string>
<key>lockscreenBackgroundHex</key>
<string>#0A0F1F</string>
</dict>
</plist>
The helpdesk-in-subtitle trick
The error overlay (shown when the homepage can't load) automatically prepends "Contact your IT administrator" and then displays your lockscreenSubtitle as the body text. So putting your support email or extension in that field gives customers a path to report a down kiosk — without adding a new MDM key.
5.Console-specific notes
Each MDM has its own UI for delivering Managed App Configuration. The mechanism is identical (it ends up in com.apple.configuration.managed on the device) — only the path through the console differs.
Jamf Pro
Apps → Mobile Device Apps → SnapKiosk → App Configuration tab → paste the inner <dict> contents (without the outer plist wrapper). Scope to your kiosk smart-group.
Microsoft Intune
Apps → App configuration policies → Add (Managed apps or Managed devices) → select SnapKiosk → upload the XML, or use the property-list editor to enter keys one at a time.
Mosyle
Management → Application Management → SnapKiosk → Managed App Configuration → paste the XML. Assign to the kiosk device group.
Kandji
Library → Add Library Item → App Config (Managed Apps) → select SnapKiosk → paste the XML. Add to the kiosk blueprint.
JumpCloud
Policy Management → New iOS policy → App Configuration → choose SnapKiosk → paste the XML or build the dictionary in the property editor. Bind to the kiosk device group.
Workspace ONE
Resources → Apps → Public Apps → SnapKiosk → Assignment → Application Configuration → upload the XML or build the dictionary inline. Save and publish to the device group.
6.Validation & rejected values
SnapKiosk validates the config at launch. If anything is structurally wrong, the kiosk falls back to either an on-device saved config or the welcome screen — whichever applies. This is deliberate: a typo in MDM shouldn't strand a fleet on a blank page.
- Missing
homeURL— the entire managed config is rejected; SnapKiosk falls back to on-device or welcome. homeURLhas no host ("https:///","not-a-url") — rejected.homeURLuses an unsupported scheme (file://,javascript:,ftp://) — rejected. Onlyhttpandhttpsare accepted.- Empty string in any optional field — treated as "unset"; the default applies. Useful for clearing a field without having to delete the key.
- Invalid hex color (
"zzzz","#GGG","") — silently ignored; the default color applies. - Bogus
lockscreenLogoURL— fetched anyway; if it fails, the attract screen falls back to the default tap icon. The rest of the config still applies.
What doesn't roll back
If you push a config with a typo in homeURL and the device already has an on-device saved config, the kiosk uses the on-device one. If there's no on-device config either, the welcome screen appears and the kiosk waits for human input — your fleet won't crash, but it won't run either. Fix the MDM payload and re-push.
7.Verifying the config arrived
Three ways to confirm a kiosk picked up the pushed config:
- On-device — open Settings via the two-finger admin gesture. A "Managed by your IT team" banner at the top of Settings means MDM config is active and the fields are non-editable.
- The last-load beacon — SnapKiosk writes the current URL to
com.snapapps.SnapKiosk.lastLoadin standardUserDefaultson every successful page load. Any MDM that can query app preferences can read it. Details in the ASAM guide. - Diagnostics log — Settings → Diagnostics shows recent crashes, hangs, and CPU exceptions captured by MetricKit. A clean list with a recent timestamp means the app launched and ran. Also written to
diagnostics.jsonin the app's Documents container.
8.Troubleshooting
The kiosk shows the welcome screen instead of my URL
The managed config didn't arrive, or it failed validation. Check, in order:
- The app was installed via MDM (not sideloaded or App Store-installed by the user) — Managed App Configuration only attaches to MDM-delivered installs.
- The configuration profile is scoped to the right device group.
- The
homeURLis a fullhttps://URL with a host — notkiosk.example.comalone, notwww.-only. - Field names are exact, case-sensitive (
homeURL, nothomeUrlorHomeURL).
Settings shows my values but the lockscreen still has the SnapKiosk defaults
The branding fields are optional and silently fall back to defaults on any parse failure. Common causes:
- Hex colors missing the
#are fine (we accept either), but typos in the hex (non-hex characters, wrong length) silently fail.#FF6B00works;#FF6BX0falls back. - The
lockscreenLogoURLmust be a real, reachable image. Inspectdiagnostics.jsonor run a test load from the iPad's browser. - Empty strings are intentionally treated as "unset" — make sure you're pushing actual values, not blank strings.
I updated the MDM config but the iPad still shows the old values
Managed App Configuration is delivered on the next MDM check-in, not immediately. Either wait for the next regular sync window, force a sync from your console (Jamf: Update Inventory; Intune: Sync; etc.), or restart SnapKiosk on the device — the config is re-read on every app launch.
I want a single device to override the MDM config temporarily
You can't. MDM config takes precedence over the on-device saved config — this is by design, so a customer can't permanently break a managed kiosk via Settings. To change one device, change the MDM profile scoped to it.
Next steps
Pair this config with an ASAM authorization profile to fully lock the device to SnapKiosk. See the ASAM setup guide →