IAP-Enabled Apps Get Rejected from iOS Store
We have an issue where our App is repeatedly rejected from the iOS Store because it apparently does not work with In-App Purchases over an IPv6 Network. According to 4.12 release notes, IPv6 is now supported - but something in our project is clearly disabling it or preventing it from working.
We have two versions of our game, the full edition which has Game-Center Support but no In-App Purchases, and we are now trying to publish a 'Lite' edition which is free, but contains ads and in-app purchases. This version is already available on the Google store and works just fine.
The issue is that Apple are continuosly rejecting our App, and are also now rejecting updates to the full version of the game for the same reason despite it having no in-app purchase support at all. It's almost as if a system / environment variable has been set somewhere - and our machine is building out incorrectly. This still however doesn't solve why the Lite version is being rejected in the first place.
If you check the forum post, you can see what steps we have already taken to try and resolve the issue.
Ok, discount this answer. It turns out that while IPv6 was enabled in 4.12, it wasn't properly setup for iOS. There is a fix for this, but it is pretty involved and will require modifying several file. Further, it doesn't auto detect whether the network is IPv4 vs. IPv6. Pulled from a UDN post:
To those interested in getting IPv6 sockets working:
For IOS to use IPv6, have the /sockets/IOS/SocketSubsystemIOS.h derive from SocketSubsystemBSDIPv6:
However, this isn't the only change needed. There is a bug that happens when you try to connect to the same URL twice (maybe consecutive games?), where the first time successfully resolves to an IPv6 IP, but the second time comes back as an IPv4 IP which has been forced into IPv6 notation. This is due to the constructor for FResolveInfoCached, specifically FResolveInfoCached(const FInternetAddr& InAddr). It only takes the uint32 portion of the IP from the InAddr.
This fix is a bit more involved, since in the current system FResolveInfoCached is only defined in IPAddress.h. Here are the steps used to resolve this issue:
Next, add in SocketSubsystem.h in ISocketSubsystem:
Now we need to add the BSDIPv6 support:
In IPAddressBSDIPv6.h: add the following class
And finally, modify SocketSubsystemBSDIPv6.h, adding:
This should allow you to use BSD ipv6 sockets in IOS.
(Courtesy of Nik of iNiS Corporation).
answered Sep 07 '16 at 07:12 PM
Set the bCompileForSize option to false in your IOSEngine.ini file. If you didn't have this file before, you are now building the executable in a different way (all of those settings in the BuildSettings section). We've had troubles with compile for size with recent updates to the clang compiler which we are still finding. Removing that will increase the size of the executable, but you didn't have it before anyway so it shouldn't be an issue.
Do you have access to an IPv6 network for testing? If so, after the build, try testing the IAP to see if you get a connection to the store. If not, then try submitting again and see if it passes.
answered Sep 07 '16 at 06:50 PM
Follow this question
Once you sign in you will be able to subscribe for any updates here