A while back my friend Paul told me about this service called TestFlight, which lets you distribute your mobile apps over the air to a group of testers. I’ve been using it for the RPG to have a few people try it out, and has proven to be an invaluable tool and it’s free! I was so happy with the service, I decided it was time to sign up for a premium account to integrate the SDK to add crash reporting. However, last week when I went to do so I was greeted with the following:
- Android support has been discontinued as of March 21st, 2014
- New SDK integrations for iOS apps have been suspended
What’s happened here is that Apple acquired TestFlight, immediately discontinued Android support, and suspended any apps from newly integrating the SDK for crash reporting. Thanks Apple! Not only am I dead in the water for Android testing, but now I can’t even give you money to move testing forward on iOS!
So, off to the lazy-web to find alternatives I went. Thankfully a lot of mobile developers are in the same boat so finding some alternatives was pretty easy. The two main ones that I liked the look of are HockeyApp and Crashlytics
I downloaded and fully integrated each of these tools to see which would work better for my needs. Crashlytics is the newer of the two, and although they have a pretty slick website, the integration process on iOS requires hand editing source code in X-Code (not ideal for Unity since the X-Code source is auto generated for me) and only handles crash reporting and doesn’t yet have their distribution system online.
HockeyApp on the other hand, while not free, gives me everything I wanted and more. Here’s the features that make it a winner for me:
- Supports iOS, Android, Mac, and PC
- Unity plugins for iOS and Android ready to drop in and use
- Over the air distribution to testers
- Crash collecting and reporting with symbol resolution showing a callstack with function names for native and managed
- Trigger your own custom reports from within Unity C# code
- Attach custom files to reports (I attach screenshots, log files, and save game currently)
- In app feedback system with UI for a “discussion like” feedback from users
- Automatically push feedback and crash reports into bugs using tons of services, including GitHub
- A desktop app that streamlines publishing new builds
Their “getting started” documentation is little confusing, but there’s a huge knowledge base and the developers are super responsive on it. If you’re using Unity though, save yourself some time and just go directly to the plugins which are buried a little bit the discussions section:
Attaching a file to a custom report couldn’t be easier:
WWWForm form = new WWWForm() form.AddBinaryData( "attachment0", File.ReadAllBytes( sourceFilename ), destFilename );
And it couldn’t have come at a better time. Just as I finished creating an in game console, real log files, screenshots, crash reporting, and save game uploading, the game started crashing on my iPad all the time in a way I’ve never seen. Taking a look at the callstack in HockeyApp I saw a bunch of strange mono functions at the top involving the word “trampoline”.
WTF is a trampoline you ask? Well, apparently it’s something the mono runtime uses to resolve interfaces, generics and such without using true JIT which is not allowed on iOS. Fortunately you can bump up the memory needed for the 3 types of trampolines. More information on trampolines and settings for them at whydoidoit.com, but the essentials are as follows:
nrgctx-trampolines=1024 (these are recursive generics – the default is 1024) nimt-trampolines=128 (these are to do with interfaces and the default is 128) ntrampolines=1024 (are to do with generic method calls, by default there are 1024)
Just add the needed additional options to the Unity Player Settings iOS tab under AOT Compilation Options like below, but bump up and change the values as need for your particular application:
HockeyApp couldn’t have come at a better time for me.