App rejected - linked IAP not returned by SKProductsRequest

Hi.


Am currently struggling to get approval for our first version of an app and have hit a brick wall. Am hoping someone might be able to help point us in the right direction - any help would be greatly appreciated.


Background: One of the first things our app does on startup is call SKProductsRequest to get it's IAP (it only has one). When we or any of our TestFlight users run our app everything works fine - the IAP is returned and when the user reaches the appropriate screen we give them a "Purchase" button along with localised pricing information. This has been 100% reliable.


The issue: When our app gets run during the Review process it seems as though the SKProductsRequest is not returning any IAPs. If no IAPs are returned we display an error message instead of the "Purchase" button and we've now been rejected twice because the message, rather than the purchase button, is being displayed.


Question: Is there anything we need to specifically code for when the app is being reviewed? Why might the response during review be different from when we are testing the app ourselves?


Our initial app binary was submitted along side an IAP and the two were linked in App Store Connect when we submitted the binary. We have asked the Review team whether they have turned-over the IAP to their environment but they have referred us to Developer Support.


Thanks in advance to to anyone who can give us any pointers!

If you attached the IAP to the binary before submission of the binary then App Review should be seeing the same IAP as you. It is possible that the following could affect App Review differently:


1) check 'cleared for sale'

2) receipts need to be decoded in production first and then in sandbox if they fail with 21007

3) your banking agreements need to be signed


But you call SKProductsRequest immediately on launch. (It is, IMHO, poor form to call SKProductsRequest if the user is not interested in IAPs; I am not familiar with the problems this might cause.) Perhaps you are calling it too quickly and the IAPs have not been set up for App Review - that may be another difference between App Review and the sandbox. You could try a few second delay before downloading this information.

Many thanks for your reply and pointers @PBK.


The IAP is "Non-Consumable" and exists to unlock full functionality within the app. We call SKProductsRequest early so that we can display an "Unlock for $X.XX" button with a localised price.


"Cleared for sale" is checked on the IAP, although I've elected to manually release the App itself. Could that be a conflict? It implies that the IAP would be released before the app but not sure why that would be an issue.


Re: your other points, receipts are working fine in TestFlight but during the review the app isn't getting that far. And according to Connect our agreements are in good shape.


I'm actually considering removing the IAP altogether for the initial release (make it a "lite" version), and then adding the IAP only once the binary is in the app store. Feels like there would be fewer moving parts.

I'd display that button with just "Unlock". Then wait a few seconds and call SKProductsRequest giving App Review's system time to find the IAP. If it comes back with a price after that delay, refresh that button so it read "Unlock for $X.XX". If it comes back with nothing I'd ignore the error and leave the button with no price. (Before anyone makes the purchase StoreKit tells them the price.)


Let App Review approve it this way.


If all goes well, after approval update the app removing that few second delay and adding back your alert, if you must. I suspect that App Review won't need that delay if the IAP was already approved.

Thanks will give this a try

What's the application ID for your app. I'd first check everything that PBK has indicated. But if all his points are correct, then this might be an App Review issue.


rich kubota - rkubota@apple.com

developer technical support CoreOS/Hardware/MFI

App rejected - linked IAP not returned by SKProductsRequest
 
 
Q