App Release - James Montemagno https://staging.montemagno.com/tag/app-release/ https://staging.montemagno.com/content/images/2017/08/MonogramIcon_Orange_NoBuffer.png App Release - James Montemagno https://staging.montemagno.com/tag/app-release/ Hugo -- gohugo.io Tue, 13 Oct 2026 22:20:07 GMT 60 Staged Rollouts & Phased Release on Google Play and App Store Connect https://staging.montemagno.com/using-phased-releases-on-google-play-and-app-store-connect/ 61362c9aba5764003b25c185 Mon, 06 Sep 2021 16:05:50 GMT

As an app developer it is hard enough to create your app, test your app, prep the app store listings, and then get your app approved. The last thing you want to think about is how fast or slow to roll out your app and updates to users. For the past 10 years all I have ever done was just release the app to everyone all at once, and for a long time this all that was available to us. However, now there are options for developers from both Google and Apple that can manage your release. Unfortunately, Google's staged rollouts and Apple's phased release aren't exactly the same, so let's talk about them.

Why a phased release?

Because we don't want a bunch of 1-star reviews if things go wrong 😉. I joke, but it is true that one of the reasons is that we don't know if something is going to go wrong once the app is released. If you are like me, I do rigorous testing in development and through Test Flight and Google Play's internal testing. However, I don't own every single device out there and I don't know the state of the current app on each user's device. Once an app update is out, there is no undo button, there is no taking it back. Therefore, planning a phased release or staged rollout is important. We can release the app to limited number of users each day and get real-time feedback from analytics, support emails, or even app store reviews. It is better to handle these problems in a limited scope before it gets out to all users. The downside is that you will need to plan your release and updates at least a week ahead of time, but eventually as your app grows it is going to be worth it.

Apple Phased Release

For iOS and Mac apps Apple has the ability with one radio button to flip on phased released when you submit your app for review. If you have it set to manual release you can also change it after the app has been approved. Apple phased releases are very Appley, which means it is well thought out, but you have very little control over exactly how it is rolled out. When you turn on phased release your application will be fully rolled out over 7 days to all your users at increments of 1%, 2%, 5%, 10%, 20%, 50%, and 100%. At any time, you can pause the phased release.

Phased release plan by Apple for iOS and Mac Apps
Phased release plan by Apple for iOS and Mac Apps

One percent is a small number for the first day especially if you don't have a large install base. I recently did this rollout for My Cadence, and it meant that around thirty-five users got the update on day one. Seeing that my app isn't used every single day and a user needs to do a bike ride, who knows how many people used the update. It really isn't until around day 4 that my sample size had increased to around 350 users and I could check my app analytics to see if upgraded users are using the app and if crashed are occurring.

At this point I would have liked to pause for a few days, monitor the app, and then continue with the release, but that is not an option. The phased release continues and increases the user base fast. I understand why Apple limits the rollout, but a tiny bit more control would be nice.

Now, what if you are a few days into a release and decide the update is good to go and you want to release it to all users. Don't worry, Apple has you covered with a big release to all users button. If you have a large user base, you may end up using this option by day 3 or 4 because you should have the data you need.

You always have the ability to release to all users
You always have the ability to release to all users

Google Staged Rollout

As I mentioned earlier the two companies have similar features but work completely different. Google's approach feels super Googley. They give you 100% control with extremely limited guidance and no restrictions at all. You enter a number into a box and away your staged rollout goes. You can start with any percentage you would like, and they give you an estimate of how many users will get this update. From there you can let it sit at any percentage for as long as you would like. You can update the rollout percentage 1% at a time or set it to anything you would like. Once you set it to 100% it is fully rolled out. This approach is genuinely nice because you can rollout the release over any amount of time, but it is a 100% manual process, which is not super fun. I ended up doing 20%, 40%, and then 100% over a week.

You select what % your rollout is on Google Play
You select what % your rollout is on Google Play

Each app store has its own advantages and draw backs when it comes to phased releases. If you take a bit of time to plan out your releases, you can save yourself some headaches if something goes wrong.

Listen to the podcast

Frank and I recently had this very topic on our podcast Merge Conflict. Take a listen.

Checkout my videos on YouTube

]]>
Porting My Cadence to Android in 1 Day! https://staging.montemagno.com/my-cadence-now-available-on-android/ 5fe7ca72875b770039372338 Sun, 27 Dec 2020 18:31:00 GMT

It seems like it was just yesterday that I was writing up a blog post on how I was launching My Cadence for iOS and then blogging about how I wrote and shipped the app in under a week. Well, it wasn't yesterday, but it was just 5 days ago! After I shipped the iOS version, I was watching some HGTV on Hulu and thought to myself, "how long would it take me to ship this app on Android?". The answer is around 4 hours' worth of work, and about 4 days of waiting for Google Play to approve my application for testing and publishing. Just like that it is live on Google Play for your Android device!

Enabling Android Support

I can't think of a real reason I decided to enable Android support for My Cadence. I guess maybe I was just board on my first day of holiday break and wanted a quick challenge. It was as if as soon as the challenge started, I was already done thanks to Xamarin and all of the amazing cross-platform libraries I had used.

When I started the iOS app, I kept things quite simple all in a single project and everything in the code behind. So, the first thing I needed to do was to break thing out into a .NET Standard library and ensure I didn't have any iOS specific code in the code behind.

Solution for My Cadence with Android and iOS projects

This took all of 15 minutes or so and I was ready for the next task of seeing if everything "just worked".

Bluetooth Differences

Let's just say everything was close to working out of the box. The biggest difference is that on Android using and managing Bluetooth require the user to give location permissions. This is the oddest thing ever, however unless you use some newer APIs this is how it has to be done even though location isn't used at all. I created a small interface and used Xamarin.Essentials to access Permissions on Android.

public async Task<PermissionStatus> CheckAndRequestLocationPermission()
{
    var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();

    if (status == PermissionStatus.Granted)
        return status;

    await MyApp.Current.MainPage.DisplayAlert("Permission required", "Location permission is required for bluetooth scanning. We do not store or use your location at all.", "OK");

    status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();

    return status;
}

The reason I put this into an interface and used the dependency services is because I don't need to request these permissions on iOS. If I had left the code in the .NET Standard library than I would have needed to add the rationale into the info.plist. The linker is smart, but not that smart.

In-App Purchases

I love and hate in-app purchases. Mostly because they are a pain to implement, test, and keep up to date. Luckily, I just went through a new re-write of my plugin for billing that handles everything for you.

The only bit of code that I needed to add was the new "AcknowledgePurchase" method after the user has purchased the item.

 if(DeviceInfo.Platform == DevicePlatform.Android)
    await CrossInAppBilling.Current.AcknowledgePurchaseAsync(purchase.PurchaseToken);

The next hardest part was trying to test it. You MUST put it in an open or closed beta/alpha release to test this in Google Play. These must be "reviewed" and can take several days to do. The internal track doesn't work at all for this and only works once you publish your app. It has been a while since I published a new Android app, and I was shocked at how long this took. However, after it is all said and done everything worked!

Theming Differences

The biggest difference between iOS and Android has to do with the theme colors. I support light and dark modes in the app and on iOS I keep it all simple styling. However, on Android the ActionBar on top really likes to be colored and the status bar background needs the background set. I pulled in a little code to style the status bar:

public void SetStatusBarColor(System.Drawing.Color color, bool darkStatusBarTint)
{
    if (Build.VERSION.SdkInt < Android.OS.BuildVersionCodes.Lollipop)
        return;

    var activity = Platform.CurrentActivity;
    var window = activity.Window;
    window.AddFlags(Android.Views.WindowManagerFlags.DrawsSystemBarBackgrounds);
    window.ClearFlags(Android.Views.WindowManagerFlags.TranslucentStatus);
    window.SetStatusBarColor(color.ToPlatformColor());

    if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.M)
    {
        var flag = (Android.Views.StatusBarVisibility)Android.Views.SystemUiFlags.LightStatusBar;
        window.DecorView.SystemUiVisibility = darkStatusBarTint ? flag : 0;
    }
}

Beyond that I just had to change a few settings for background colors and sizes of buttons and progress bars and then the app was ready to go. Here is a side by side of the app on Android and iOS.

It is amazing just how quick I could bring over this app. If you want to find out more information or download the app checkout mycadence.app.

]]>
Building, testing, & shipping My Cadence for iOS in less than a week https://staging.montemagno.com/building-testing-shipping-my-cadence-for-ios-in-less-than-a-week/ 5fe12e796c10e100399f4eae Thu, 24 Dec 2020 17:43:57 GMT

My holiday hacking came early this year when I decided to build my own DIY spin bike. Soon, after a few rides, my mind started to swirl with app ideas of how to improve my ride. Then when Apple released Apple Fitness+ without support for displaying cadence information from sensors I knew I had to build an app. That app is My Cadence, which connects to a small cadence sensor and displays the current cadence. It is actually packed full of awesome features including custom themes, in-app purchases, store reviews, and more! Best of all it only took me around 12 hours to develop, test, and ship during the last week since I started it. So, today I want to walk through all of the features I put in and how I developed them.

Xamarin.Forms 5

With Xamarin.Forms 5 nearing stable release it was the first thing I updated to when I created the project. I leveraged a lot of new features such as embedded fonts, App Themes for Light/Dark mode, gradient brushes, geometry clipping, and a bunch more! I love how easy it is to react to the mode change on the user's device with a simple line of code.

 <Label Text="The following sensors have been tested with My Cadence."
        TextColor="{AppThemeBinding Dark=White, Light=Black}"/>

Here is a bit of the app themes in action:

Bluetooth

The cadence sensor broadcast over Bluetooth Low Energy. This was actually the first time that I had worked with Bluetooth and I leveraged the Plugin.BLE library to easily detect, connect, and read data from the device. I may upgrade to Shiny in the future, but this was the first one I grabbed and it has been working well.

I fell in love so much with Bluetooth that Frank and I recorded a full Merge Conflict podcast on it!

In-app Purchases

I decided to add a "Pro" mode into the application at the last minute. My thought was that the entire app would be free without restrictions, but to help support the app a user could upgrade to "Pro" to unlock custom theming in the app. I leveraged my InAppBilling plugin and had the upgraded implemented in about 30 minutes. Here is the code from the app if you are interested in how easy it is to implement.

const string productId = "pro";

async Task PurchasePro()
{
    if (IsBusy)
        return;

    IsBusy = true;

    try
    {
        if(Connectivity.NetworkAccess != NetworkAccess.Internet)
        {
            await DisplayAlert("No internet", "Please check internet connection and try purchase again.", "OK");
            return;
        }

        var connected = await CrossInAppBilling.Current.ConnectAsync();

        if (!connected)
        {
            await DisplayAlert("Unable to Connect", "Unable to connect to the app store, check your internet connectivity and try again.", "OK");
            return;
        }

        //check purchases
        var purchase = await CrossInAppBilling.Current.PurchaseAsync(productId, ItemType.InAppPurchase);

        if (purchase == null)
        {
            return;
        }
        else if (purchase.State == PurchaseState.Purchased)
        {
            Settings.IsPro = true;
            SetPro();
            return;
        }

        throw new InAppBillingPurchaseException(PurchaseError.GeneralError);

    }
    catch (InAppBillingPurchaseException purchaseEx)
    {
        var message = string.Empty;
        switch (purchaseEx.PurchaseError)
        {
            // figureout error message
        }

        if (string.IsNullOrWhiteSpace(message))
            return;

        Console.WriteLine("Issue connecting: " + purchaseEx);
        await DisplayAlert("Uh Oh!", message, "OK");
    }
    catch (Exception ex)
    {
        // Handle Exception
    }
    finally
    {
        await CrossInAppBilling.Current.DisconnectAsync();
        IsBusy = false;
    }
}

Store Reviews

On thing that I always forget to put in my app is a way to prompt the user to review the application. Another one of my random plugins comes in to save the day, the Store Review Plugin! In the settings screen I added a button to review the app:

void TextCellReview_Tapped(System.Object sender, System.EventArgs e)
{
    CrossStoreReview.Current.OpenStoreReviewPage("1545730360");
}

Then I also decided to do a prompt for the user to review after they use the app 5 times successfully.

var count = Settings.Usage;
count++;
if(count == 5)
{
    CrossStoreReview.Current.RequestReview(false);
}
Settings.Usage = count;

Custom Controls

I surprisingly I only used 1 custom control in the entire app and it was available directly on NuGet! This control was an advanced color picker and I landed on one built by Dalton Spillman. It is fantastic as it allows full fidelity of color selection and has a built in ViewModel that works great for getting and setting colors.

You can find the code to the control on GitHub.

Xamarin.Essentials

Wow, Xamarin.Essentials continues to make me super productive over and over and over again. I leveraged:

  • Version Tracking
  • Preferences
  • Connectivity
  • MainThread
  • and more!

Every time I thought I was going to need to write some custom code Xamarin.Essetials was there.

CI & CD

In one of my late night code sessions I decided to setup App Center Build/Distribute on the app and I am so glad I did. It took seconds to setup and I had things automatically building, versioning, and distributing to TestFlight in under 10 minutes!

App Center Build & Distribute

More!

There is a lot more that went into this application outside of just the code. I generated a full website and app screenshots from http://apptoolkit.io/, created an app icon from EasyAppIcon.com, & had some amazing tester on Twitter using TestFlight.  

Thanks Dan for Testing!
Thanks Dan for Testing!

Available Now & OSS Code Soon

It is now available in the App Store completely for free! Soon the app is coming to Android as well as I just need to tweak a few Android specific settings and get it through the review process.

If you are looking to get into spinning checkout my full blog on building a DIY spin bike.

Finally, I do plan on putting the full source code online, so be sure to check back when I write up a blog on it.

]]>
Introducing Island Tracker for Animal Crossing New Horizons https://staging.montemagno.com/introducing-island-tracker-for-animal-crossing-new-horizons/ 5eb04dd46c478d00392fb981 Sat, 09 May 2020 17:25:00 GMT

tldr; I built a new iOS & Android app called Island Tracker that enables you to track turnip prices, get predictions, and share them with friends. It is available today.

Get it on: download-on-app-store download-on-google-play

When Animal Crossing New Horizons launched in late March I fell in love immediately. My wife adopted my Nintendo Switch Lite and we both got copies the night of release. Over on the Nintendo Dispatch podcast, we call it the perfect game at the perfect time. It truly has been for us during this time of staying inside away from all of our closest friends. Each day we dig up fossils, shake trees, give gifts to neighbors, visit islands and collect things for our museum.

However, something is different each Sunday morning at our house. We wake up and race to our Switch to see what price we can buy bundles and bundles of turnips. Then throughout the week we are constantly bugging our friends to see what we can sell them for, in hopes that someone has a huge spike and we can make a mad profit. After a week of text message madness, my must solve everything with a mobile app mind went to work and Island Tracker was born.

Island Tracker enables you to easily track your turnip purchases on Sunday and then track your prices throughout the week. You can easily get predictions, see if you are up or down, and then share your prices with all of your friends with a click of the button! Through weeks of beta testing with Animal Crossing die hards, I have even added some really cool features such as sharing your Switch Friend Code and nifty calculators to make buying turnips a breeze. After weeks of development, architecting, testing, and getting ready for release, Island Tracker is available right now on Google Play for Android and the Apple App Store for iOS for $2.99. Need some convincing? Here is a full walk through:

The Tech Behind Island Tracker

As you would expect the entire application is completely open source and available on GitHub. The application shares around 98% shared source code between iOS & Android, leveraging Xamarin.Forms for the user interface and C# business logic. There are tons of great libraries that I leveraged to build the app including PancakeView, Sharpnado, Syncfusion, MvvmHelpers, Monkey Cache, App Center, Xamarin.Essentials, and Resizetizer.NT.

For the backend system I leveraged Azure Functions combined with Azure Table Storage. With just a few Tables I was able to achieve some really cool functionality with a full friends system, encryption, and no-signup users.

If you are interested in how it all works checkout this YouTube video I shot on the entire process.

A Huge Thanks

There is an amazing Xamarin community making awesome libraries that really helped me be productive throughout the process. I built a lot of the app live on my Twitch stream and got tons of great feedback and help. Then there is the hard work of Mike Bryant and Steve aka sparkie108 who ported tons of the predictions code to JavaScript and then to  C# to use in the app, which is awesome! Finally, thanks to all of my awesome beta testers that gave me feedback all throughout the last month really making the app spectacular.

What's Next

Well, it is out! I am super proud of this app and hope that people enjoy it and make tons of bells in Animal Crossing! I will continue to improve the app, add new features, and make it the best Animal Crossing app that I can! Cheers <3

Get it today: download-on-app-store download-on-google-play

]]>
Introducing My Stream Timer: A Countdown Timer for OBS https://staging.montemagno.com/introducing-my-stream-timer-a-countdown-timer-for-obs/ 5ca1b6eab2f3d500bff4c99d Thu, 04 Apr 2019 20:55:00 GMT

I have been streaming on Twitch for over 6 months now. I stream both code on my personal Twitch channel and I also stream games and recordings of Nintendo Dispatch with my buddy Michael over on the official Dispatch Twitch channel. One thing that always bothered me was having to manually mess around with apps to get a simple countdown timer. They were too complex, had too many options, and had a bunch of quirks. So, I decided to build my own, which is out today on Windows 10 called My Stream Timer.

PrettyStreamTimer

My Stream Timer is an elegant and simple to use timer that can be used to count up, down, or do giveaways. It also:

  • Integrates into OBS/SLOBS by writing to disk
  • Intuitive user interface
  • Ability to add more time
  • Can be automated to use with Stream Deck

Countdown Simplified

I wanted to make this app really easy to use. There are only a few tabs that do only one thing. Count up or down. You can set just a few properties:

  • How you want the output to display
  • What you want it to say when it is finished
  • Auto start when you open app
  • File name to output
  • Start, Add Minute, or Reset

When you start a timer the app will start to update and output the results to disk so you can integrate it into OBS/SLOBS:

demo--2-

Optimized for Stream Deck

You can integrate a Open command under System to launch My Stream Timer and start a countdown from a specific amount of time. You don't need to browse for a file location at all as you can input a protocol url:

Format: mystreamtimer://countdown/?mins=6

With this simple command it will launch My Stream Timer and start a countdown from 6 minutes!

In Action

Get It Today

My Stream Timer is available today for free from the Microsoft Store. It is also completely open source on GitHub.

]]>
Scoreboard: An app to keep track of board game scores https://staging.montemagno.com/scoreboard-keep-track-of-game-scores-app/ 598df8f2c121b60019bf2fdd Thu, 05 Jan 2017 17:40:03 GMT Today, I am excited to announce Scoreboard, a brand new app for iOS and Android making it drop dead simple to keep track of your board game scores. It is available today on the App Store and Google Play.

Leave that pen and paper behind, Scoreboard enables you to easily keep score for any game with up 4 players or teams. Easily keep track of game scores including board, sport, dice, or anything else!

Scoreboard doesn’t stop there as it keeps a full history of every game and all scores that you have ever played so you can go back and check the scores later.

Scoreboard works great with all sorts of different board games such as Qwirkle, Sushi Go, Dominoes, Phase 10, and Mastermind. It is also great for dice and sports such as baseball.

Get it today for free:

I will have a new blog post tomorrow on how I created this app including all of the awesome services I used.

]]>