Troubleshooting - Unreal SDK

iOS

Problem

Users may see the domain of passwords stored with the Password AutoFill feature as airbridge.io or abr.ge.

Cause

After setting up deep links for the Airbridge SDK, if you utilize the Password AutoFill feature, the domain is saved as the applinks domain of the Airbridge deep link, which is airbridge.io or abr.ge.

Solution

The problem can be solved by setting up the webcredentials domain used in the Password AutoFill.

1. Prepare the domain that will store the password.

2. Host the JSON below at https://YOUR_DOMAIN/.well-known/apple-app-site-association with Content-Type: application/json. Your prepared domain should be entered instead of YOUR_DOMAIN.

You can find the App ID Prefix and Bundle ID in the [Identifiers]>[YOUR_APP] menu of the Apple Developer Portal.

12345
{
    "webcredentials": {
        "apps": ["YOUR_APP_ID_PREFIX.YOUR_BUNDLE_ID"]
    }
}

3. Navigate to [YOUR_PROJECT]>[Signing & Capabilities] in Xcode.

4. Click + Capability to add Associated Domains. Enter webcredentials:YOUR_DOMAIN in Associated Domains.

Problem

Upon uploading the app to the App Store, Xcode displays a warning message that a dSYM for the Airbridge framework was not included.

Cause

The Airbridge iOS SDK does not support dSYM.

Solution

The dSYM will be supported in the coming update. You may ignore this warning.

Android

Issue

A coroutine dependency error occurs during the build process with the following message.

Text
1234
java.lang.NoClassDefFoundError: kotlin/coroutines/AbstractCoroutineContextKey
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
  ...

Cause

If the kotlinx-coroutines-core library version is 1.3.5 or later, the kotlin-stdlib library version must be at a certain level or later.

Solution

Check whether the kotlin-stdlib library version is v.1.3.70 or later with the gradlew dependencies command. If the version is earlier than v.1.3.70, you need to update it.

Issue

Deeplink Open events that occur through the push notifications generated by the Braze SDK are not collected by Airbridge. Instead, the App Open event is collected.

Cause

The Airbridge Android SDK uses the dataString in the action and intent of the Activity to distinguish between Deeplink Open events and App Open events.

When a user opens the app through a push notification using the Braze SDK, the app goes through NotificationTrampolineActivity. This activity handles push notifications, but the dataString is not included in its action and intent, preventing the SDK from determining if it's a Deeplink Open event or an App Open event.

Solution

Add a custom Application class (CustomApplication.java) file as shown below.

12345678910111213141516171819202122232425262728293031323334
package com.company.product;

import android.app.Activity;

import com.epicgames.ue4.GameApplication;

import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;

import co.ab180.airbridge.AirbridgeLifecycleIntegration;
import co.ab180.airbridge.ue.AirbridgeUnreal;

public class CustomApplication extends GameApplication {

    @Override
    public void onCreate() {
        super.onCreate();

        AirbridgeUnreal.setLifecycleIntegration(new AirbridgeLifecycleIntegration() {

            @Nullable
            @Override
            public String getDataString(@NotNull Activity activity) {
                if (activity.getClass().getName().equals("com.braze.push.NotificationTrampolineActivity")
                        && activity.getIntent() != null
                        && activity.getIntent().getExtras() != null
                ) {
                    return activity.getIntent().getExtras().getString("uri");
                }
                return null;
            }
        });
    }
}
12345678910111213141516171819202122232425262728293031323334
package com.company.product;

import android.app.Activity;

import com.epicgames.unreal.GameApplication;

import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;

import co.ab180.airbridge.AirbridgeLifecycleIntegration;
import co.ab180.airbridge.ue.AirbridgeUnreal;

public class CustomApplication extends GameApplication {

    @Override
    public void onCreate() {
        super.onCreate();

        AirbridgeUnreal.setLifecycleIntegration(new AirbridgeLifecycleIntegration() {

            @Nullable
            @Override
            public String getDataString(@NotNull Activity activity) {
                if (activity.getClass().getName().equals("com.braze.push.NotificationTrampolineActivity")
                        && activity.getIntent() != null
                        && activity.getIntent().getExtras() != null
                ) {
                    return activity.getIntent().getExtras().getString("uri");
                }
                return null;
            }
        });
    }
}

Add a custom application class to the Android Manifest file using Unreal Plugin Language (UPL), as shown below.

123456789101112
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:android="http://schemas.android.com/apk/res/android">
	
    <prebuildCopies>
        <copyDir src="$S(PluginDir)/..." dst="$S(BuildDir)/src/com/company/product" />
    </prebuildCopies>
    
	<androidManifestUpdates>
		<addAttribute tag="application" name="android:name" value="com.company.product.CustomApplication"/>
	</androidManifestUpdates>
	
</root>

Issue

The "Manifest merger failed" error occurrs during the build process.

Cause

The Airbridge SDK's AndroidManifest.xml includes rules to opt-out of backing up the Shared Preferences data. The purpose of this rule is to avoid retaining the same Airbridge settings during the reinstallation of the app so that new installs or reinstalls can be detected accurately.

Merging Airbridge SDK backup rules with your app backup rules can cause conflicts.

Solution

Below are the opt-out rules defined in the Airbridge SDK.

123456789101112131415161718192021
<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
    <cloud-backup>
        <exclude domain="sharedpref" path="airbridge-internal" />
        <exclude domain="sharedpref" path="airbridge-install" />
        <exclude domain="sharedpref" path="airbridge-user-info" />
        <exclude domain="sharedpref" path="airbridge-user-alias" />
        <exclude domain="sharedpref" path="airbridge-user-attributes" />
        <exclude domain="sharedpref" path="airbridge-device-alias" />
        <exclude domain="database" path="airbridge.db" />
    </cloud-backup>
    <device-transfer>
        <exclude domain="sharedpref" path="airbridge-internal" />
        <exclude domain="sharedpref" path="airbridge-install" />
        <exclude domain="sharedpref" path="airbridge-user-info" />
        <exclude domain="sharedpref" path="airbridge-user-alias" />
        <exclude domain="sharedpref" path="airbridge-user-attributes" />
        <exclude domain="sharedpref" path="airbridge-device-alias" />
        <exclude domain="database" path="airbridge.db" />
    </device-transfer>
</data-extraction-rules>
12345678910
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <exclude domain="sharedpref" path="airbridge-internal" />
    <exclude domain="sharedpref" path="airbridge-install" />
    <exclude domain="sharedpref" path="airbridge-user-info" />
    <exclude domain="sharedpref" path="airbridge-user-alias" />
    <exclude domain="sharedpref" path="airbridge-user-attributes" />
    <exclude domain="sharedpref" path="airbridge-device-alias" />
    <exclude domain="database" path="airbridge.db" />
</full-backup-content>

Fix conflict with fullBackupContent="string"

Adding android:fullBackupContent="string" to the AndroidManifest.xml may cause an error like the following.

Build Output
1
Manifest merger failed : Attribute application@fullBackupContent value=(string) from AndroidManifest.xml

To fix this error,

  • add xmlns:tools="http://schemas.android.com/tools" in the Platforms > Android > Extra Tags for <manifest> node to the Unreal Editor Project Settings window.

  • add tools:replace="android:fullBackupContent" in the Platforms > Android > Extra Tags for <application> node to the Unreal Editor Project Settings window.

Fix conflict with dataExtractionRules="string resource"

Adding android:dataExtractionRules="string resource" to the AndroidManifest.xml may cause an error like the following.

Build Output
12
Manifest merger failed : Attribute application@dataExtractionRules value=(string resource) from AndroidManifest.xml

To fix this error,

  • add xmlns:tools="http://schemas.android.com/tools" to the Platforms > Android > Extra Tags for <manifest> node in the Unreal Editor Project Settings window.

  • add tools:replace="android:dataExtractionRules" to the Platforms > Android > Extra Tags for <application> node in the Unreal Editor Project Settings window.

Fix conflict with allowBackup="false"

If you add android:allowBackup="false" in the AndroidManifest.xml, you might get the following error:

Build Output
123
Manifest merger failed : Attribute application@allowBackup value=(false) from AndroidManifest.xml:32:9-36
	is also present at [:airbridge] AndroidManifest.xml:27:9-35 value=(true).
	Suggestion: add 'tools:replace="android:allowBackup"' to <application> element at AndroidManifest.xml:30:5-250:19 to override.

To fix this error,

  • add xmlns:tools="http://schemas.android.com/tools" to the Platforms > Android > Extra Tags for <manifest> node in the Unreal Editor Project Settings window.

  • add tools:replace="android:allowBackup" to the Platforms > Android > Extra Tags for <application> node in the Unreal Editor Project Settings window.

If compileSdkVersion is l than 31

The android:dataExtractionRules has been added in API Level 31. Therefore, if the compileSdkVersion is lower than 31, an error like the following may occur.

Build Output
1
AndroidManifest.xml: AAPT: error: attribute android:dataExtractionRules not found.

To fix this error,

  • add xmlns:tools="http://schemas.android.com/tools" to the Platforms > Android > Extra Tags for <manifest> node in the Unreal Editor Project Settings window.

  • add tools:remove="android:dataExtractionRules" to the Platforms > Android > Extra Tags for <application> node in the Unreal Editor Project Settings window.

For more guidance, refer to the articles below.

Issue

If an Airbridge SDK backup rule and a backup rule for a different third-party SDK (e.g., AppsFlyer SDK) overlap, you will see the build error below.

123
Attribute application@fullBackupContent value=(@xml/appsflyer_backup_rules) from [com.appsflyer:af-android-sdk:6.6.1] AndroidManifest.xml:14:18-73
is also present at [io.airbridge:sdk-android:2.14.0] AndroidManifest.xml:27:18-78 value=(@xml/airbridge_auto_backup_rules).
Suggestion: add 'tools:replace="android:fullBackupContent"' to <application> element at AndroidManifest.xml:7:5-13:19 to override.

Cause

Overlapping of the Airbridge SDK backup rules and third-party SDK backup rules can cause build errors.

Solution

backup_rules.xml setup

  1. Create a file (e.g., custom_backup_rules.xml) within the module directory.

  2. Add the data backup rules defined by the Airbridge SDK as follows.

    12345678910111213141516
    <?xml version="1.0" encoding="utf-8"?>
    <full-backup-content>
        <!-- Airbridge Backup Rules -->
        <exclude domain="sharedpref" path="airbridge-internal" />
        <exclude domain="sharedpref" path="airbridge-install" />
        <exclude domain="sharedpref" path="airbridge-user-info" />
        <exclude domain="sharedpref" path="airbridge-user-alias" />
        <exclude domain="sharedpref" path="airbridge-user-attributes" />
        <exclude domain="sharedpref" path="airbridge-device-alias" />
        <exclude domain="database" path="airbridge.db" />
      
        <!-- Appsflyer Backup Rules -->
        <exclude domain="sharedpref" path="appsflyer-data"/>
    	
    	<!-- Your Custom Backup Rules -->
    </full-backup-content>
  3. Using the Unreal Plugin Language (UPL), copy the file into your res/xml folder as follows.

    123456789
    <?xml version="1.0" encoding="utf-8"?>
    <root xmlns:android="http://schemas.android.com/apk/res/android">
        ...
        <resourceCopies>
            <copyFile src="{YOUR_XML_BACKUP_RULES_PATH}" dst="$S(BuildDir)/res/xml/custom_backup_rules.xml" />
            ...
        </resourceCopies>
        ...
    </root>

data_extraction_rules.xml setup

  1. Create a file (e.g., custom_data_extraction_rules.xml) within the module directory.

  2. Add the data backup rules defined by the Airbridge SDK as follows.

    123456789101112131415161718192021222324252627282930313233
    <?xml version="1.0" encoding="utf-8"?>
    <data-extraction-rules>
        <cloud-backup>
            <!-- Airbridge Backup Rules -->
            <exclude domain="sharedpref" path="airbridge-internal" />
            <exclude domain="sharedpref" path="airbridge-install" />
            <exclude domain="sharedpref" path="airbridge-user-info" />
            <exclude domain="sharedpref" path="airbridge-user-alias" />
            <exclude domain="sharedpref" path="airbridge-user-attributes" />
            <exclude domain="sharedpref" path="airbridge-device-alias" />
            <exclude domain="database" path="airbridge.db" />
    
            <!-- Appsflyer Backup Rules -->
            <exclude domain="sharedpref" path="appsflyer-data"/>
    
    	    <!-- Your Custom Backup Rules -->
        </cloud-backup>
        <device-transfer>
            <!-- Airbridge Backup Rules -->
            <exclude domain="sharedpref" path="airbridge-internal" />
            <exclude domain="sharedpref" path="airbridge-install" />
            <exclude domain="sharedpref" path="airbridge-user-info" />
            <exclude domain="sharedpref" path="airbridge-user-alias" />
            <exclude domain="sharedpref" path="airbridge-user-attributes" />
            <exclude domain="sharedpref" path="airbridge-device-alias" />
            <exclude domain="database" path="airbridge.db" />
    
            <!-- Appsflyer Backup Rules -->
            <exclude domain="sharedpref" path="appsflyer-data"/>
    
    	    <!-- Your Custom Backup Rules -->
        </device-transfer>
    </data-extraction-rules>
  3. Using the Unreal Plugin Language (UPL), copy the file into your res/xml folder as follows.

    123456789
    <?xml version="1.0" encoding="utf-8"?>
    <root xmlns:android="http://schemas.android.com/apk/res/android">
        ...
        <resourceCopies>
            <copyFile src="{YOUR_XML_BACKUP_RULES_PATH}" dst="$S(BuildDir)/res/xml/custom_data_extraction_rule.xml" />
            ...
        </resourceCopies>
        ...
    </root>

AndroidManifest.xml setup

In the Unreal Editor Project Settings window, add the following element to the Platforms - Android > Advanced APK Packaging > Extra Tags for <manifest> node.

  • xmlns:tools="http://schemas.android.com/tools"

In the Unreal Editor Project Settings window, add the following elements to the Platforms - Android > Advanced APK Packaging > Extra Tags for <application> node.

  • android:allowBackup="true"

  • android:fullBackupContent="@xml/custom_backup_rules"

  • android:dataExtractionRules="@xml/custom_data_extraction_rules"

  • tools:replace="android:fullBackupContent, android:dataExtractionRules"

For more guidance, refer to the articles below.

Issue

GAID is being collected as 00000000-0000-0000-0000-000000000000 even though LAT (Limited Ad Tracking) is deactivated.

Cause

The AD_ID permission has been excluded due to other third-party libraries.

Solution

Add AD_ID permission.

12345
<manifest ...>
  ...
  <uses-permission android:name="com.google.android.gms.permission.AD_ID" />
  ...
</manifest>

Issue

When uploading your app to Google Play Console, you may receive the following warning or rejection messages:

  • "Your app doesn't support 16 KB page size"

  • "16 KB page size compatibility required"

  • App upload is rejected or displayed in a warning state

This is due to Google Play policy requirements that apps targeting Android 15 (API level 35) or higher must support 16KB page size.

Cause

Airbridge SDK supports 16KB page size from the following versions:

However, SDK support alone is not sufficient. The entire app (APK/AAB) must be packaged with 16KB zipalign to pass Google Play policy.

If APK/AAB is not built with 16KB zipalign:

  • You will receive warning or rejection messages when uploading to Google Play Console

  • Uploads will be completely blocked after November 1, 2025

  • The app may not work properly on 16KB page size devices in the future

Solution

Step 1: Check Airbridge SDK Version

First, verify that your Airbridge SDK version supports 16KB. If you are using an older version, you must update to the latest version.

Step 2: Check and Configure Android Gradle Plugin (AGP) Version

Check your project's current AGP version.

If using AGP 8.5.1 or higher:

  • 16KB zipalign is automatically applied without any additional configuration.

  • Proceed directly to Step 3.

If using AGP 8.5.0 or lower:

  • Option A: Upgrade AGP to 8.5.1 or higher

  • Option B: Keep current AGP version + Add configuration

    12345678
    android {
        ...
        packagingOptions {
            jniLibs {
                useLegacyPackaging true
            }
        }
    }

Step 3: Rebuild and Verify the App

After changing the configuration, perform a clean build of your app.

Step 4: Verify 16KB zipalign Application

Verify that the built APK/AAB is properly 16KB zipaligned.