Roomr 2.7.5 – More Diagnostics

One of the most common bugs reported in Roomr is an incorrect free/busy calculation. I’ve done a lot of work over the past few months to make this more and more intelligent, handling parallel meetings, tentative meetings and multi-day meetings. Each time I submit a version, I wonder who the next incorrect report will manifest itself!

To help make it easier for user’s to report this back to me, I’m adding more direct diagnostic options. In the last beta of Roomr 2.7.5, you can now report from the Favourites screen.

Firstly, enable Diagnostics on the settings screen.

iOS Simulator Screen Shot 5 May 2015 09.50.11

Once back on the favourites tab, identify the room that is reporting the wrong status. Just press and hold on the row for about two seconds and an option popup will appear.

iOS Simulator Screen Shot 5 May 2015 09.50.36Press “Email Diagnostics” and you’ll be presented with a draft email containing the data returned by Microsoft Exchange. If there is any sensitive data in here you wish to remove, such as meeting subjects, you can edit this here before sending it to me. You can also add any relevant information that you think would be helpful.

Using this data, I can then debug the availability calculator and find out when it’s wrong!

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 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 to find out more!


ActiveSync Contacts Server

I didn’t get as much time this week to work on my ActiveSync server as I would have liked, but I’m happy to say I have Contacts now syncing. Syncing is a stretch, since it only works one way!

I’ve published the service to Azure, so if you’d like to test it out, you can follow these steps. I’ve tested it against iOS, so I’m not sure how Android or Windows Phone will cope.

IMG_0008Under settings, choose Mail, Contacts, Calendars and press “Add Account”. Select Exchange.IMG_0009Fill any old rubbish into the next screen. I haven’t added AutoDiscovery support, so this step will just fail after a few seconds and you’ll be prompted to enter the details manually.

IMG_0011Enter as the Server. The username and password values don’t matter here either.

Once you hit Next, it will verify the details and you should see blue ticks appear beside the entries. Hit Done.


Unselect Mail, Calendars, Reminders and Notes and hit Save. My ActiveSync server doesn’t support any of these, but it will serve to keep your iPhone from being cluttered with useless folders. Once you hit save, it should sync down the contacts into a folder called “Recruitment Agents” and be populated with the members of the Avengers.


My aim here is to create a directory of recruitment agents, so you’ll know who’s calling and what agency they are from. I think this could grow into an inbox and calendar, so agents email to a dedicated inbox and can create interview appointments for you, that sort of thing.

I also want to support Direct Push, but I’m not 100% sure how to make that work efficiently, so Push it disabled at the moment.

If you do test it out, I’d be grateful for your feedback (works, doesn’t work, etc.). Email me or tweet me.


Beginning ActiveSync Server

In order to occupy my mind whilst I look for a contract role (if you have one, please let me know!), I decided to start digging into ActiveSync and see what would be involved in building a simple server.

As I’m looking for a new role, I get calls from recruitment agents here in the UK and it’s a little hard to keep track of, especially if I’m out and about. Wouldn’t it be nice if I could just add a predefined list of contacts to my phone? That way I’ll always know who’s calling and what agency they are from [Most of the time – some agents block their numbers]. Another benefit is that when I’m done job hunting, I can remove all the contacts by simply removing the settings from my iPhone, instead of clogging up my personal contacts and having to delete them one by one. It also lets me add agencies that haven’t yet called me.

So enough about my “motivations”. I want to document this journey with a little detail, mainly so I have something to refer back to in the coming months. ActiveSync, to give you a little background, is a Microsoft Protocol designed for mobile devices to enable them to sync data with Exchange server. It’s standard across all major mobile platforms and is used by Outlook and other Exchange clients. I always though it was a closed protocol, but I discovered that it’s fully documented and doesn’t need to be licensed anymore!  A quick Google and I found a ZIP containing 132 PDFs, covering the entire spec. I don’t know about you, but this is heaven for me. I love turning specifications into working software!

The starting point was [MS-ASHTTP].pdf , which covers the basics of the HTTP protocol. After implementing the OPTIONS verb in my API, I was able to get the iPhone to add my server. The OPTIONS verb returns basic information about the server, such as its version and the commands it supports. Nothing crazy!


The first issue was the SSL. I had to add the server, let validation fail, save the settings and then disable SSL under Advanced Settings before trying again. Once I had successfully added the server, I turned off all data with the exception of Contacts.


You can see that the “Automatic Reply” setting is “Loading”. I’ve no idea what to return to make that go away, so it’s something I will need to come back to at a future date.

With my iPod successfully connected to my ActiveSync server, I now needed to understand the Commands and the Sync process. This involved reading  [MS-ASCMD].pdf. Not all of it, but just the sections on FolderSync and Sync.  Having grasped the basics of the flow, I ran into a wall named WBXML!

WBXML is a standard for encoding XML to reduce payload size. Created back in the WAP days, it’s still in use. As luck would have it, I wrote a WBXML parser back in 2001 when I worked for CMG, so I knew the principal. Rather than do it again, I copied Microsoft’s sample code :)

With a working WXML encoding/decoder, I was in business!  Or so I thought!

I’ll save you my tale of woe and angst, sufficeit to say the WebAPI MediaFormatters caught me out. When ever I returned data to the iPod, I would get a cryptic message in the logs about a code page not being selected. After lots of fiddler and Wiresharking, I realised by perfect WBXML was being converted to JSON by the WebAPI ! I added a new MediaFormatter and, bingo, my contacts folder appeared on my iPod.

IMG_0006It was, of course, empty!


After some more reading, I figured out how to add a Contact!

IMG_0002I celebrated with a macaroon. There is, of course, lots more to do and tracking sync changes is not an easy thing to do, but my aim is simple. I will add a simple web interface and database.  It is then a matter of adding the details of the various recruitment agenicies .

I’ll be blogging again soon I hope!


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 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 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 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. – the end of active support and development

PassVerse has been part of my life since I first sketched out the idea on a Virgin flight to Las Vegas in the summer of 2012.

It has grown and morphed over the intervening years, taught me lots and made me feel both despair and joy! Alas, all things must come to an end. I’ve been putting this decision off for the past couple of months, but the time has come to procrastinate no longer.

With today’s release of version 1.5.0, I’ll no longer be supporting or actively developing new features.

I have come to realise that  my interest and passion lies in writing code and solving technical problems. This is just who I am and acknowledging I have no interest in advertising, marketing, self promotion or networking is something I needed to do. These things are vital to building a business and simply hoping that technical brilliance will suffice, is just silly.

I have avoided this acknowledgment because I saw it as an one of failure or as something that would prevent me from ever trying again. I haven’t failed. PassVerse didn’t become a sustainable business, but if I’m honest, I never wanted it to. I never committed to it. I actually felt guilty that I wasn’t updating it more frequently. Once I’d admitted that stopping wasn’t the same as giving up, I felt a weight lift off my shoulders.

I feel that PassVerse still has a lot of potential. The website generates logs of organic traffic and with the Apple Watch supporting Passbook, I’m sure interest will grow after its release. Because of this, I’m going to sell PassVerse, lock, stock and barrel, to anyone interested in taking it forward. I’d rather see somebody take ownership of it rather than let it gather dust. If you’re interested, please drop me a line.

I’d like to end by saying I’m very grateful to all those who have purchased PassVerse and I hope you don’t feel like I have left you down.