How to capture iOS crashes in MonoTouch application - ios

We have logging in place for any .Net Framework exceptions that occur in our iPad MonoTouch application and can get these back to our support department to help analyze and resolve issues.
However, if the application crashes due to an iOS error (i.e. sigsev), we are unsure how to capture that information or tell our very unsophisticated users how to obtain and provide it to us.
Can anyone offer any guidance on this?

We're using these bindings for HockeyApp iOS SDK (I believe they have one for Android too).
They provide a service similar to TestFlight. Automatic crash symbolication is very nice.
We also employ this fix because it's essential to crash reporters working in MonoTouch.
Be warned that TestFlight and HockeyApp will currently crash your app if you don't use this fix.

Crashes will often (but not always, e.g. out-of-memory) create crash logs on the device. iTunes will download them to the user's computers.
Are you releasing your application thru the appstore ? If so you should be able to get the crash logs from it (iTunes will upload them).
If not then the following documents (and sections) can be useful to know about them (and to create a procedure for end-users to send the crash reports to you).
Acquiring Crash Reports
Sending Crash Reports to a Developer
Xamarin is working on getting the Testflight SDK to fully work with MonoTouch (i.e. the service itself (distribution already works and is integrated in the latest MonoDevelop releases). That will give you another option (for crash reporting) in the future.

The official (I assume given it's a branch of the mono git hub repository) monotouch-bindings project over on github now has support for the TestFlight SDK, check out:
https://github.com/mono/monotouch-bindings/tree/master/TestFlight
and
https://github.com/mono/monotouch-bindings
Excerpt from their readme:
TestFlight
This is a MonoTouch binding for the TestFlight SDK which can be found at
https://testflightapp.com/sdk/
The current version of this binding is for TestFlight SDK 1.2.1
v 1.2.1 released on 26 dec 2012
Bindings updated on 17 mrt 2013
Building
Run make in the binding directory to build TestFlight.dll
Using TestFlight.dll with your own iOS App
Simply add TestFlight.dll to your project's References in MonoDevelop and you
are good to go!
To use the thread safe TakeOff methode. Change TestFlight.TakeOff(token) to TestFlight.TakeOffThreadSafe(token)

Related

How to explain the huge difference between Fabric crashes and Xcode crashes?

We have an app live with thousands of daily users. We released a new version in phases, where the current 2% phase is paused.
We use fabric/crashlytics for logging the crashes. The Environment class is reading data from the Keychain, and is developed by ourselves. The error of the crash is errSecInteractionNotAllowed.
Fabric reports 121 crashes in our Environment class on version 2.1.2, while XCode only reports 3 crashes on the same version.
The only reason we can think of: We read something about iOS calling the app in the background while automatically updating the app. When the device is locked during the update, the Keychain will be locked as well. This would result in a crash. It might happen that Apple doesn't report this crash, since it is caused by the Apple updating system.
Is there any other clue that explains the difference between Fabric and XCode crashes?
To see the Xcode crashes, users have to explicitly enable a setting "Share crash reports with apple and developers" (I think thats what its called) either during phone setup or later on via iOS settings app. If they don't enable it, you won't see anything. Most people I know don't enable it as they are worried about privacy.
Crashlytics doesn't require users to agree to sending reports. So its extremely likely crashlytics will report a higher volume of crashes.

iOS Google Analytics Crash report

Does anyone know when GoogleAnalytics iOS SDK v3 sends the crash to their servers (when app is on AppStore)?
Does it send when the app crashes, or when the user reopens it?
The problem is that, I'm viewing a lot of crashes from a bug that I think I solved, and on HockeyApp I'm not receiving anymore of these.
Thanks
Some points:
Crash reports are usually send the next time the app starts. Trying to send them at crash time may cause big harm to an app and its data. As far as I know GoogleAnalytics only sends reports on the next startup.
Google Analytics can only catch crashes caused by exceptions! In addition, any other exception handler will NOT be able to catch the exception! This is why you only see reports in Google Analytics but not in HockeyApp. This will happen with any other 3rd party SDK too. Usually the last crash reporting SDK you setup in your app wins.
You can test this yourself by using the CrashProbe open source project and include the SDK or SDKs you want to use. And then monitor the behavior for various crash types.
From my personal experience, Google Analytics is not good in capturing crash report as I think the crash report might not be real time . Personally, I like bugsense and I am using paid version of Bugsense. Its free version is good for most apps as well. May be you can try out the free version.

Getting Production data for iOS apps with Testflight sdk

I have an iOS App with Testflight's sdk 1.1 enabled to get production data. This worked well during beta testing and I submitted the same build (with sdk enabled) to Appstore and the build is approved and released.
However, I dont see any data regarding the usage in testflight live. I have been looking around to find if there are any special setup needed for that without success.
Note that I DONT have the same build version as in appstore in testflight anymore. But I figured that testflight live will still be able to show usage dat.
Anyone have experience with this? Can someone point me in the right direction
After checking around, it looks like as of v1.1, you NEED to have the same build that is submitted to Appstore to be in testflight as well. The reason is that the event matching is done using the UUID of the build.
Their support indicated that they are working on handling orphaned build events as well.

How to get the Crash Log from Apple?

We developed an app, and it works perfectly on several different emulators and devices, not once crashed, but both times we tried submitting to Apple it gets back to us as "2.1 - apps that crash are rejected" (or something).
I cant seem to find the log from them, or any additional infos. Is the crash log available anywhere? Or just ANY info? They only say that it crashed on an iPad 3rd Gen with iOS 6. We ran on a device like that and it didnt crash for us.
Unfortunately, Apple doesn't provide detailed logs of their review process, although crash logs are sometimes provided, as indicated by #jsd in the comments below.
In theory, crash reports get synchronized with iTunes and can be collected by Apple and provided to you via iTunes Connect, but in practice, that rarely works - or only with large delays.
However, you could integrate some Crash Reporting into your App. Here are a few services that allow you to do that without much hassle:
HockeyApp
Crittercism
BugSense
TestFlight
Crash reporting integration in production versions of my apps have been proven to be very helpful, so I'd highly recommend this. Good crash reporting services provide an SDK to be included in your app, and generate symbolicated, readable, ready-to-use crash reports that make tracking bugs very easy.
As for the cause of your app's crash, here are some basic guesses:
Do you use ARC (Automatic Reference Counting)? You should.
Did you run the Static Analyzer in Xcode (Product ➞ Analyze)?
Did you test with different environments (e.g. internet connection via 3G, WiFi or none at all)?
Have you deleted and reinstalled the app on your device, or did you just update it?

Programmatically getting Crash Reports inside an iOS app

I want to access the crash reports of my app inside my app and i need to send the crash reports to a server. I searched in google and I couldn't find any API that helps my purpose but I found there are open source projects like QuincyKit, plcrashreporter for getting the crash reports of the application. If I use these APIs will apple reject my app ?
Thanks in Advance
There is no API from Apple to do that. So the only chance is to use a 3rd party framework which catches the crash when it happens and provides options to further process it afterwords.
There are multiple solutions available, one is QuincyKit. The second part of the answer of Including custom data into iOS crash dumps shows all known solutions and services that you can use.
Note: I am the developer of QuincyKit and also part of the HockeyApp team.
About QuincyKit:
I've used only Flurry, which has crash collection, and there seems to be no problem in using these libraries in your project for the app store.

Resources