I have an iPhone app that I have developed and tested on my iPhone 4S. The app is released on the market and some users claim that the app is unusable as it crashes on start up.
I have done exactly the same things as the users have to their devices, running the same version of the app on my iPhone 4S and I cannot get it to crash.
I have been to the houses of users and plugged their phones into my computer to get the log read out and when I do, I get errors that I am not getting on my phone and my mac.
I am completely at a loss as to how I start to find the solution to a problem like this. Does anyone have even the faintest ideas?
A good start will be to integrate a crash log collecting, crash reporting SDK in your app like HockeyApp, TestFlight, Crittercism or QuincyKit.
This will send you the crash logs to you so you don't have to collect them manually. These tools can also automatically symbolicate the crash logs for you so you can find the source of the crash in your code.
You should test a release build before you ship it. Archive a release build and distribute it as an Ad-Hoc build. You can load a saved IPA file to your iDevice using iTunes or Organizer. The thing is that you can test a release build which is the same you would ship to the App Store (they are signed differently but the build configuration is the same unless you changed that).
iPhone 5S ships with 64-bit A7 processor. Your iPhone 4 is a 32-bit device. Most likely processor architecture is not the case but as Apple says: Before you distribute your app, you must test it on actual hardware. Some of the runtime changes can be detected only when the app is running on a device. I recommend you updating your set of test devices with different models. I still own an old iPhone 3GS which is great for spotting performance issues.
The general comments others have posted are correct. Add crash logging into your app with a pre-made SDK and test on an actual device. I can't add much more to those points, but I will tell a short story about a similar bug that I found in one of my apps in the hopes it helps you with your issue.
Our app was predominately iPad2 users. When the iPad4 was released, waves of our users upgraded and they started experiencing an issue that was not present on iPad2. Two network requests were fired off at the same time and the result from one of them was crashing. We eventually found out it was a concurrency bug. The result of the first request was being processed "too quickly" and the code was getting to a critical section of code that was not thread-safe with the other request handler.
While this bug was still possible on the iPad2 if the network latency fluctuated just right, it never happened that way. The iPad4 made it happen almost every time.
You can use https://github.com/CocoaLumberjack/CocoaLumberjack lib to collect crash data logs from users.
Have you considered installing a crash logger in your app? There are plenty out there (Flurry, TestFlight, Crittercism, Hockey App, etc).
Most are fairly straightforward to install - add a framework and a couple of lines of code. Once you've done this, you'll (hopefully) be able to see exactly where your app is crashing on the users' devices, without having physical access to them.
Related
I have an iPhone app where I use Firebase Crashlytics.
The following happened:
I build a new version of my app and uploaded it to Testflight.
After that I stopped working for the day :)
The next day I saw a crash report in crashlytics for this new app version, dating to approx. 15 min after my upload the previous day. The data says the crash was recorded on an iPhone 7.
So at this point, this specific app version was only available to me and Apple.
I am sure, that I did not open the app (or experienced a crash) at this time AND I do not even own an iPhone 7.
I highly doubt that Apple Beta-Reviewers are using an iPhone 7 to review an app, after all it's 2021. Also a review 15 min after upload seems not very likely.
Does anyone have an explanation for this? Is the crash even real?
Is it possible that crashes are falsely reported to/by Crashlytics? If so, how?
I've never heard of such a thing tbh.
No, Crashlytics can’t generate crash reports when no one has run the app. Someone ran it.
The fact that you just uploaded it for review makes it very likely that Apple did run it. We have a collection of old devices with various iOS versions for testing our apps in real world scenarios, on less capable devices. I would not be at all surprised if Apple does the same thing.
I recently released an app. It passed well through its testing phase with ten or so users running it day to day on a variety of devices. The app is not really intended for iPad but it works.
On release day a small number of users pitched up saying that the app crashed or that the layout on their iPad was weird. All the complainants were using iPhone 5 or better or recent iPads. I have a pretty new iPhone5, and I went out and bought a new iPad mini. Everything tests perfectly.
So here is my question(s):
What is the strategy for debugging a bug I can't see and I can't test, and when I have no error to work from?
Are there known bugs in these newer devices that I need to be looking at?
Ask users that are experiencing the issue and giving you feedback for sending you screenshots. This would help you to narrow issues with weird layout.
Add a crash reporting SDK to your project like HockeyApp or Crashlytics to get the crash logs. Then, when you symbolicate them, you will get the detailed information about which line of your code is crashing the app.
Okay, I made a pretty simple iPhone app, I tested it with the iOS 5 and iOS 6 simulators for both iPhone and iPad, and everything worked fine! But when I submitted it for review, they rejected it because it crashes on the iPhone 4, and iPad 3, Is there a way I can figure out how to fix this without buying an iPhone 5 and an iPad 3? They did send me the crash files, but I have no clue how to read them. Any suggested is appreciated! :)
You don't. The Simulators are not accurate enough to debug certain problems (the Simulators only run x86 code, not the actual ARM code in the more constrained environment a device presents).
So, you may need to buy, beg or borrow a suitable iOS device or two for testing.
You have to learn how to read the crash files. Try dragging them into the organizer to start with.
There are some aspects that are different on the devices, you should have at least one iOS device of some kind to test on. An iPad is a good choice as you can test both iPhone and iPad apps. Running on any one device will shake out many errors that would happen on all of them - if for example, you didn't realize the iPhone file system was case sensitive but the Mac (and therefore the simulator) filesystem is not.
Even an older iPad 2 refurb would do for such testing...
It's very difficult to debug problems on a specific device without actually having that device. I know that there are some apple stores in my area that will rent devices for a short time for that purpose. You might check around and see if you can find one to borrow or rent for a day or two.
We have an app in the Apple App Store that we can't seem to get installed on a Verizon iPhone (from the App Store, not Xcode). This may have nothing to do with the fact that it's a Verizon device, but that is the main difference I see between it and the devices I can get to run it.
We are attempting to install the app using a promotional code, but we receive an error when hitting Redeem, as seen in this picture: (promo code blocked out)
ERROR: This code is for an app that is not compatible with this device. You can redeem it on your desktop computer or a compatible device.
The error device is an iPhone 4 (Verizon) running iOS 4.2.8. This error was received when the app was built for 3.x and the assumption was that Verizon devices would not accept apps not built with at least SDK 4.
However, the app was recently updated (yesterday) to use the 4.3 SDK. The app has its deployment target set to iOS 3.1 and has been successfully installed and tested on a device (iPhone 3G AT&T) running this version. This latest version has also been successfully retrieved and tested on an iPhone 4 (AT&T) running 4.3. We were under the impression that every version in-between (3.1 - 4.3) would then be compatible, perhaps this is not the case?
Unfortunately, the Verizon device is not available for Xcode deployment nor ad hoc distribution.
Now for the actual development question:
Is there a build setting that can explain this behavior? Failing that, I would like to determine if the error is limited to the specific device or all devices either running 4.2.8 or Verizon specific hardware.
I would be willing to share a promotional code or two to people running 4.2.8 (or later) on a Verizon device (This is not a bribe. You are welcome to keep the app of course, but I am offering this only for installation testing purposes, not for promotional reasons). If you think you can help, please indicate your interest in the comments. I have not mentioned the app here, because I don't want to unnecessarily spam my product if the answer can be determined without it, but I have no problem sharing that information if required.
Update:
I followed lxt's suggestion and waited to see if it was a caching issue with the App Store servers. Unfortunately, 40 hours after I was informed the update was ready for sale, we are still receiving the same error.
I have found the following threads in the Apple Developer forums confirming this problem is not limited to our app: (A login may be required)
Promo-code redeemer getting "this code is for an app that is not c...
Promo codes broken on Verizon iPhones ?
I have submitted a bug report to Apple (ID 9905790) concerning the issue. At this time, I am unsure if this issue is related to Verizon devices or iOS 4.2.8. Once I receive a definitive answer I will post it. For now, a workaround that appears to be working for others which we have not yet tried, is to redeem and install through iTunes.
Since this appears to only affect Promo Code redemption and NOT store purchases, the issue has lost much of its urgency. However, if anyone is able to provide more information or a solution, it is still very much appreciated.
Update:
I can confirm that redeeming the codes through iTunes and then installing to a Verizon device works fine. This means the problem is not with the app or the build settings, but with the Verizon device App Store redemption.
I have received one reply from Apple in response to my bug report asking me to verify if this occurs on 5.0b5. Unfortunately, as previously mentioned, we do not have developer access to the Verizon device (which is the entire reason for using a promotional code in this instance). I have asked them to confirm if this is a Verizon/iOS specific issue and will update this issue when I have more information.
According to the Apple documentation, it's just a matter of setting the deployment target:
You have indicated that your binary requires iOS 4.3 or later. Apps that require iOS 4.3 or later will not be available to Verizon iPhone users. If your app could be compatible with earlier iOS versions, you may want to reject your binary and upload a new one that indicates the earliest compatible iOS.
That's the message that's normally appended to App Store emails when you have an app waiting for review.
So in theory it should 'just work'.
However, what would be interesting to know would be:
Did you produce the promotional code before updating the app?
If so, do you get the same results with a promo code generated after updating the app (you never know with the App Store / iTunes Connect...)
After 24 hours are you still seeing the same issue? (24 hours being the normal App Store 'refresh period')
Sorry, I could not provide you with more concrete answers. At times it does feel like the App Store is held together with string, so it wouldn't be completely surprising if it was some value being kept around that should have been knocked back when you updated the app.
That said, it's a little strange that your app wouldn't work on the Verizon phone when you built it for 3.x. Why is the Verizon device not available for Xcode deployment? Is it because you don't have one to hand (understandable), or is it something else? There's no reason why it shouldn't be able to have ad-hocs thrown on it.
This is pure speculation:
Since there's a different build of iOS for the Verizon phone, maybe under the hood all apps on the appstore are available twice - one time signed for use on the AT&T version of iOS and one time signed for the Verizon version. The Appstore would deliver the appropriate version depending on your device.
If this would be the case and since redemption codes existed before the Verizon line of phones, it may be that redemption codes point to one version of the app only, leading the appstore to believe it is incompatible when redeemed on the "wrong" phone.
End of speculation.
I'd suggest instructing your friend to buy the app (if it's not too costly) and paying him the money back. If this works, then cleary what we're dealing with is a bug in Apples gift code system and you should be filing a bug report about this.
Btw: you're not alone with this problem. Although they didn't resolve it, the guys on this forum mention the exact same situation.
Bit of a hardware question here. I am developing iPad applications for a client and am finding that when I send over beta versions for the client to test, he is finding many more crashes on his devices than I am seeing. A lot of these crashes are 'low memory crashes' which I simply am not seeing/able to reproduce.
Am wondering what differences between the 2 devices there may be so that we can work out if it is a hardware issue. Any ideas?
Make sure of the client's configuration/environment matches your environment. Eg: Outlook Exchange Sync, MobileMe sync. In my Contacts application these caused a lot of crashes because of these.
If possible add more logs and get the logs from console of the client device and verify.
Possibly your client has more stuff running at the same time. Or your own app is background-enabled and is getting killed from time to time...
Always test your own code with the Simulator - it has a feature that allows you to simulate low memory warnings.