My app was also rejected because of SKError.Code.unknown during the app review. The deepest internal error had code 500305 with message "Unhandled exception". With the help of Code-Level Support I was able to rewrite IAP-related code, to make it successfully pass the app review. In my case the unknown error occurred, because the app tried to refresh receipt when it was missing and review team always canceled authentication dialog that appeared after SKReceiptRefreshRequest. The correct way to handle a missing appStoreReceipt is to ask whether the user wants to refresh it. Eventually, I just made app to ignore receipt if it is missing. If user purchased something on another device then there is always a "Restore" button available in my app. Moreover, in production the appStoreReceipt is almost always available.