Hey, thanks for the quick reply, advice on how to respond to App Review in the future (but your response was timely and has been more helpful than ANY correspondence I have EVER received from App Review), but I have some followup questions/comments.
> "From time to time, App Reviews of in app purchase apps
> will fail when the SKProductsRequest is made"
My first urge is to file a radar but I'm certain they will ask for a sample app and there's no way I can reproduce this error (because somehow magically it works for me after I created a new Sandbox user). I have literally lost a day or two of work when this behavior first appeared during development, and since the App Review, where I did everything they directed me to, and then to find out this is a known issue/bug that needs to be elevated by filing radars.
> "the app did not check that the identifiers were not returned
> instead assumed that they were valid and crashed"
Correct.
> "The application should check the response result
> and either alert the user if the in app purchase identifiers
> are returned as invalid, or not offer them for purchase."
Yes, I considered to check for an empty array (and looking at the invalid identifier), but I don't know how an alert would help any user who experiences this. Yes, an alert is better than a crash, but what would the alert say? "Sorry, something is wrong within the App Store and you can never upgrade this app."? The upgrade is my only IAP product. Is the alert ONLY for App Review folks? What would you say in the alert? Asking a brand new user to restart/power down a device is NOT a good user experience (if that even works) and they of course will blame my app for the issue regardless.
You said that App Review should reset their test device (they said it failed with 5 or 6 test devices!). When I first encountered the no-valid-identifier-even-though—there-is-a-valid-identifier issue in development (after I corrected a wrong product identifier in iTunes Connect), I tried powering down/resetting my iPhone, stopped/started Xcode, restarted my iMac, etc. (all several times). So after Googling, I found that others had this same issue and the only solution I found was that "test users" sometimes go "bad", so delete the "bad" user, and create a new one. That's what I did, and magically it has worked ever since with my testing and even with my archived ipa after the rejection.
> "make the SKProductsRequest once"
In my main view controller's viewDidLoad, I check a key in a shared group to see if there has been an upgrade. The product request is made only if there has not been an upgrade, and all IAP calls, e.g. addPayment, restorePurchase, are done via a singleton IAP handler in another view controller (where the cached IAP info is displayed from the singleton). I also check that setting in the action extension but do not do anything whatsoever with IAP or the IAP framework.
So, yesterday when I decided to spend even more hours looking for anything at all that could cause the issue from my end (and before your comments), I looked again at the IAP section for my app in iTunes Connect. I found a notice that said my In-App Purchase had been "returned" to me and that I had to change something (Developer Action needed). And I thought that maybe that happened before the review (or something), and so I added a space to the product description, saved it, and resubmitted the app without changing the binary.
I'm planning on another rejection in a week or two, and I would appreciate your comments on what an alert should say to real users, and how they should fix the problem from their end if that is even possible (without changing their Apple ID). Thanks.