TestMDM 2.0 is now live!

It’s been two years since the release of TestMDM 1.0. Today, I unleash version 2.0 onto the world!

Whilst the aim and core functionality of TestMDM hasn’t changed, I’ve completely overhauled the UI, both from a visual perspective and a usability persepective.


TestMDM 1 used the popular Bootstrap CSS framework and relied on KnockoutJS for interactivity in the UI.

With version 2.0, I decided to use the opportunity to learn ReactJS. This provides what’s called a Single Page Application approach. When you open the dashboard, you should notice that opening a device is very fast and smooth. The UI is completely self contained and doesn’t reply on ASP.Net to generate it each time.

I’ve also opened for the CSS framework called Semantic-UI. Bootstrap is great, but I fancied a change and I like the clean lines and components offered by Semantic-UI.


The biggest change to TestMDM is the way you interact with it. In version 1.0, the focus was around commands. Creating them, sending them, waiting for them to be acknowledged. This was an effort to keep the app aligned with the actualy behaviour of the MDM protocol that underpins iOS.

Whilst it worked well and nobody complained, it always seemed a little repedative. For example, when you are testing configuration, you had to constantly select PList files and queue them, in spite of the fact you probably only made a tiny change to the configuration itself.

In version 2.0, I decidd to move the focus back to the devices and apps, which is what you actually work, rather than commands.

Devices are easier to add now, you only need to scan a QR code or send an SMS. This should make the process a whole lot easier


Once the device has been added, you’ll see a dashboard.


The Device dashboard now shows some detail. You can see what apps are installed, delete the device or clear any pending commands (I’m going to get rid of this soon!).

This will be the place where you can also install configuration profiles and potentially alter other bits and pieces, depending on what you, the user, wants.

When you install an app, you’ll see a clear indication of what’s actually happening






This, I hope, will clear up any confusion about what’s going on and should the installation fail, you’ll get feedback pretty quickly. I should point out that this progress bar isn’t finished and does report some odd stuff, but I’m working on improving this.

When you select an app, you’ll now be taken to a dedicated app page, giving you a single place to manage configuration and feedback.


This let’s you tinker with the configuration directly, without needing to edit a file and resubmit.


In my own testing, this has been the biggest time saver of all.

Another benefit of having a the application broken out like this is the fact you can now bookmark pages for devices and even apps. This will it easy to get back to where you were and carry on testing.

What’s Next?

This is just the initial release, so some features are missing. I’ve turned off the VPP part, since I want to rework it in the same fashion, making it easier to understand (and hiding some of the complexity).

I’m also building an internal admin page for myself, which will let me respond to user issues with more speed.

With this tool proving pretty useful, I’ve got some ideas for exposing an external API and potentially creating an OS X Client so that builds of your IPA can be automatically passed to TestMDM for processing. Think of how TestFlight used to monitor for builds. I’ve never written an OS X app before, so that would be interesting, if nothing else.

All in all, I hope you like this update. Please keep the feedback coming.

Thanks for your support and custom!

TestMDM 2.0

As TestMDM has just had its second birthday (I can’t believe it either), I wanted to start sharing some of the changes I’ve made in version 2.0.

The core of the product remains the same with a few improvements to the code. The biggest change is that TestMDM will now wait for commands to be acknowledged (about 30 seconds), which should reduce the frustration of waiting for that spinner to finally do something!

The UI now uses SemanticUI instead of Bootstrap. The other major change is that part of the app is now written in ReactJS, so it should perform a little faster once you’ve opened the dashboard.

Here is a run through of the various screens.


I’ve not done much to this screen, just removed the clutter.


Adding Devices

I’ve flipped this process on its head. In version 1, you had to visit TestMDM from your mobile to install the profile. In 2.0, you can simple scan a QR code from a device or use an SMS. This should make the process easier.

Device Details

I’ve removed the whole “Commands” thing. As I’ve been using TestMDM for my own app testing, I found I usually use one device and focus on one app. I don’t hop between mutliple devices frequently, so it made sense to have a view per device.


This device screen will let you see what Managed Apps are installed and gives you options to remove the device and clear any pending commands (sorry this took so long!)

Installing Apps

This hasn’t fundamentally changed, but you will now be guided through the process. You still select the IPA (and configuration if desired).


Once you click install, you’ll now see the app’s progress.


This, I hope, will make it much clearer as to what’s actually happening. If the process fails, it will also give you more information as to what went wrong.

Once the app is installed, it will appear under the Device screen.


The UI needs a little work Smile

App Details

It’s now possible to open an App and view its details.


This screen will act as your one-stop-shop for configuration and feedback. Rather than opening the Command and selecting the device etc, you can just type, copy&paste or load existing configuration files. This will save time since you can amend the configuration directly and click “Send”

I’ve got some to clean up this UI a little since it’s not obvious where the text areas are and such.

Go and check it out!

Version 2 is live at https://testmdm.azurewebsites.net if you want to try it today. There are a few kinks and bugs, but it should be compatible with your existing devices etc. You should be able to switch back and forth between the two versions.

Configuration Profile support with TestMDM

I got an email from a prospective user of TestMDM regarding the Single App lock feature. After some reading I learned that whilst this feature only works on Supervised devices, it should be configurable with an MDM.

The App Lock is performed by installing a configuration profile on the device. TestMDM hasn’t supported the ability to install any old configuration profile, so I’ve corrected this.InstallProvisioningProfileYou can now choose a device and upload a PList file containing your configuration profile.

I’m uploading the new build to Azure as I type, so it should be ready to use shortly.

Bundle Selection within TestMDM

A few recent TestMDM customers have had issues with their IPAs due to the fact they have multiple bundles within them. These are extensions to support Today Widgets or the new Apple Watch. Up to now, I’ve gotten lucky, as the Plist.info files within the IPA seem to fall out in the right order, but a new customer reported issues.

To rectify this, I’ve added a new Bundle Selection step to the Install App command. When you choose this command, you will see the normal “Install App” dialog.


Once you have selected an IPA, it gets uploaded and processed. You’ll then see a new drop down appear.InstallCommandDialogWithBundleidSelectorThis will list the various bundles contained within the IPA you’ve uploaded. Select the one that corresponds to your app and you should be good to go.

At only £39.99 for an entire month, TestMDM offers a useful way to test your enterprise apps without the hassle of setting up your own MDM.

Visit http://www.testmdmapp.com to find out more!


TestMDM now supports VPP

After a very kind request from a user, I decided to add basic VPP support to TestMDM.

As of 2 minutes ago, you can now:

  • Add your VPP token.
  • Register new user accounts within your VPP account.
  • Assign licenses to these accounts
  • Install apps from the VPP using the MDM functionality

Adding your VPP token

To get your VPP token, you must first visit https://vpp.itunes.apple.com/ You can then signup your organisation for VPP using a new or existing Apple ID. Once you’ve signed up, open the Account Summary page and download the token.


Back in TestMDM, open your Account Details page and paste the token into the big text box called VPP Token. Then click Save. You’re good to go.


Register New Accounts

Under the VPP section, you will now see a list of user accounts and licenses belonging to your VPP account. If it’s an account you’ve used in the past, you will likely see a lot of information here. I expect I’ll need to clean this up a lot, but for now I’m assuming it’s a new VPP account.

Hit the Register User button. All you need here is an email address to represent the user account. This doesn’t have to be an Apple ID. Imagine this account as an employee of your organisation. In my case, I’d use tomas@coldbear.co.uk as this is my organisation email address. Once you’ve registered the user account, you’ll be presented with a link to invite this user to be part of your VPP. When you open the link, you’ll be prompted to sign into iTunes and you then associate tomas@coldbear.co.uk with an Apple ID (in my case, this is a completely different address).

This does make sense, since people’s Apple ID typically isn’t their work email address.

Assign a License

Once you’ve registered a user account, you can then assign a license to them. A license represents one installation of an app. You purchase them via the Apple VPP page where you registered earlier. You select the app and purchase a certain quantity of licenses.

When purchasing, be sure to select Managed Distribution as the Distribution Type. This is the only mode TestMDM supports at this time. As best I can tell, you get a license for each installation allowed e.g. buy 10 apps and you get 10 licenses.


I’ve purchased two copies of Roomr to illustrate the point.


On the VPP page, you’ll see two licenses listed.


I can then assign one of these licenses to the user account I created.

Install app from VPP

With an app now assigned to a user account, it’s possible to install it directly from the App Store using the MDM functionality. To simplify, there is an install option beside each assigned license.


Clicking it will bring up the familiar “Install An App” dialog, with a small change. There is now a field for an AdamId (an iTunes Store Id for an App). Just choose the device and hit submit. You must be targeting a device that is signed into iTunes using the AppleID you associated with the VPP Account you created in step two. It’s confusing I know, but that’s the way it works!


Once you hit submit, you should receive a notification on the device asking you to confirm installation. If the iTunes Account doesn’t have permission for this app, you’ll see a “CouldNotVerifyAppId” response on the Commands screen.

Next Steps

Once the app has been installed, you can perform the usual configuration.

It’s also possible to Unassign a license. This removes the license from the User Account and subsequently the iTunes Account. You might even get a notification from the iTunes Store once it has taken effect.


The VPP functionality is only available to Unlimited users of TestMDM.

Multiple Device Support with TestMDM

This has been a long time coming, but I finally added multiple devices support to TestMDM

MultipleDeviceSupportWhen you issue a command, you’ll now get the option to select the device you want the command to go to. This makes it easier to test your app on multiple devices.

I’ve also removed the Pay-As-You-Go option and replaced it with a single, 30 day unlimited access license. I’d like be able to spend more time working on TestMDM and I can only do that if I can generate some money.


Exploring apple’s Managedappconfig feedback

In part one of this two part series, I showed how you can use TestMDM to remotely install and configure Apple’s ManagedAppConfig sample app. In this part, I will demonstrate how you can retrieve feedback recorded by the app.

Apple allows an app to read managed configuration by opening the “com.apple.configuration.managed” key in NSUserDefaults. It also allows data to be stored in “com.apple.feedback.managed”. This data can be retrieved by an MDM at any time, allowing the app to effectively report back.

When you launched the ManagedAppConfig app, you will see two labels, Success and Failure, each with a count. The count is zero.


If you hit the go button, you will see the failure count increase to 1. Go ahead and press it a few times.

Now, using TestMDM, update the serverURL value to be a site you know exists. In my case, I’m using www.tomasmcguinness.com. Read part one to see how you update the configuration. Once the app has updated the URL value, hit Go another couple of times. The Success count should increase accordingly.


The app has, in the background, been recoding the values for Success and Failure in the “com.apple.feedback.managed” setting key. We now want to retrieve this data.

From the “Queue Command” menu in the Commands section of TestMDM, choose Fetch App Feedback.

Screen Shot 2014-03-09 at 11.26.21

The Get Managed App Feedback (I need to change the name!) dialog will open.

Screen Shot 2014-03-09 at 11.26.40

Enter “com.example.apple-samplecode.ManagedAppConfig” as the bundle identifier, assuming you haven’t changed it from the value in Apple’s code. The command will be queued.

Screen Shot 2014-03-09 at 11.26.58

Once it has completed success, just click the Show Details option.

Screen Shot 2014-03-09 at 11.27.12

Et Voila, you’ll see a PList formatted document containing two keys, which contains the values in the UI.

If you are interested in testing your own Enterprise apps, you can sign up to TestMDM for free and get one hours free trial.

If you have any questions or comments, please email me tomas@coldbear.co.uk or leave a comment below.

Exploring Apple’s Managedappconfig demo

Having created TestMDM, I’ve had a few people try to experiment with Apple’s ManagedAppConfig sample. This sample is used in their WWDC video on iOS 7’s Enterprise features and demonstrates how to used Managed App Configuration to control a URL and a UISwitch.

Unfortunately, Apple don’t provide anything more than an XCode project, so it’s hard to understand how you’re supposed to evaluate and test the code. This is what this blog post hopes to show. I’ll be using my TestMDM (http://www.testmdmapp.com) service to perform the installation and configuration, but any MDM that supports iOS 7 will be able to do the same thing.

To get started, download the XCode project from Apple. https://developer.apple.com/library/ios/samplecode/sc2279/Introduction/Intro.html

Open it in XCode and compile it. XCode may prompt you to create a provisioning profile for this app, so click Okay and let it work its magic. Once you have successfully compiled the app, you will need to Archive it.

Screen Shot 2014-03-07 at 08.25.18

Once you have successfully archived it, hit the Distribution button to start the packaging process.

 Screen Shot 2014-03-07 at 08.25.36

Sign the with the provisioning profile that was created. In this case, I am using my WildCard development profile.

 Screen Shot 2014-03-07 at 08.26.04

Choose Enterprise deployment and enter “ManagedAppConfig” as the name of the app, leaving all other fields blank. I’m saving these files to my desktop, but you can save them in a location that suits you.

Screen Shot 2014-03-07 at 08.26.26

No that we have both the IPA and Manifesto, we can open up TestMDM and get ready to deploy the app to your device for testing. I am assuming that you have registered a device for testing with TestMDM. If you haven’t please do so before continuing.

Open the commands page view and from the Queue Command dropdown, choose Install App.

Screen Shot 2014-03-07 at 08.34.47

 Screen Shot 2014-03-07 at 08.34.56

Click Browse for Manifest and navigate to where you exported the Archive from XCode. Choose the file with the plist extension.

Screen Shot 2014-03-07 at 08.35.15

Click Browse for IPA and choose the IPA file.

Screen Shot 2014-03-07 at 08.35.27

Both files should upload and you can then choose Submit.

Screen Shot 2014-03-07 at 08.35.35

At this point, you should return to your registered device. It will indicate that there is a pending app installation.


Click install and the app should be downloaded and installed on your device. Launch the app and you’ll see a simple screen showing a URL, a large empty box and a switch at the bottom. We can, using the Managed Configuration, control the value of the URL and the Cloud Sync switch


As you can see, the URL is http://foo.bar and the Cloud Document Sync is turned on. Let’s update these settings. Return to TestMDM and choose “Configure App” from the Queue Commands dropdown.

Screen Shot 2014-03-07 at 08.40.19

The bundle id comes from XCode and I have left it unchanged from the value used in the sample. This unique identifies the app.

The configuration has two settings, serverURL and disableCloudDocumentSync. This configuration is in Apple’s stand PList format. I’m using http://www.testmdmapp.com as the URL, but you can choose any value you wish.I’m also setting the disableCloudDocumentSync value to 1, which will turn off the switch. Click Queue.

In a second or two, the ManagedAppConfig app running on your test device should update.


You have just performed a managed app configuration update.

Part of Managed App Configuration is Feedback. You will notice two counts on the app, one for Success and one for Failure. In my next post, I’ll show how these values can be read from within TestMDM.

If you have any comments or questions, please leave a message here or get in touch using tomas@coldbear.co.uk.

iOS Enterprise managed app configuration

With the release of iOS 7, Apple introduced support for managing an app’s configuration using a Mobile Device Management system. This allows enterprises to deploy apps and then control their configuration centrally. You could provide URLs or enable and disable features with the push of a button.

An app that supports managed configuration just needs to read a particular key, com.apple.configuration.managed from NSUserDefaults. This yields an NSDictionary which contains all the settings pushed to the app via the MDM. For my work with Roomr, I choose to support managed configuration so that the Exchange URL could be set and modified with ease.  The code changes are very simple.

Testing managed configuration is another kettle of fish. You can provide the configuration in one of two ways. Firstly, you can provide the configuration when the app is being installed or you can provide it after the app has been installed, effectively updating it.

To accomplish this, I used my own product, TestMDM. TestMDM aims to replicate many of the features of a MDM without replicating the large cost and complicated setup. It’s aim is to make it possible to test enterprise features without having to suffer the expense of purchasing an MDM. It also means you don’t need to trick an MDM provider into giving you a trial and then spending hours getting that setup.

To test my configuration, I used TestMDM to first install my app. Once I had successfully installed it, I then pushed configuration to it


I just click Queue and TestMDM takes care of the rest. I can debug my iPhone app at the same time and ensure the configuration is detected and loaded correctly.

If you’re interested, please check out TestMDM – I’m making improvements all the time so if a particular feature is missing, let me know and I’ll add it to the roadmap.

For developers who want their apps in large enterprises, supporting iOS7’s Enterprise features, such as single sign-on and managed configuration, is a no-brainer. Hopefully you’ll find TestMDM useful. If you have any questions, please get in touch!