How to perform asymmetric encryption without user input/hardcoded values with Xamarin iOS

How to perform asymmetric encryption without user input/hardcoded values with Xamarin iOS

I am not repeating all the initial explanations why you should use this way of encryption to secure sensible data in your app(s), as I did this already in the post on how to do that on Android.

iOS KeyChain

The KeyChain API is the most important security element on iOS (and MacOS). The interaction with it is not as difficult as one thinks, after getting the concept for the different using scenarios it supports. In our case, we want to create a public/private key pair for use within our app. Pretty much like on Android, we want no user input and no hardcoded values to get this pair.

Preparing key (pair) creation

On iOS, things are traditionally a little bit more complex than on other platforms. This is also true for things like encryption. The first step would be to prepare the RSA parameters we want to use for encryption. However, that turned out to be a bit challenging because we need to pass in some keys and values that live in the native iOS security library and Xamarin does not fully expose them. Luckily, there is at least a Xamarin API that helps us to extract those values. I found this SO post helpful to understand what is needed for the creation of the key pair. I adapted some of the snippets into my own helper class, this is also true for the IosConstantsclass:

    internal class IosConstants
        private static IosConstants _instance;

        public static IosConstants Instance => _instance ?? (_instance = new IosConstants());

        public readonly NSString KSecAttrKeyType;
        public readonly NSString KSecAttrKeySize;
        public readonly NSString KSecAttrKeyTypeRSA;
        public readonly NSString KSecAttrIsPermanent;
        public readonly NSString KSecAttrApplicationTag;
        public readonly NSString KSecPrivateKeyAttrs;
        public readonly NSString KSecClass;
        public readonly NSString KSecClassKey;
        public readonly NSString KSecPaddingPKCS1;
        public readonly NSString KSecAccessibleWhenUnlocked;
        public readonly NSString KSecAttrAccessible;

        public IosConstants()
            var handle = Dlfcn.dlopen(Constants.SecurityLibrary, 0);

                KSecAttrApplicationTag = Dlfcn.GetStringConstant(handle, "kSecAttrApplicationTag");
                KSecAttrKeyType = Dlfcn.GetStringConstant(handle, "kSecAttrKeyType");
                KSecAttrKeyTypeRSA = Dlfcn.GetStringConstant(handle, "kSecAttrKeyTypeRSA");
                KSecAttrKeySize = Dlfcn.GetStringConstant(handle, "kSecAttrKeySizeInBits");
                KSecAttrIsPermanent = Dlfcn.GetStringConstant(handle, "kSecAttrIsPermanent");
                KSecPrivateKeyAttrs = Dlfcn.GetStringConstant(handle, "kSecPrivateKeyAttrs");
                KSecClass = Dlfcn.GetStringConstant(handle, "kSecClass");
                KSecClassKey = Dlfcn.GetStringConstant(handle, "kSecClassKey");
                KSecPaddingPKCS1 = Dlfcn.GetStringConstant(handle, "kSecPaddingPKCS1");
                KSecAccessibleWhenUnlocked = Dlfcn.GetStringConstant(handle, "kSecAttrAccessibleWhenUnlocked");
                KSecAttrAccessible = Dlfcn.GetStringConstant(handle, "kSecAttrAccessible");


This class picks out the values we need to create the RSA parameters that will be passed to the KeyChain API later. No we have everything in place to create those with this helper method:

private NSDictionary CreateRsaParams()
    IList<object> keys = new List<object>();
    IList<object> values = new List<object>();

    //creating the private key params

    values.Add(NSData.FromString(_keyName, NSStringEncoding.UTF8));

    NSDictionary privateKeyAttributes = NSDictionary.FromObjectsAndKeys(values.ToArray(), keys.ToArray());


    //creating the keychain entry params
    //no need for public key params, as it will be created from the private key once it is needed


    return NSDictionary.FromObjectsAndKeys(values.ToArray(), keys.ToArray());

In order to use the SecKeyAPI to create a random key for us, we need to pass in a NSDictionarythat holds a list of private key attributes and is attached to a parent NSDictionary that holds it together with some other configuration values for the KeyChain API. If you want, you could also create a NSDictionary for the public key, but that is not needed for my implementation as I request it later from the private key (we’ll have a look on that as well).

Finally, let the OS create a private key

Now we have all our parameters in place, we are able to create a new private key by calling the SecKey.CreateRandomKey() method:

public bool CreatePrivateKey()
    var keyParams = CreateRsaParams();

    SecKey.CreateRandomKey(keyParams, out var keyCreationError);

    if (keyCreationError != null)

    return keyCreationError == null;

Like on Android, it is a good idea to call into the Delete() method before creating a new key (I’ll show you that method later). This makes sure your app uses just one key with the specified name. After that, we create a new random key with the help of the OS. Because we specified it to be a private key for RSA before, it will be exactly that. If there is an error, we will return false and print it in the Debug console.

Retrieving the private key

Now we have created the new private key, we are able to retrieve it like this:

public SecKey GetPrivateKey()
    var privateKey = SecKeyChain.QueryAsConcreteType(
        new SecRecord(SecKind.Key)
            ApplicationTag = NSData.FromString(_keyName, NSStringEncoding.UTF8),
            KeyType = SecKeyType.RSA,
            Synchronizable = shouldSyncAcrossDevices
        out var code);

    return code == SecStatusCode.Success ? privateKey as SecKey : null;

We are using the QueryAsConcreteType method to find our existing key in the Keychain. If the OS does not find the key, we are returning null. In this case, we would need to create a new key.

Retrieving the public key for encryption

Of course, we need a public key if we want to encrypt our data. Here is how to get this public key from the private key:

public SecKey GetPublicKey()
    return GetPrivateKey()?.GetPublicKey();

Really, that’s it. Even if we are not creating a public key explicitly when we are creating our private key, we are getting a valid public key for encryption from the GetPublicKeymethod, called on the private key instance.

Deleting the key pair

Like I said already earlier, sometimes we need to delete our encryption key(s). This little helper method does the job for us:

public bool Delete()
    var findExisting = new SecRecord(SecKind.Key)
        ApplicationTag = NSData.FromString(_keyName, NSStringEncoding.UTF8),
        KeyType = SecKeyType.RSA,
        Synchronizable = _shouldSyncAcrossDevices

    SecStatusCode code = SecKeyChain.Remove(findExisting);

    return code == SecStatusCode.Success;

This time, we are searching for a SecRecord with the kind key, and calling the Removemethod of the SecKeyChain API. Based on the status code, we finally return a bool that indicates if we were successful. Note: When we create a new key, (actually) I do not care about the status and just create a new one in my helper class. If we delete the key from another place, we are probably going to work with that status code.

As I did with the Android version, I did not create a demo project, but you can have a look at the full class in this Gist on GitHub.


Now that we have our helper in place, we are able to encrypt and decrypt data in a very easy way. First, we need to obtain a private and a public key:

var helper = new PlatformEncryptionKeyHelper("testKeyHelper");

if (!helper.KeysExist())

var privKey = helper.GetPrivateKey();
var pubKey = helper.GetPublicKey();

The encryption method needs to be called directly on the public key instance:

var textToCrypt = "this is just a plain test text that will be encrypted and decrypted";
pubKey.Encrypt(SecPadding.PKCS1, Encoding.UTF8.GetBytes(textToCrypt), out var encBytes);

For getting the plain value back, we need to call the decryption method on the private key instance:

privKey.Decrypt(SecPadding.PKCS1, encBytes, out var decBytes);
var decrypted = Encoding.UTF8.GetString(decBytes);

It may make sense to wrap these calls into helper methods, but you could also just use it like I did for demoing purposes. Just remember to use always the same padding method, otherwise you will not get any value back from the encrypted byte array.

Once again, if you need encryption of data in a Xamarin.Forms project, just extract an interface from the class or match it the interface you may already have extracted from the Android version. As I stated already before, every developer should use the right tools to encrypt data really securely in their apps. With that post, you now have also a starting point for your own Xamarin iOS implementation.

Like always, I hope this will be helpful for some of you. In my next post, we will have a look into the OS provided options for encryption and decryption on Windows 10 (UWP).

Until then, happy coding, everyone!

Posted by msicc in Dev Stories, iOS, Xamarin, 1 comment
Saying Goodbye to 2017 [Editorial]

Saying Goodbye to 2017 [Editorial]

First Half

The first half of the year I wasn’t much into development besides work. I was asked to help building a new German Android news site, which turned out to be an impossible task because of several reasons (high author fluctuation was the baddest thing). In the end, the owners decided to go another route by turning the side into a a site dedicated to Chinese hardware, which is an area I do not have a lot of trust and interest. So I decided to step out of the project and focus again on my software development efforts.

Back to software development (Second Half)

The first thing I was focusing on in that area was to get deeper into web development with ASP.NET Core. I learned a few basics from Pluralsight and started to work on a project that I will (hopefully) bring forward in 2018.

I also got back deeper into cross platform development with Xamarin, especially Xamarin.Forms. As Microsoft killed all mobile efforts in the UWP, this step was one I denied way too long to go. As a logic step  I started with my ongoing series of blog posts about Xamarin Forms and the MVVMLight toolkit. If you missed it, here are the links to the posts:

During the first 8 month of the year, I was running Android as my daily driver. However, I never was really happy with the Android OS (and I am still not), so I decided to switch to the iPhone 8 Plus after its launch. I detailed the reasons why here:

Why I am (once again) using an iPhone [Editorial]

In the last month, I was also looking into some IOT development, and this is were my current focus is. In the next few weeks I have a private project that overlaps with a project at work. I really appreciate it when I can be productive in multiple ways, and those (sadly rare) overlapping projects are just plain awesome to work on.

Private things…

Having a look at my private goals (for those who care), I started with some functional fitness workouts in late summer. I am using the workout app from Skimble, which has some handy video guides and is way cheaper than a gym subscription. In 2018, I want to move on to get even more fit. On top, one of the biggest (and probably hardest) goal is to become a non-smoker. I am hoping that being more active has motivating impacts on the later goal as well. On top, in the last few days I had my first baby steps into meditation as well, but I am still struggling with that one. So, way to go in these parts of my life.

Well, this post is not as long as the ones of the years before, but I really already told you everything that happened this year. To close this post, I wish you all a happy end of the year, an awesome party tonight and I hope to welcome you all again in 2018 here on my personal blog.

Happy new year, everyone!

Posted by msicc in Dev Stories, Editorials, 0 comments
Why I am (once again) using an iPhone [Editorial]

Why I am (once again) using an iPhone [Editorial]

If you have been following along me for some time, you’ll probably know that I used to be a fan of Microsoft and its products (especially Windows Phone) for a long time, and I did really everything possible in the Microsoft ecosystem and promoted it whenever I was able to. Three years ago, no one – not even me –  could ever think of me using anything other than a phone with a Microsoft operating system on it.

Microsoft has changed…

The Microsoft a lot of us used to love is gone. It all started to become really bad for Windows Phone/10 Mobile when Steve Ballmer left the building (aka stepped down as CEO). He was the force behind all mobile efforts, and I think Windows Phone/Windows 10 Mobile would still exist with shiny new devices. However, Mr. Nadella is now the CEO of Microsoft. And as he stated recently in his book (“Hit Refresh”), he never understood why there should be another mobile OS besides iOS and Android (we all know duopoly is as bad as monopoly). All of his actions in the last few years, starting to burn out Nokia from Microsoft and also killing Windows 10 Mobile (even if he never would state that publicly), make sense after knowing this. Nadella’s Microsoft is a business oriented, cloud focused money machine with no more consumer love. Sure, they still have products for the consumer like Groove Music, but they do lack their consumer focus which we all enjoyed when Windows Phone started.

To sum it up, times have changed. The first steps outside the Microsoft ecosystem happened quite some time ago, you can read more on that topic right here:

Editorial: Why the app gap on Windows Phone/10 Mobile is a bigger problem than I thought

After that, I used and reviewed some Android devices for a German news site, and got back into the Android ecosystem by putting some apps (at least as beta) into the Play Store. After more than one year on Android, I see that fragmentation is still the biggest problem out there. It makes developing apps for it a mess, as there are tons of devices that do not behave like you expect when developing with a Nexus or any other plain Google device.

Software updates

Another point which is quite important, is the actuality of software updates. Due to the fragmentation problem and the ability for OEMs to change the whole user experience on Android, this has always been a problem. Google tries to address this problem with the latest Android Version Oreo, but this will not help with all those existing devices on the market that are running Marshmallow or Nougat. Even this year’s flagships are not able to catch up and profit from the new way to handle software updates. I do see a chance that this will change over the next year(s). However, this makes me to not want to spent any money on a recent Android device.

Google’s Pixel (and at least their Nexus 5X/6P) devices are certainly well built, and have a guarantee for getting the latest software updates first. However, they do not want to make me spend my money on them (not even the rumored second incarnation).  Then there is Samsung, which makes premium devices, but my experience with their smartphone has always ended bad – not only for myself, but also along my family and friends.

iOS however is kind of similar to Windows (Phone). iOS devices always get the most recent software, including bug fixes and security updates, because of the closed ecosystem. Their hardware is always from top quality. Even if they are no longer innovating like they did years ago, all features they have are very well implemented. Also, Apple supports their older devices over a long distance, which makes an iPhone a worthier device to invest money in than any Android device – especially in those devices that try to play in the same league like Apple does in terms of prices.

What’s missing?

That’s the point where I was already heavily surprised when I switched to Android. The fact that all those official apps are available on Android and iOS, does indeed make a huge difference. Some apps do have Widgets (on both Android and iOS). Sure, they are no live tiles, but those that I am using do their job in a similar good way, even if I have to swipe to left or right to get them.  On top of that, all Microsoft apps are also available on these two platforms, and most of them do actually work a lot better there than they do on their own OS. So more than a year away from Windows 10 Mobile, I do miss… nothing.

In the end…

… this was a personal decision. I was evangelizing Windows Phone and all other Microsoft products for years, as some of you may know. As they do no longer offer a valid mobile device and are not even able to get close to what Android and iOS have to offer in their ecosystems, I cannot continue to do this. I was on Android for quite some time, but in the end, I decided to go back to the iPhone, which I left a few years ago – you already read the reasons if you reached this point.

Maybe some of you felt the same way I did when moving away from Windows Phone/Windows 10 Mobile? Feel free to start a discussion here in the comments or on social media.

Until the next time, have fun!

Posted by msicc in Editorials, 0 comments

Sean’s Editorial: This Is How I Use “Rooms” For WP

With the release of Windows Phone 8, there are a tremendous number of new features available Many aren’t available for WP7, or are but have inherent limitations. Some are major additions and some are minor changes. The feature that I find myself utilizing more than any other option on my Lumia 920 is the new Rooms feature. If you haven’t had the opportunity to upgrade to WP8 yet, Rooms are similar to Groups for WP7, but with many additional and VERY useful features. My wife and I both have WP8 Lumia 920’s, so I’ve had the chance to use the Rooms feature often and will give you some of my experiences, the positives of Rooms, and some of the needed improvements to this unique feature from Microsoft.

Bare with me for a second, this is more of a recap of  Rooms before I better describe how it has become such a vital aspect of my phone and world. First, let’s start off with what the Rooms feature is. Like Groups, Rooms is a collection of contacts from your People Hub that you want to group together for easier and more organized communications with. The 1st big difference between the 2: Groups are people you add into a hub without their permission, making it easier for YOU, the user, to better keep track of up to 25 people and communicate with them via the various integrated services on WP. Unlike a Group though, a Room requires you to be invited to or for you to invite participants in a Room you’ve created. A Room can’t exceed 10 members and you’re limited to participating in no more than 5 Rooms at a time. In addition invites are only sent via SMS, so you need to be in network range to send or accept. Once you’re in a Room, WiFi can then be used as your connection. This was an issue for me personally, as my home is not within my carrier’s network range. I had to wait to get into reception before accepting an invitation and sending an invite for a different Room.
Many of you have read about the features included in Rooms for WP8, so I won’t spend a lot of time detailing what’s already been written. It has a very simple minimalist feel and look to it, but does a great job of capturing the essence of Windows Phone with all the integrated services right at your fingertips and easily accessible. Here’s the short of what a Room consists of:


  • Members Screen-live tile of the members of the room/What’s New via social networks/Member Photos/Group email/Settings
  • Messenger-IM with the members in your Room
  • Calendar-Add/View/Edit events
  • Photos-Add/View/Comment on Room members uploaded pics/
  • Notes-Add/View/Edit notes added by Room members


So who is this wonderful feature, created by the reinvigorated and innovative team at Microsoft, available to? If you own a WP8, you’re in luck as all the services come stock and work great with your device. What if you own a WP7…or maybe you own a WP8 but know someone with an iPhone that you would like to share this experience with. Well there’s good and bad news. It IS available to  WP7 and iPhone owners, but with limitations. I’m personally in a Room with my wife and in another with other Lumia 920 owners, so I have to be honest…I’m not sure of how well the non WP8’s behave in a Room. This is how Microsoft describes the experience for non WP8 Room members:

If you have a Windows Phone 7 or an iPhone, you can join a room that someone with a Windows Phone 8 creates and invites you to. You’ll be able to set up the room’s shared calendar on your phone and view, create, and edit events on it. Your changes will appear on the other members’ phones and their changes will sync to yours. Other Rooms features work best on Windows Phone 8. Group chat(Messenger) in Rooms is only available on Windows Phone 8. Room members with a Windows Phone 7 or iPhone won’t be able to participate.



Rather than focusing on the specs, I’m going to spend my time in this piece talking about how I personally use these features on a daily basis, quite perhaps, more than any other aspect of my Lumia 920. As I mentioned before, I’m involved in 2 rooms currently. The Lumia 920 Room is a group of 10 owners of the 920 where we discuss many things 920 related and some other things too. It’s a great way for me to stay connected with other Winphans and feel the WP love! The second Room I’m involved in is one my wife and I made to stay connected in our busy world. I’m going to talk about that first as it garners most of my time and well…I’m using it as I’m writing on my laptop this very second.


I’m sure many of you can relate to this description: I am married, we have children, we both work, our kids have busy schedules, somebody wants this, somebody wants that, etc. Well the same holds true for my wife and I. We both have busy schedules and we have children, but don’t want to lose out on what matters most, each other. Our Room has really helped to make us more communicative throughout the day and easier to share the day’s doing even though we’re apart. It’s why we fell in love in the first place, we enjoyed sharing experiences and thoughts together. We are in an era however, where finding time with your loved one or people you care about becomes harder due busier schedules, finances, and other various factors. A Room is really the 1st of its kind. It offers a bit of a social network feel, but in a much more intimate setting and brings some easy ways to connect the important and not so important part of your day to the person or people who are important in your day.


Obviously, the most used feature of a Room is the Messenger, or chat. This is a downfall of WP7, the lack of integrated Messenger just doesn’t make sense. Aside from FB chat, KIK, and a couple of others, there is slim pickins’ when it comes to IM and Window Phone. Having Messenger integrated gives another very stable IM choice to people considering a switch and with something as important as messaging, more is better. I spend most of my time near my home and as I mentioned above, my carrier’s network does not reach to it. A simple SMS is out of the question and most SMS apps have unreliable servers making texting a challenge often. My wife however, works in town and is in network range so SMS is fine. However, if my apps server is down then she can’t reach me then we’re back at square one. That has been our experience until having a Room. There are times were are carrier’s network is bad, but Messenger is always reliable. What is great for my wife is that the message shows up in her Messaging Hub just like a SMS or FB chat does. This gives you the option to have a live tile for your Room or not, either way, you’re going to get a notification.


An interesting feature to a Room’s Messenger chat is the storage of conversations in your Windows Live email. It’s not always consistent as to what will or won’t show up in your inbox, but some items do appear there. In the long run, if Microsoft straightens that out and has a Room consistently feeding through your email, that’s just one more example of 3 Microsoft’s 3 screens concept. If your WP isn’t near you, you don’t have to miss out on a conversation. Your Messenger also comes with voice to text dictation, which is a great little feature. In addition to the above features, Messenger allows you to check-in with your location and with the tap of the map, other members can look at their Local Scout for where you are.


So my wife and I both love to take pics and save pics we see on the internet and then share them with each other. Instead of having to send emails back and forth or sit and wait for the other person to scroll through their various photo albums looking for that one pic they saved, it’s much easier to use the SkyDrive integration and share it directly to our Room’s photo album. You can comment on a pic while viewing it as well, which can lead to long threads of their own aside from Messenger. Because of the SkyDrive integration it’s super easy to upload any image directly to the Room’s album, whenever you share an image you’ll see the Rooms you participate in as an option. You’ll also be notified via your live tile when a member uploads a new image. On a recent trip to L.A., my wife was able to almost stream her day in pics posted to our album. It was wonderful being able to experience things almost in live time as she showed me the world from her eyes. More than that, it was fairly easy for her to keep me up to the moment with how simple and NOT time-consuming it is to share. In addition to viewing pics while in your Room, your shared Room album is stored to SkyDrive allowing you to access those same pics from your laptop, tablet, Xbox, as well as your phone’s Photo hub. Ahem…3 screen concept yet again!


When you have busy schedules, that means you have filled up calendars and keeping them all in order can be a mind-boggling and time-consuming task! Your Room comes equipped with its own calendar that has also been integrated with SkyDrive thus adding itself to your existing Windows Live Calendar without you having to do anything. You might think “I’ve already linked my Windows Live Calendar with someone, how is this any different?”. The answer is this: When you add a new appointment/event with your phone’s calendar, you must enter an attendee to share it with and an email is sent with a request to accept or decline…too many steps, too much time, and things that can go wrong. With your Room, when a new item is added, it automatically includes all members and then places it in their calendar. No emails to accidentally end up in bulk or junk and get missed, just set it and that is that! Events from your Room will show up on your Calendar tile on your WP, laptop, or tablet. Yes, I know, 3 screens…I cannot say enough about SkyDrive and the way Windows Phone has integrated it into our devices!


The last main feature I’ll talk about is Note. Your Room’s Notes is a shared folder using your WP’s One Note, which has been integrated with SkyDrive allowing for you guessed it, a 3 screen concept! Start a Note or add to it. Christmas is right around the corner and my wife and I haven’t done a lick of shopping for gifts yet! We both are quite busy so it can be hard to both end up at a store looking for Christmas goodies at the same time. No worries, we’re going to sit together and using our Room make a gift Note. We can add or eliminate items later whether we are in the same room or in different areas with SkyDrive. If I buy a gift, just notate it on the Note and my wife can see not to get it. She doesn’t have to stand waiting for me to reply to a text or email if she’s at a store and isn’t sure if I already got it. We’ve all waited for that damn text or message at one point or another, be honest. NO MORE! If she thinks of something for me to pick up while I’m shopping for groceries, BAM…add it to the Note and it’s just that simple! Like Messenger, Note also comes with voice to text dictation.


In addition to the features I described above, the members of the Room all appear in one spot as live tiles. The members live tile in a Room are the same as in your People hub, so each member’s live tile shows their social network updates dancing about on their tile and all contact info can be accessed there as well. One of the features that appealed to many of us early adopters of Windows Phone was the Hub concept. It still does to newcomers, not needing so many apps to do simple tasks unlike the device they recently left behind whether it be Android or iPhone. Well Windows Phone has done it again! I’ve seen many apps that attempted to emulate each one of these tasks individually but Microsoft has done a great job at building each service into WP8 and then offering a way to use them all at once without the need of an app.

So I’ve given you all the upsides to a Room. What are the things that could be improved upon? This is a much shorter list. I actually only have 1 legitimate complaint, the rest are things that need just a little tweaking. My major complaint is this: there is no way to mute a Room. If you have an active room, your phone could be alerting you for hours on end as your Room’s Messenger gets lit up by members. Keep in mind, members of a Room can be from all over the world so it’s always Windows Phone time somewhere in the world in my 920 Room. The ability to turn off a Room’s alerts would be great! At this point the only way to turn off chat alerts is by leaving the Room in entirety. Not a good solution.

Aside from that, I would like to see the ability for a Room to do a better job at linking its members social networks together. Because it’s Windows Live, we all share each other Windows Live contact info. What if I want to know someone’s Twitter, their other social networks, or other contact info. There isn’t a quick way to do it in a Room yet. Yes you can share contact info via email, but that’s an added step that usually won’t be taken.

My last thing I can see a bit of an issue with is less to do with a Room and more to do with a carrier’s network. If you have poor network coverage the Room definitely doesn’t function as well. Just because you have enough reception to text doesn’t mean you have a strong enough signal for a Room to operate in “Real Time”, you may notice delays in Messenger and troubles syncing with SkyDrive. When I’m on WiFi I have yet to face any issues however.

When I first heard of Rooms in June, I thought it was cool sounding but had no idea how useful and in the theme of Windows Phone Rooms would really be. In terms of normal non gimmick function and by that I mean function but not a selling ploy like Siri for example, I really think this is the clear choice for top addition to Windows Phone 8. I think it will take a second, but you will hear more and more about Rooms in time to come. There are so many ways to make a Room work for each person, the question is simple…how will you make your Room or Rooms work for you?

To learn more about Rooms for Windows Phone 8 just click here.





Posted by TheWinPhan in Archive, 2 comments