Troubleshooting - Cordova-Ionic 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.

    An error like below may occur when creating iOS builds with Cordova-Ionic SDK v2.0.1+.

    1
    ld: XCFrameworkIntermediates/AirBridge/AirBridge.framework/AirBridge(AirBridge-arm64-master.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE)

    Since Cordova-Ionic SDK v2.0.1+ uses Airbridge iOS SDK v1.28.0+, Bitcode is no longer supported. Please refer to the Bitcode compile error guide for more details.

    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 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 the following code to the android/app/src/main/java/.../MainApplication.kt file.

    12345678
    import co.ab180.airbridge.cordova.AirbridgeCordova 
    import co.ab180.airbridge.cordova.common.AirbridgeLifecycleIntegration
    ...
    AirbridgeCordova .setLifecycleIntegration = { activity ->
        return@setLifecycleIntegration activity
            .takeIf { it.javaClass.name == "com.braze.push.NotificationTrampolineActivity" }
            ?.run { intent?.extras?.getString("uri") }
    }
    1234567891011121314151617
    import co.ab180.airbridge.cordova.AirbridgeCordova ;
    import co.ab180.airbridge.cordova.common.AirbridgeLifecycleIntegration;
    ...
    AirbridgeCordova .setLifecycleIntegration(new AirbridgeLifecycleIntegration() {
        @Nullable
        @Override
        public String getDataString(@NonNull 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;
        }
    });

    Issue

    The "Manifest merger failed" error occurs 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 file 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" to the <manifest> tag

    • add tools:replace="android:fullBackupContent" to the <application> tag

    in the AndroidManifest.xml file.

    Fix conflict with dataExtractionRules="string resource"

    Adding android:dataExtractionRules="string resource" to the AndroidManifest.xml file 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 <manifest> tag

    • add tools:replace="android:dataExtractionRules" to the <application> tag

    in the AndroidManifest.xml file.

    Fix conflict with allowBackup="false"

    Adding android:allowBackup="false" to the AndroidManifest.xml file may cause an error like the following.

    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 <manifest> tag

    • add tools:replace="android:allowBackup" to the <application> tag

    in the AndroidManifest.xml file.

    If compileSdkVersion is lower 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 <manifest> tag

    • add tools:remove="android:dataExtractionRules" to the <application> tag

    in the AndroidManifest.xml file.

    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 android/app/src/main/res/xml folder.

    2. Within the new xml folder, create a file (e.g. custom_backup_rules.xml).

    3. Add the data backup rules defined in 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>

    data_extraction_rules.xml setup

    1. Within the created xml folder, create a file (e.g. custom_data_extraction_rules.xml).

    2. Add the data backup rules defined in 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>

    AndroidManifest.xml setup

    12345678910
    <manifest
        ...
        xmlns:tools="http://schemas.android.com/tools">
    
        <application
            ...
    		android:allowBackup="true"
    		android:fullBackupContent="@xml/custom_backup_rules"
            android:dataExtractionRules="@xml/custom_data_extraction_rules"
    		tools:replace="android:fullBackupContent,android:dataExtractionRules">

    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>