In App Purchase for IOS

:white_check_mark: [Guide] iOS In-App Purchases (IAP) Working in Unreal Engine (with Game Center + Apple Login)

Hey devs :waving_hand: — after a lot of headbanging, I finally got In-App Purchases working in Unreal Engine on iOS, along with Game Center and Apple Login. Sharing everything I did so others don’t go through the same mess. :sweat_smile:


:mobile_phone: My Setup

  • Unreal Engine: 5.4 (from source)

  • Platform: iOS (iPad + iPhone)

  • Online Subsystem: iOS

  • IAP Method: Blueprint + App Store Connect


:white_check_mark: What Worked

:wrench: 1. Configure DefaultEngine.ini / IOSEngine.ini

[OnlineSubsystem]

DefaultPlatformService=IOS

[OnlineSubsystemIOS.Store]

bSupportsInAppPurchasing=true

bUseStoreV2=true

[/Script/IOSRuntimeSettings.IOSRuntimeSettings]

bEnableGameCenterSupport=True


:locked_with_key: 2. Fix Unreal Signing & Entitlements

  • Set Bundle Identifier to match your App Store app (e.g. com.YourCompany.Gamename)

  • Turn OFF “Automatically manage signing” in both Unreal and Xcode

  • Use Modern Xcode Build System in DefaultEngine.ini

  • Provisioning Profile MUST have:

    • :white_check_mark: Game Center

    • :white_check_mark: In-App Purchase

    • Signed with a valid Distribution or Development cert


:hammer_and_wrench: 3. Generate & Open Xcode Project

Run this in Terminal:

/Path/To/UnrealEngine/Engine/Build/BatchFiles/Mac/GenerateProjectFiles.sh \

-project=“/Path/To/YourProject/YourProject.uproject” \

-game -engine

Then:

  • Open the .xcodeproj

  • Manually add Capabilities:

    • :white_check_mark: Game Center

    • :white_check_mark: In-App Purchase

  • Assign the correct provisioning profile and turn off auto-signing


:warning: IMPORTANT: Archive Using Xcode, Not Unreal

Unreal’s built-in packaging tool may not correctly embed entitlements (e.g., Game Center, In-App Purchase).
ALWAYS do the final Archive in Xcode to ensure all capabilities are added properly.

How:

  • In Xcode, go to Product > Archive

  • Export the .ipa from Organizer

  • Upload to TestFlight or test locally


:money_bag: 4. Add In-App Products in App Store Connect

  • Go to App Store Connect > My App > Features > In-App Purchases

  • Add product (e.g., com.YourCompany.YourProject.goldcoins100)

  • Make sure:

    • Status is “Ready to Submit” or higher

    • Localized name and pricing are filled

    • Your app is uploaded via TestFlight or marked for review


:test_tube: 5. Test on Real Device with Sandbox Account

  • Must use a Sandbox Apple ID (Settings > App Store > Sign Out > Log into Sandbox)

  • Simulator won’t work

Log output shows:

Returning 0 product(s) and 1 invalid identifier(s) // if product not added to App Store Connect


:light_bulb: 6. Blueprint Notes

  • Use Query In App Purchases node

  • Product Identifiers MUST match App Store exactly

  • Access IOS subsystem explicitly if your default is EOS


:speech_balloon:

:white_check_mark: Step Description
DefaultEngine.ini Set bSupportsInAppPurchasing=true, Game Center = true
Xcode Project Add Capabilities manually
App Store Connect Create product IDs before testing
Archive MUST archive from Xcode to embed entitlements
TestFlight/Sandbox Must test with valid Apple ID
Logs Use Console app, Xcode Devices tab, or idevicesyslog

Hope this helps someone avoid the same chaos :upside_down_face:

If you’re stuck, reply here — happy to share Blueprints or C++ examples.
Cheers!

2 Likes

Hey, I’m having the same issue — been stuck with Invalid UniqueNetId every time I try to Read In App Purchase Information2 on iOS. I tried using Show External Login UI however, it gives me the error saying External UI is not supported.

Game Center login is happening (I’m using the Firebase Features plugin for that), but Unreal still throws the error as if the player isn’t logged in. Did you have to build Unreal from source to get around this, or is there another way to properly initialize the UniqueNetId?

Would really appreciate any insight.

The post smells of AI. That may not be good or bad if it’s useful, but a couple things… There should be no reason to sign manually. It doesn’t explain why you need to do it, but emphasizes that it’s important that you do. This is a familiar pattern from when you have a previous context from the conversation. You can verify that your cert has the capabilities you expect by click the (i) next to the cert.

Also the use of emojis and em dashes and tables and section separators are nice, but…

I use LLMs to help with troubleshooting, too, and I appreciate the attempt to help, but this post asserts itself without explaining why or how it helps.

Edit: I guess this is all to say - don’t give false hope. I’m sure the person’s intentions are good. Here’s my smoking gun for why this problem is unfixable.

“[UE] [2025.08.09-01.48.53:130][282]LogScript: Warning: Script Msg: UInAppPurchaseQueryCallbackProxy2::TriggerQuery - In App Purchases are not supported by Online Subsystem”

It flat out says that it’s not supported by UE. It’s not even attempting to reach out to Apple. How can we fix this and why does it work?