Monday, December 27, 2010

Delayed Push Notification Service for Windows Phone

This is a multi part blog post the other posts in this series are:
  • Overview – you’re reading this now.
  • The push notification service – how to implement the delayed push notification service
  • The client library – not yet written.
In this post I discuss push notifications, and share my web service which implements a delayed push notification.
Push notifications are a web service that MS provides that can send a message to the phone. There are 3 flavors of push notifications:
  1. Raw notification: Raw bytes - ignored if your app isn't running, sent to your app if it's running. 
  2. Tile notification: Manipulate application tile, worth it's own blog post. 
  3. Toast notifications: If your app isn't running pop up a toast giving a message to the user. 
An interesting detail about the push notification web service is how the web service is addressed, and how the phone is identified. I'd expected something like this: But instead you get the more elegant:

// doesn't work like this.
    proxy = CreateProxy("http://well-known-push-notification-service")
    proxy.push-toast(id-for-running-app-phone-taken-from-phone, "toast text")
    proxy.push-toast(id-for-running-app-phone-taken-from-phone, "toast text2")
// works like this.
    proxy = CreateProxy(id-for-running-app-phone-taken-from-phone-with-built-in-service-url)
    proxy.push-toast("toast text") // no need to specify phone/app id
    proxy.push-toast("toast text2") // no need to specify phone/app id
An annoying limitiation of push notifications is you can't schedule them at arbitrary times. From MSDN:
sendNotificationRequest.Headers.Add("X-NotificationClass", ""); 

// Possible batching interval values:
// 3: The message is delivered by the Push Notification Service immediately.
// 13: The message is delivered by the Push Notification Service within 450 seconds.
// 23: The message is delivered by the Push Notification Service within 900 seconds.
As a result I decided to write a simple web service which will allow you to send your app push notifications.  The sequence diagram for this service is:

The API for this web service is:
http://{root}/push-toast
        POST a query string with the following parameters:
        {'url:'push notification url', 
         'message':'text of the toast'   
         'seconds':'time delay in seconds'   
        }

        RETURN: a json object with:
        {
            'key' : 'an opaque value used when requesting the toast be cancelled '
            'secret' : 'an opaque value used when requesting the toast be cancelled ' 
        }

    http://{root}/cancel-push
        POST a query string with the following parameters:
        {
            'key' : 'an opaque value returned from post'
            'secret' : 'an opaque value returned from post' 
        }
        RETURN: not defined
If you want to use this web service you can ping me and I'll give you access. In future blog posts I'll talk about the code for the web service as well as the client library.  Leave a comment if you'd like to use this service and we can talk about whatever features you require.

No comments: