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.