Tuesday, January 24, 2012

Turning an iPad into a kiosk device

So I was asked to set up an iPad so that once an app was running it couldn't be quit. This is becoming a fairly common use case as iPads make their way into retail and other public spaces as kiosk or POS devices.

Looking at MDM solutions and combing the wisdom of StackOverflow didn't tell me how, in fact the resounding answer was "can't be done" or "only with jailbreak".

Of course if you have been into an Apple store recently you will know that this is possible because next to every display device is an iPad running their smart sign app with the home button disabled. So how do they do it?

It is actually really simple. All you need is a mobile configuration profile that sets the iPad into 'Store Demo' mode. The relevant key is SBStoreDemoAppLock in com.apple.springboard.plist and can be set with a config profile.


It is actually pretty trivial to make this work, all you need to do is install a correctly formatted mobile config plist over the air from a web server. It's possible that you can load the config using IPCU too but I have not tried this. You can combine this with whatever other enterprise configuration profiles you have in play. It also works on iPhones.

BEWARE
Once this profile is installed the first app that is launched when the device is rebooted will be the only app that will run until you reboot the device again.
To remove the profile plug the device into IPCU and delete it then reboot the device. Everything will be back to normal.


Hopefully this will help anyone else trying to the same thing only to be told it's not possible.

 <?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>PayloadContent</key>  
   <array>  
     <dict>  
       <key>PayloadDescription</key>  
       <string>Disables home</string>  
       <key>PayloadDisplayName</key>  
       <string>Home Button Lock</string>  
       <key>PayloadIdentifier</key>  
       <string>com.hbkill.kiosk</string>  
       <key>PayloadOrganization</key>  
       <string>My Org</string>  
       <key>PayloadType</key>  
       <string>com.apple.defaults.managed</string>  
       <key>PayloadUUID</key>  
       <string>B2D02E2D-BAC5-431B-8A29-4B91F71C9FC1</string>  
       <key>PayloadVersion</key>  
       <integer>1</integer>  
       <key>PayloadContent</key>  
       <array>  
         <dict>  
           <key>DefaultsDomainName</key>  
           <string>com.apple.springboard</string>  
           <key>DefaultsData</key>  
           <dict>  
           <key>SBStoreDemoAppLock</key>  
           <true/>  
           </dict>  
         </dict>  
       </array>  
     </dict>  
   </array>  
   <key>PayloadDescription</key>  
   <string>Disables Home Button</string>  
   <key>PayloadDisplayName</key>  
   <string>Home Button Lock</string>  
   <key>PayloadIdentifier</key>  
   <string>com.hbkill</string>  
   <key>PayloadOrganization</key>  
   <string>My Org</string>  
   <key>PayloadType</key>  
   <string>Configuration</string>  
   <key>PayloadUUID</key>  
   <string>614D1FE3-F80D-4643-AF6B-D10C4CC8737A</string>  
   <key>PayloadVersion</key>  
   <integer>1</integer>  
 </dict>  
 </plist>