Analytics for Windows Phone nuget to rule them all

In the previous post I showed how to instrument a Windows Phone app with Google Analytics using GoogleAnalyticsTracker.WindowsPhone. There are couple issues with this approach. It requires writing a substantial amount of code for event and custom variables tracking. Google Analytics for Windows Phone solves the issue of custom variables, but its performance is inferior to GoogleAnalyticsTracker.WindowsPhone. Furhtermore, both nugets suffer from a major shortcoming of supporting only single provider, Google Analytics (GA). If for any reason you decide to switch to another provider, it would require changing every file in the app which has a GA fingerprint. Having used three different analytics providers (PreEmptive, Flurry, and GA) in the past two years, I have experienced the pain first hand. Something had to be done to relieve the pain and stop the suffering.

Analytics for Windows Phone
Introducing Analytics for Windows Phone nuget to rule them all. It abstracts out analytics providers and makes it trivial to swap in and out different providers. Even though it currently only supports GA, it takes the best features of both existing nugets and provides them in a single and simple to use nuget package. Its performance is on par with GoogleAnalyticsTracker.WindowsPhone and simplicity of use goes beyond Google Analytics for Windows Phone. The custom variables are sent with every call to Track method. You do not need to explicitly define or call them. What variables are sent you may ask? Here they are:

Index Variable key Variable value example
1 Device ID {48a98908-8449-e011-854c-00237de2db9e}
2 Application version 3.5
3 Device OS WP 7.10.8773
4 Device Nokia – Lumia 900
5 TotalMemory 256 MB

Instrumenting an App
After installing the package build your app solution. Open App.cs file and add a static property Tracker as shown below. We will use this property throughout the app to call tracking events.

public partial class App : Application
{
    private static AnalyticsTracker _tracker;
    public static AnalyticsTracker Tracker
    {
        get
        {
            if (null == _tracker)
            {
                AnalyticsTrackerCreator creator = new 
                 GACreator("YourPropertyId");
                _tracker = creator.Instance;
            }
            return _tracker;
        }
    }
}

Make sure to replace YourPropertyId above with the Id you have created on GA portal. If you do not know how to do that, check the previous post. Now we can start instrumenting the app with tracking events. Since we already have App.cs file open, lets add a track method that will be called when unhandled exception occurs in the app.

public partial class App : Application
{
    // Code to execute on Unhandled Exceptions
    private void Application_UnhandledException(object sender, 
     ApplicationUnhandledExceptionEventArgs e)
    {
        if (System.Diagnostics.Debugger.IsAttached)
        {
            // An unhandled exception has occurred; break into the debugger
            System.Diagnostics.Debugger.Break();
        }
        else
        {
           App.Tracker.Track(EventCategories.Exception,   
            EventAction.ExceptionUnhandled);
        }
    }
}

Once the app experiences a crash the event along with custom variables will be sent to Google Analytics and in several minutes it will show up on the web portal. This is good enough for scenarios that do not require real-time tracking. However, we may be interested to know how many people are using the app or a particular feature of the app at this moment. For those type of scenarios we need to use the real-time tracking mechanism. Let’s add it to the OnNavigatedTo method on the main page.

    public partial class MainPage : PhoneApplicationPage
    {
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            App.Tracker.TrackRelatime(e.Uri);
            base.OnNavigatedTo(e);
        }
    }

As soon as OnNavigatedTo method is invoked and TrackRealtime method is called, Google Analytics will report presence of a user on the MainPage.xaml page. Go to the web portal and witness the magic. 🙂

Conclusion
Instrumenting an app with provider independent framework has never been easier. Even though it currently supports only Google Analytics, other providers can be easily added. Am I going to add any new ones? I do not have any plans for now. If I decide to switch to a new provider then I would definitely add it. If you prefer a different provider and are willing to contribute to the project, I would be more than happy to work with you in extending the nuget package.
Let me know what you think in the comments below.