Guideline 2.1 - Performance - App Completeness
We found that your in-app purchase products exhibited one or more bugs when reviewed on iPad running iOS 14.0.1 on Wi-Fi. Specifically, we could not complete the in-app purchase. When purchasing, it goes into an endless loop and the payment mechanism keeps presenting.
Next Steps
When validating receipts on your server, your server needs to be able to handle a production-signed app getting its receipts from Apple’s test environment. The recommended approach is for your production server to always validate receipts against the production App Store first. If validation fails with the error code "Sandbox receipt used in production," you should validate against the test environment instead.
Additionally, I don't validate purchases in my code. I have tested the app in numerous iPhones in test flight and it works. Also, I don't get such an error/bug in dev with any of the emulators. Any workaround for the app store?
In terms of code, below is the one for purchasing no-consume item.
Code Block async Task ExecuteRemoveAdCommand() { if (IsBusy) return; IsBusy = true; try { var connected = await CrossInAppBilling.Current.ConnectAsync(); if (!connected) { await App.Current.MainPage.DisplayAlert("Not Connected", "It seems something is wrong with your connection. " + "We could not connect to the store, please try again", "OK"); return; } //try to purchase item var purchase = await CrossInAppBilling.Current.PurchaseAsync(Helper.ProductId, ItemType.InAppPurchase, "apppayload"); if (purchase == null) { await App.Current.MainPage.DisplayAlert("Not Purchased", "We could not perform your purchase at the moment, please try again", "OK"); return; } else { //Purchased, save this information var id = purchase.Id; var token = purchase.PurchaseToken; var state = purchase.State; if (!string.IsNullOrEmpty(id)) { await App.Current.MainPage.DisplayAlert("Purchase Successful", "You are enjoying ad free wQuran. Thank you for your purchase", "OK"); AdVisibility = false; } } } catch (Exception ex) { Debug.WriteLine(ex.Message); await App.Current.MainPage.DisplayAlert("Not Purchased", "We could not perform your purchase at the moment, please try again", "OK"); } finally { await CrossInAppBilling.Current.DisconnectAsync(); IsBusy = false; } }