A small tale of bringing push notifications to Windows Azure

Some time ago I got more and more problems on my shared hosting because it couldn’t handle the amount of push notifications I wanted to send. I heard my hosting provider tell me that I was quite often taking more than 90% of the CPU on the server. So I thought to give Windows Azure a try.

I wanted to make optimal use of Windows Azure so I designed my solution to make use of Windows Azure Table Storage to store registered devices and pushchannels. When making use of Azure Table Storage it’s important to choose your RowKey and PartitionKey carefully.

To start with the PartitionKey, I chose to put the ApplicationName in there. I want to send push notifications to different applications I created, like Fokke & Sukke and iBood. So far I haven’t found a reason I made a wrong decision.

And now the RowKey, something that I need to use more carefully. The combination of PartitionKey and RowKey needs to be unique. So I wanted to put the DeviceId of the Device that should receive the PushNotification in there, that combined with the platform identifier. As far as I know there’s nothing that guarantees that the DeviceId is unqiue over different platforms. So I prefix the DeviceId with “WP|” for Windows Phone and “RT|” for Windows 8. The rest was just the copy of the DeviceId. I tested this using the emulator, and everything seems to work fine.

Windows Phone app trouble

After a while I notices reviews telling me that Push Notification don’t work, even further, it didn’t work on my own Windows Phone. After searching for many different reasons for this trouble, I found the source, more or less.

When saving an entity to the Azure Table Storage, every now and then a StorageException occurred. There aren’t many details in the exception, so after attaching Fiddler to my Nokia Lumia 920, I saw interesting stuff happening on the line.

The DeviceId contained special characters. I didn’t notice this when using the emulator, because the DeviceId on the emulator didn’t contain any special characters. So in total I had a percentage of users that could never register because of the StorageException, I still have no idea how large that percentage is, DeviceIds at least regularly contain the ‘/’ character.

Lesson learned, make sure the RowKey and PartitionKey don’t contain special characters: /, \, #, ?

Windows Style app trouble

Besides the Windows Phone issues, I had a very strange behavior on Windows 8 as well. It happened that I was sending a push notification to my local (installed through Visual Studio) app that did not appear. For example I sent a BadgeNotification with value 1 and sometimes the value 17 appeared. I have been trying to find the reason behind it, I never found it. Because when I tried to debug it explicitly with a value like 4 it did show 4. I never got feedback about issues with the push notifications on Windows 8 since my move to Windows Azure, but my dev-machine had troubles.

So after a couple of weeks trying to find causes for the problem I did something that was my final call. I did uninstall the app, and installed the app from the Store. What happened? The pushnotifications started behaving correctly. I have no understanding about the differences between the apps, but it’s good to be aware that there seem to be differences between the app installed from the store and the app installed by Visual Studio.

Your app, featured in the Store, WOW!

The first week of March, one of my Windows 8 apps got featured in the Dutch Windows 8 Store. There are a lot of things you can do to increase the amount of downloads your app is getting, but getting featured helps a lot. Normally the app get’s about 10 to 15 downloads a day, during the featured period it was around 110 each day (178 on March 3rd).

 

image

Of course the “how to get featured” is a big secret. We do know, not providing the promotional art during the submission process will not help your app getting featured.

If you have any tips, please share them in the comments.

dotNed Podcast–Windows 8 and Windows Phone 8

A couple of weeks ago Maurice de Beijer recorded a podcast interview with me for the dotNed usergroup. It’s about Windows 8 and Windows Phone 8, but completely in Dutch. If you’re interested but haven’t listened to it yet, give it a try.

dotNed Podcast - Windows 8 en Windows Phone 8 met Mark Monster

Improve the usability of search in your Windows Style App

When your app could do with the search feature, implement it. But something that’s even more important is the discoverability of search. Not everyone knows how use the charms bar, or doesn’t want to use the charms. When you just start typing in the Store app it starts immediately showing the search pane with the input characters. I suggest you do the same when your apps supports search. How?

One line of code in your App OnLaunched method, I added it just after Window.Current.Activate().

// Show search on keyboard input.
SearchPane.GetForCurrentView().ShowOnKeyboardInput = true;

 

I know this is a very short post, but the API was pretty unknown to me until I tried it myself.

Update 23-01-2013:

Chris Veeningen (@Bloodyairtimer) explained to me that this should only be used on read-only views. So if you instead have an input box in your view this won’t work. So instead you could put the above line of code in the OnNavigatedTo method of your readonly views. I would also set it to false in the OnNavigateTo method of the views that contains input fields. Hope this helps a bit.

Searching a database solution for Windows Phone 7-8 and for Windows 8

I’m preparing for one of my new app-ideas. This app-idea requires a local storage of data, initially I want to create this app for Windows Phone, but I would like to have as much code-reuse as possible. So it would be very nice to have the same database solution for all platforms.

I’ve been using Sterling in the past for Windows Phone. This was before SQL CE was available for Windows Phone. Looking at releases, the last release of Sterling is from June 2011, more than a year and half ago. When I’m looking at the Source Code I’m seeing an resume in commits in last December. So the project is not dead, at least it doesn’t look dead to me. There’s also a discussion on the Future of Sterling which might interest you. There seems to be an issue with Windows Phone 8 which you can easily patch yourself. Okay, interesting, but there is no solution for Windows 8 apps yet.

Let’s explore the other options. SQL CE was added to Windows Phone 7 during one of the updates. However it’s not added to Windows 8 and will probably not be added to Windows 8 because there has been a lot of talking about SQLite in the area of Windows 8. But for Windows Phone 8 SQL CE seems to be lacking and there’s an option to use SQLite for Windows Phone 8 as well. So definitely no SQL CE for me, I want to have a solution that works at least for the whole Phone platform and not just the Windows Phone 7 platform.

So there’s a lot of talking about SQLite? It does support Windows 8 and Windows Phone 8 apps. After some searching there isn’t any official support for Windows Phone 7. I found an article written in 2011 that might help get SQLite on Windows Phone 7. This is an almost solution, maybe I just need to give SQLite a try.

While browsing the Sterling discussions I came around a comment about Lex.DB. This might be an interesting alternative, but it doesn’t support Windows Phone 7 yet. I’ll keep an eye on this project, but it’s very new in this space.

Update 26-01-2013:

In the comments Marcio already says that SQL CE works fine on Windows Phone 8. So even while there isn’t much to be found on that subject it should work. I had to try this myself, so I did. And the end-result? Windows Phone 8 supports SQL CE very well, nothing special that I’ve found in there so far.