Users say that the iOS app crashes without any further explanation - ios

I have an app in iTuens which is quite popular and the user are writing bad reviews saying that the app crashed sometimes without any reason or explanation.
I have tested the app both on simulator and on a real device. It works fine for me and there are no memory leaks in xCode either.
What can I do in this situation to fix the crash?
Is there any crash reporting API that I could implement in the app so that the user can send the crash log to me within the app?

There are multiple options available, some fully open source, some partly, some free, some paid.
iTunes Connect mostly doesn't work. The reasons are:
In older iOS Versions, people needed to sync the device to iTunes, which would then upload the crash reports to iTunes Connect. But these users had to agree to "sending anonymous usage and diagnostic data" to Apple when setting up the device. Most people just don't allow that.
In newer iOS Versions (I think it started in iOS 6) the device is sending crash reports directly to iTunes Connect. BUT also in this case, the user has to approve "sending anonymous usage and diagnostic data" when setting up the device. Most people just don't allow that again. You can check yourself if you allowed it in the Settings app under General, About, then scroll down to Diagnostics & Usage.
So the best way to get crash reports (sadly) is to include a crash reporting library into your app. Due to privacy reasons, you should allow the users to allow or deny sending the reports. Most people do allow this, since the dialogs mostly say something like anonymous data to fix the bug that caused the app to crash and (hopefully) won't send any privacy problematic data in then too. But the magic is I think, that it doesn't say usage data in such a global context. Never had problems in all the years not getting crash reports even though showing alerts and letting the users decide, also with an option to Always send.
The following answer shows an overview of available crash reporting solutions: how to generate crash report using code like crash report provided by Apple

Just an update for ios 8 & 9:
On your iOS device, go to Settings > Privacy > Diagnostics & Usage, and select Automatically Send or Don't Send.
When you turn on Automatically Send, you can also turn on Share With App Developers. This helps developers improve their apps by allowing Apple to share data, as well as statistics about how you use their apps.

Related

If I use third party crash-analytics sdk in my production app , will it suppress my iTunes-Crash Report?

My app is now going on to production phase. If I use third party crash-analytics sdk in my production app , will it suppress my iTunes-Crash Report.
No, it won't. I have Fabric with Crashlytics installed in various apps and I still see the reports in iTunes Connect.
Apple will always get crash reports. Apples crash reporter runs out-of-process, all 3rd party crash reporting solutions run inside your apps process. Depending on the quality of the 3rd party crash reporter implementation, Apples crash reports may not have the best quality.
There are some crash reports that you will only get from iTunes Connect which is basically all that are technically app kills and not crashes, e.g. when your app blocks the main thread too long, or if it takes too long to launch or exit the app.
One difference is that you may not get access to every single crash report from Apple and it is unknown when they show reports and if they do any sampling or similar. Crash reports will also only be sent to Apple, if the user agrees to share this information in general when setting up the device or changing the according setting in the settings app. There are reports that only about about 30% of device users activate this settings. The amount may vary by app and can of course also yield in bigger percentages.

How to enable crash report submission to iTunesConnect from iOS App?

I was using Evernote and it crash once, So after crashing I reopen it and it ask me for submit crash report to developer.
After some googling I have found in my iTunes Connect Account in Application detail there is one option called Crash reports.
So my conscience is that how to enable crash report submission in Application.
If the app asks for sending crash reports this has nothing to do with iTunes Connect.
The reports you see in iTunes Connect are send automatically by the phone (or iTunes?) when the user has agreed to send diagnostic reports when they set up their device. This happens automatically, you don't have to configure anything at all. Just go to iTunes Connect and get the crash reports.
But to be honest, iTunes Connect crash reports seem a little bit unreliable. If you see them at all it takes almost forever until you see them. Another culprit is that you have to check for new reports manually.
So Evernote, like basically everyone else, switched to a 3rd party service for crash reporting.
I use crashlytics in my own apps. But there are many others.
A good read might be Ray Wenderlichs Overview of iOS Crash Reporting Tools: Part 1/2 and Part 2/2
Some personal experience:
Since my apps don't crash often I usually see "Too few reports have been submitted for a report to be shown." in iTunes Connects crash reporter. But when I open the console of crashlytics is see 6 different crashes right now. Most of them affect only two or three people but it's good to be aware of new issues, even if few people are affected.
iTunes Connect does not show crash reports for prerelease versions of iOS. But it happened that I had a horrible bug in my app that lead to a crash instantly after people opened the settings of my app on a prerelease version of iOS. After the first crash report came in via crashlytics I fixed that bug and submitted an update. Because I didn't have time to test against the first betas it would have taken a while to be aware of this crash if I had relied solely on iTunes Connect.

Is there a way to have our own app to upload its crash repot?

Not sure if that is possible. But what happens is, sometimes our app randomly crashes. We don't know what exactly the problem is. Is there a way for us to get the crash report off user's iphone? By code, or by another app?
Thanks.
You can inject a third party code in your app, which would basically save your crash reports and thereafter you can use them for analysis. The way we do is capture any crash logs and upload them to the app server, which uses the info to display through a user-friendly web Interface (access controlled for admin purposes).
A great open source Crash Reporter library can be found here https://github.com/kstenerud/KSCrash
It's the user who decides from Settings > General > About > Diagnostics & Usage whether to automatically send crash reports or not.
You can also use a third party component to get detailed information about crash events, for example Crittercism.
If you're interested in 3rd party services for crash reporting for iOS it's hard to go past Crashlytics. Very fast crash reporting, simple installation, great response times to queries.
I'd also mention the TestFlight SDK, which is free and easy to use, and allows you to gather crash reports easily from all your testers, and also do remote logging and other stuff. I used it on a location based app I was working on a while ago, and it was very helpful with debugging

Crash logs in enterprise ios app

I would like to extract crash logs of those users who are using my enterprise app. In case of the App Store apps I can get this information from iTunes connect. Since there is no intervention of App Store in case of Enterprise deployment therefore not sure how to access this information.
Is there any Objective-C API through which I can access the crash logs with the application code and upload them on my server using a web-service?
There is no Objective-C API available to access iOS generated crash reports. The only way to automatically access them, is adding a crash reporting framework to your apps that also catches the crashes and let you send them to a service or your own server.
I highly recommend not engineering your own crash reporting or exception handling mechanism, since it is way too complicated to make it right and not introduce more dangerous problems that could e.g. cause your app users to loose data.
The second part of my answer here lists a few options, contains open source projects, services with open source SDKs and closed source options: iOS crash log catch, debug info.. Catch and send via email to the Dev team
Try using Crashlytics.
Very powerfull. Very pleasant to use.
You can instruct your users to extract the logs from iTunes and send them to you. Take a look at the "Sending Crash Reports to a Developer" section of this document: http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/ios_development_workflow/35-Distributing_Applications/distributing_applications.html

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?

Resources