React Native SDK

    NPM Version

    SDK 安装


    注意

    React Native SDK 2.7.3 以下版本存在已知问题。建议使用 2.7.3 及以上版本。

    包安装

    npm

    请使用 npm 安装 airbridge-react-native-sdk

    1
    npm install --save airbridge-react-native-sdk

    请执行以下命令:

    12
    cd ios
    pod install

    Project 设置

    import

    请在 Project 的 index.js 中添加以下代码,以获取 SDK 对象:

    1
    import Airbridge from 'airbridge-react-native-sdk';

    Android

    MainApplication

    请在 android/app/src/main/java/.../MainApplication 文件的 onCreate 函数添加以下代码:

    12345678910
    import co.ab180.airbridge.reactnative.AirbridgeRN
    
    //...
    
    override fun onCreate() {
        super.onCreate()
        ...
        AirbridgeRN.init(this, "YOUR_APP_NAME", "YOUR_APP_TOKEN")
        ...
    }

    YOUR_APP_NAME 和 YOUR_APP_SDK_TOKEN 可在 Airbridge 面板的 [设置]>[Token] 获取。

    iOS

    AppDelegate.m

    请在 ios/[Project 名称]/AppDelegate.m 文件的 import 部分添加以下代码:

    1
    #import <AirbridgeRN/AirbridgeRN.h>

    请在 ios/[Project 名称]/AppDelegate.m 文件的 application:didFinishLaunchingWithOptions: 函数添加以下代码:

    1234
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [AirbridgeRN getInstance:@"YOUR_APP_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
        ...
    }

    YOUR_APP_NAME 和 YOUR_APP_SDK_TOKEN 可在 Airbridge 面板的 [设置]>[Token] 获取。

    通用设置

    airbridge.json

    1. 请在 Project 文件夹中创建 airbridge.json 文件。

    2. 请以 JSON 格式进行设置。如果使用 React Native 0.59.X 及以下版本,还需要进行以下设置:

      1. 请导航至 [Xcode]>[Project File]>[Build Phases]>[Copy Bundle Resources]。

      2. 请点击 + 按钮添加 airbridge.json 文件。

    示例
    12345678910111213
    {
        "sessionTimeoutSeconds": 300,
        "autoStartTrackingEnabled": true,
        "userInfoHashEnabled": true,
        "trackAirbridgeLinkOnly": false,
        "facebookDeferredAppLinkEnabled": false,
        "metaInstallReferrer": "YOUR_META_APP_ID",
        "sdkSignatureSecretID": "YOUR_SDK_SIGNATURE_SECRET_ID",
        "sdkSignatureSecret": "YOUR_SDK_SIGNATURE_SECRET",
        "locationCollectionEnabled": false,
        "trackingAuthorizeTimeoutSeconds": 30,
        "logLevel": "warning"
    }

    注意

    trackingAuthorizeTimeoutSeconds 的默认值为 30 秒。在实际应用时,请根据 App 的用户体验(UX)和 ATT 弹窗设置来调整该值。有关更多信息,请参阅本指南的 “Tracking Authorize Timeout 设置(仅限 iOS)” 部分。

    名称

    类型

    默认值

    说明

    sessionTimeoutSeconds

    Number

    300

    即使用户重新启用 App,如果是在设定的会话期间内,也会被视为同一会话,不会重新发送 App 启用事件。

    autoStartTrackingEnabled

    Boolean

    true

    如果设置为 false,则在调用 Airbridge.state.startTracking() 之前不会发送任何事件。

    userInfoHashEnabled

    Boolean

    true

    如果设置为 false,则在发送事件时不会对 User Email 和 User Phone 进行 SHA256 哈希处理。

    trackAirbridgeLinkOnly

    Boolean

    false

    如果设置为 true,则只有通过 Airbridge 深度链接打开 App 时才会发送深度链接事件。

    facebookDeferredAppLinkEnabled

    Boolean

    false

    当设置为 true、且已安装 Facebook SDK 时,将收取 Facebook Deferred AppLink。

    metaInstallReferrer

    String

    null

    (仅限 Android)设置 Meta Install Referrer 收集功能。
    可以使用 facebookInstallReferrer 代替 metaInstallReferrer 键。如果同时设置了两个键,将优先应用 metaInstallReferrer

    此功能从 airbridge-react-native-sdk 2.6.0 版本起可用。

    locationCollectionEnabled

    Boolean

    false

    (仅限 Android)如果设置为 true,可以收集设备的位置信息。

    使用此功能需要在 AndroidManifest.xml 添加 2 个权限: android.permission.ACCESS_FINE_LOCATION android.permission.ACCESS_COARSE_LOCATION

    trackingAuthorizeTimeoutSeconds

    Number

    30

    (仅限 iOS)如果设置 timeout,SDK 将在 timeout 时间内延迟发送安装事件,等待用户在 ATT 弹窗中允许追踪。

    sdkSignatureSecretID

    String

    null

    启用 SDK 伪造(SDK Spoofing)防止功能。必须同时应用已发放的 Secret 和 Secret ID。

    sdkSignatureSecret

    String

    null

    启用 SDK 伪造(SDK Spoofing)防止功能。必须同时应用已发放的 Secret 和 Secret ID。

    logLevel

    String

    warning

    设置 Airbridge log 输出级别。 logLevel: "debug" | "info" | "warning" | "error" | "fault"

    检查 SDK 安装

    请查看安装并启用 App 时,安装(Install)事件是否收集到。

    在 Airbridge 面板检查

    从 SDK 发生的事件可在 Airbridge 面板的 [原始数据]>[App 实时记录] 查看。实时记录最多可能会有 5 分钟的延迟。

    1. 请导航至 Airbridge 面板的 [原始数据]>[App 实时记录]。

    2. 请在搜索栏中输入已安装并启用 App 的设备的 GAID(Android)或 IDFA(iOS)。

    深度链接(Deep Link)设置

    Airbridge 面板设置

    请参阅以下指南在 Airbridge 面板进行深度链接设置:

    Project 设置

    Javascript

    setDeeplinkListener

    请注册深度链接或延迟深度链接(Deferred Deep Link)发生时调用的函数。

    123456
    Airbridge.deeplink.setDeeplinkListener((deeplink) => {
        // `딥링크` 또는 `지연된 딥링크` 가 발생했을 때, 작동할 코드
        // deeplink = YOUR_SCHEME://...
    
        console.log(deeplink);
    });

    打开 App 的所有深度链接将传递至 DeeplinkCallback。其中,Airbridge 深度链接将以在 Airbridge 面板中注册的 iOS URI Scheme 格式 YOUR_SCHEME://... 传递。

    Android

    AndroidManifest.xml

    请在 android/app/src/main/AndroidManifest.xml 文件的 MainActivity 区域添加 android:launchMode 和 intent-filter 语句,如下所示:

    12345678910111213141516171819202122232425262728293031
    <activity android:name=".MainActivity"
        android:launchMode="singleTask"
        ...>
        <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />
    
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
    
            <data android:scheme="http" android:host="YOUR_APP_NAME.deeplink.page" />
            <data android:scheme="https" android:host="YOUR_APP_NAME.deeplink.page" />
        </intent-filter>
        <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />
    
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
    
            <data android:scheme="http" android:host="YOUR_APP_NAME.airbridge.io" />
            <data android:scheme="https" android:host="YOUR_APP_NAME.airbridge.io" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
    
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
    
            <data android:scheme="YOUR_SCHEME" />
        </intent-filter>
        ...
    <activity/>

    请将 YOUR_APP_NAME 替换为 App 名称,并将 YOUR_SCHEME 替换为在 Airbridge 面板中注册的 URI Scheme。

    MainActivity

    请在 android/app/src/main/java/.../MainActivity 文件添加以下代码:

    12345678910
    override fun onResume() {
        super.onResume()
    
        AirbridgeRN.processDeeplinkData(intent)
    }
    
    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        setIntent(intent)
    }

    iOS

    Scheme

    1. 请导航至 [Xcode]>[Project File]>[Info]>[URL Types]。

    2. 请在 Identifier 和 URL Schemes 输入在 Airbridge 面板注册的 URI Scheme。

    注意

    输入 URI Scheme 时请省略 ://

    1. 请导航至 [Xcode]>[Project File]>[Signing & Capabilities]>[Associated Domains]。

    2. 请点击 + 按钮添加 applinks:YOUR_APP_NAME.airbridge.io

    3. 请点击 + 按钮添加 applinks:YOUR_APP_NAME.deeplink.page

    YOUR_APP_NAME 可在 Airbridge 面板的 [设置] >[Token] 获取。

    AppDelegate.m

    Scheme

    1. 请打开 ios/[Project 名称]/AppDelegate.m 文件。

    2. 请添加以下代码:

      12345678910
      - (BOOL)application:(UIApplication *)application
                  openURL:(NSURL *)url
                  options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options
      {
          NSLog(@"openURL : %@", url);
      
          [AirbridgeRN.deeplink handleURLSchemeDeeplink:url];
      
          return YES;
      }

    3. 如 target iOS 8.x 及以下版本,请额外添加以下代码:

      1234567891011
      - (BOOL)application:(UIApplication*)application
                  openURL:(NSURL*)url
        sourceApplication:(NSString*)sourceApplication 
               annotation:(id)annotation
      {
          NSLog(@"openURL : %@", url);
      
          [AirbridgeRN.deeplink handleURLSchemeDeeplink:url];
      
          return YES;
      }

    1. 请打开 ios/[Project 名称]/AppDelegate.m 文件。

    2. 请添加以下代码:

      12345678910
      -  (BOOL)application:(UIApplication*)application
      continueUserActivity:(NSUserActivity*)userActivity
        restorationHandler:(void (^)(NSArray* _Nullable))restorationHandler
      {
          NSLog(@"continueUserActivity : %@", userActivity.webpageURL);
      
          [AirbridgeRN.deeplink handleUserActivity:userActivity];
      
          return YES;
      }

    检查深度链接设置

    1. 请点击在 Airbridge 面板注册的 YOUR_SCHEME://... 格式的 iOS URI Scheme。

    2. 请检查是否打开了正确的 App 页面、并且在 Airbridge 面板的 [原始数据]>[App 实时记录] 存在深度链接事件。

    用户设置

    用户标识符设置

    您可在 SDK 中设置用户标识符信息,使以后收集的所有事件包含用户标识符信息。

    名称

    说明

    限制

    ID

    用户 ID

    -

    email

    用户邮箱

    将自动进行 SHA256 哈希处理(可选停用)

    phone

    用户电话号码

    将自动进行 SHA256 哈希处理(可选停用)

    attributes

    用户属性

    - 最多可设置 100 个。
    - key 是 NSString 类型,最多为 128 个字符。
    - key 必须符合正则表达式 ^ {
    "h-0": "*$
    - value 类型可以为 NSString 或 NSNumber,且如果是 NSString,则最多为 1024 个字符。

    alias

    可以代表用户的其他 ID

    - 最多可设置 10 个。
    - key 是 NSString 类型,最多为 128 个字符。
    - key 必须符合正则表达式 ^ {
    "h-0": "*$
    - value 是 NSString 类型,最多为 1024 个字符。

    示例代码

    12345678910111213
    Airbridge.state.setUser({
        ID: 'persondoe1',
        email: 'persondoe1@example.com',
    });
    
    Airbridge.state.setUser({
        email: 'persondoe2@example.com',
        phone: '+14151231234',
    });
    
    Airbridge.state.updateUser({
        ID: 'persondoe3',
    });

    上述代码的运行方式如下:

    User = { ID: 'persondoe1', email: '[persondoe1@example.com](mailto:persondoe1@example.com)' }
    => User = { email: '[persondoe1@example.com](mailto:persondoe1@example.com)', phone: '+14151231234' }
    => User = { ID: 'persondoe3', email: '[persondoe1@example.com](mailto:persondoe1@example.com)', phone: '+14151231234' }

    用户属性设置

    您可以为提高 MTA(Multi-touch Attribution, 多触点归因)分析的准确性、内部数据分析以及第三方解决方案集成等目的设置附加用户属性。

    123456
    Airbridge.state.updateUser({
        attributes: {
          age_group: "30",
          gender: "Female"
        }
    });

    检查用户设置

    请按照以下步骤确保您设置的的用户信息通过 SDK 正确发送。

    1. 配置用户信息。

    2. 使用 SDK 发送事件。

    3. 前往 Airbridge 面板 [原始数据]>[App 实时记录] 点击事件。

    4. 检查 user 块下的用户信息是否正确。

    设备设置

    设备标识符设置

    您可在 SDK 中设置设备标识符信息,使以后收集的所有事件包含设备标识符信息。设置后,无论 App 是否关闭,设备标识符信息将保留,除非手动删除。

    123
    Airbridge.setDeviceAlias("ADD_YOUR_KEY", "AND_YOUR_VALUE");
    Airbridge.removeDeviceAlias("DELETE_THIS_KEY");
    Airbridge.clearDeviceAlias();

    方法

    说明

    setDeviceAlias(key: string, value: string)

    将键值对添加到设备标识符中。

    removeDeviceAlias(key: string)

    删除相应于 key 的设备标识符。如果没有相应的设备标识符,则不执行任何操作。

    clearDeviceAlias()

    删除所有设备标识符。

    事件设置

    当发生重要的用户行为时,您可以将该应用内事件发送至 Airbridge 分析。

    虽然事件参数是可选的,但建议添加更多参数,以便提供更准确的统计数据。

    event options 可以使用 actionlabelvaluesemanticAttributescustomAttributes

    123456
    /**
     * Send event to server.
     * @param {string} category event name
     * @param {EventOption} [option={}] event options
     */
    trackEvent(category: string, option?: EventOption): void;

    用户事件发送

    您可使用 SDK 发送用户事件。用户事件支持 actionlabelvaluesemanticAttributescustomAttributes

    注册(Sign-up)

    发送注册事件时,请使用 setUser 输入用户标识符信息,然后发送 AirbridgeCategory.SIGN_UP 事件。

    123456
    Airbridge.state.setUser({
        ID: 'test',
        email: 'test@ab180.co',
        phone: '000-0000-0000',
    });
    Airbridge.trackEvent(AirbridgeCategory.SIGN_UP);

    登录(Sign-in)

    发送登录事件时,如果用户标识符信息尚未输入,请使用 setUser 输入用户标识符信息,然后发送 AirbridgeCategory.SIGN_IN

    123456
    Airbridge.state.setUser({
        ID: 'test',
        email: 'test@ab180.co',
        phone: '000-0000-0000',
    });
    Airbridge.trackEvent(AirbridgeCategory.SIGN_IN);

    退出登录(Sign-out)

    发送退出登录事件时,请发送 AirbridgeCategory.SIGN_OUT 事件,然后重置用户标识符信息。

    12
    Airbridge.trackEvent(AirbridgeCategory.SIGN_OUT);
    Airbridge.state.setUser({});

    电商事件发送

    您可使用 SDK 发送电商事件。电商事件支持 actionlabelvaluesemanticAttributescustomAttributes

    在电商事件中,您可使用 semanticAttributes 发送产品信息。除了预定义的 key 外,还可以使用自定义 key。

    查看首页(View Home Screen)

    1
    Airbridge.trackEvent(AirbridgeCategory.HOME_VIEW);

    查看搜索结果(View Search Result)

    1234567891011121314151617181920212223
    Airbridge.trackEvent(AirbridgeCategory.SEARCH_RESULT_VIEW, {
        semanticAttributes: {
            [AirbridgeAttributes.QUERY]: 'product'
            [AirbridgeAttributes.PRODUCTS]: [
                {
                    [AirbridgeProduct.PRODUCT_ID]: 'coke_zero',
                    [AirbridgeProduct.NAME]: 'Coke Zero',
                    [AirbridgeProduct.PRICE]: 1.99,
                    [AirbridgeProduct.CURRENCY]: 'USD',
                    [AirbridgeProduct.POSITION]: 1,
                    [AirbridgeProduct.QUANTITY]: 1,
                },
                {
                    [AirbridgeProduct.PRODUCT_ID]: 'burger_cheese_double',
                    [AirbridgeProduct.NAME]: 'Double Cheeseburger',
                    [AirbridgeProduct.PRICE]: 3.99,
                    [AirbridgeProduct.CURRENCY]: 'USD',
                    [AirbridgeProduct.POSITION]: 2,
                    [AirbridgeProduct.QUANTITY]: 1,
                },
            ]
        }
    });

    查看产品列表(View Product List)

    1234567891011121314151617181920212223
    Airbridge.trackEvent(AirbridgeCategory.PRODUCT_LIST_VIEW, {
        semanticAttributes: {
            [AirbridgeAttributes.PRODUCT_LIST_ID]: 'ID-1234567890'
            [AirbridgeAttributes.PRODUCTS]: [
                {
                    [AirbridgeProduct.PRODUCT_ID]: 'coke_zero',
                    [AirbridgeProduct.NAME]: 'Coke Zero',
                    [AirbridgeProduct.PRICE]: 1.99,
                    [AirbridgeProduct.CURRENCY]: 'USD',
                    [AirbridgeProduct.POSITION]: 1,
                    [AirbridgeProduct.QUANTITY]: 1,
                },
                {
                    [AirbridgeProduct.PRODUCT_ID]: 'burger_cheese_double',
                    [AirbridgeProduct.NAME]: 'Double Cheeseburger',
                    [AirbridgeProduct.PRICE]: 3.99,
                    [AirbridgeProduct.CURRENCY]: 'USD',
                    [AirbridgeProduct.POSITION]: 2,
                    [AirbridgeProduct.QUANTITY]: 1,
                },
            ]
        }
    });

    查看产品详情(View Product Detail)

    1234567891011121314
    Airbridge.trackEvent(AirbridgeCategory.PRODUCT_DETAILS_VIEW, {
        semanticAttributes: {
            [AirbridgeAttributes.PRODUCTS]: [
                {
                    [AirbridgeProduct.PRODUCT_ID]: 'coke_zero',
                    [AirbridgeProduct.NAME]: 'Coke Zero',
                    [AirbridgeProduct.PRICE]: 1.99,
                    [AirbridgeProduct.CURRENCY]: 'USD',
                    [AirbridgeProduct.POSITION]: 1,
                    [AirbridgeProduct.QUANTITY]: 1,
                },
            ]
        }
    });

    加入购物车(Add to Cart)

    12345678910111213141516171819202122232425
    Airbridge.trackEvent(AirbridgeCategory.ADD_TO_CART, {
        value: 5.98,
        semanticAttributes: {
            [AirbridgeAttributes.CART_ID]: 'ID-1234567890',
            [AirbridgeAttributes.CURRENCY]: 'USD',
            [AirbridgeAttributes.PRODUCTS]: [
                {
                    [AirbridgeProduct.PRODUCT_ID]: 'coke_zero',
                    [AirbridgeProduct.NAME]: 'Coke Zero',
                    [AirbridgeProduct.PRICE]: 1.99,
                    [AirbridgeProduct.CURRENCY]: 'USD',
                    [AirbridgeProduct.POSITION]: 1,
                    [AirbridgeProduct.QUANTITY]: 1,
                },
                {
                    [AirbridgeProduct.PRODUCT_ID]: 'burger_cheese_double',
                    [AirbridgeProduct.NAME]: 'Double Cheeseburger',
                    [AirbridgeProduct.PRICE]: 3.99,
                    [AirbridgeProduct.CURRENCY]: 'USD',
                    [AirbridgeProduct.POSITION]: 2,
                    [AirbridgeProduct.QUANTITY]: 1,
                },
            ]
        }
    });

    完成订单(Order Complete)

    1234567891011121314151617181920212223242526
    Airbridge.trackEvent(AirbridgeCategory.ORDER_COMPLETED, {
        value: 5.98,
        semanticAttributes: {
            [AirbridgeAttributes.TRANSACTION_ID]: 'transactionID-purchase',
            [AirbridgeAttributes.CURRENCY]: 'USD',
            [AirbridgeAttributes.IN_APP_PURCHASED]: true,
            [AirbridgeAttributes.PRODUCTS]: [
                {
                    [AirbridgeProduct.PRODUCT_ID]: 'coke_zero',
                    [AirbridgeProduct.NAME]: 'Coke Zero',
                    [AirbridgeProduct.PRICE]: 1.99,
                    [AirbridgeProduct.CURRENCY]: 'USD',
                    [AirbridgeProduct.POSITION]: 1,
                    [AirbridgeProduct.QUANTITY]: 1,
                },
                {
                    [AirbridgeProduct.PRODUCT_ID]: 'burger_cheese_double',
                    [AirbridgeProduct.NAME]: 'Double Cheeseburger',
                    [AirbridgeProduct.PRICE]: 3.99,
                    [AirbridgeProduct.CURRENCY]: 'USD',
                    [AirbridgeProduct.POSITION]: 2,
                    [AirbridgeProduct.QUANTITY]: 1,
                },
            ]
        }
    });

    检查事件设置

    1. 请通过 SDK 发送事件。

    2. 请在 Airbridge 面板的 [原始数据]>[App 实时记录] 查看是否存在在步骤 1. 发送的事件。

    高级设置

    Meta Install Referrer(MIR)收集设置

    MIR 收集设置在 airbridge-react-native-sdk 2.6.0 及以上版本可用。请在 airbridge.json 添加以下代码设置 MIR 收集。

    完成设置后,需要在 Airbridge 面板输入 Install Referrer Decryption Key,以查看解密后的 MIR。有关输入 Install Referrer Decryption Key 的方法,请参阅 本指南

    123
    {
        "metaInstallReferrer": "YOUR_META_APP_ID"
    }

    Restricted SDK

    如果由于隐私法等原因无法收集广告 ID(Advertising ID),您可以使用移除了广告 ID 收集功能的 Restricted SDK。airbridge-react-native-sdk-restricted 从 2.5.3 版本开始支持。

    包安装

    npm

    请使用 npm 安装 airbridge-react-native-sdk-restricted

    1
    npm install --save airbridge-react-native-sdk-restricted

    请执行以下命令:

    12
    cd ios
    pod install

    Project 设置

    import

    请在 Project 的 index.js 中添加以下代码,以获取 SDK 对象:

    1
    import Airbridge from 'airbridge-react-native-sdk-restricted';

    SDK 签名(SDK Signature)设置

    您可通过 SDK 签名防止 SDK 伪造(SDK Spoofing)。SDK 签名从 airbridge_react_native_sdk 2.3.0 版本开始可用。

    请以 JSON 格式将以下设置输入 Project 文件夹的 airbridge.json 文件:

    1234
    {
        "sdkSignatureSecretID": "YOUR_SDK_SIGNATURE_SECRET_ID",
        "sdkSignatureSecret": "YOUR_SDK_SIGNATURE_SECRET"
    }

    为了设置 SDK 签名,需要 SDK 签名凭证。请参阅 本指南 获取 SDK 签名凭证。

    会话过期设置

    您可以设置 airbridge.json 文件的 sessionTimeoutSeconds 字段,以在设定的会话期间内,即使用户重新启用 App,也可判断为同一个会话,而不重新发送 App 启用事件。

    • 会话过期时间的单位为毫秒(Millisecond),取值范围为从 0 到 604800000(7 天)。

    • 会话过期时间的默认值为 1000 * 60 * 5(5 分钟)。

    停止用户标识符信息 SHA256 哈希处理设置

    如果出于内部数据分析等目的需要发送未经哈希处理的用户标识符信息,可以设置 airbridge.json 文件的 userInfoHashEnabled 字段,以停止对 User Email 和 User Phone 信息的哈希处理。

    注意

    由于此选项将敏感个人信息提供给第三方,因此必须事先采取额外的内部安全措施。

    您可以通过设置 airbridge.json 文件的 facebookDeferredAppLinkEnabled 字段,以使用 Airbridge SDK 收取 Facebook 的 Deferred App Link。

    facebookDeferredAppLinkEnabled 设置为 YES、且已安装 Facebook SDK 时,SDK 将收取 Facebook Deferred App Link。

    该功能需要先行设置 Facebook SDK,请参阅 Facebook 文档 设置 Facebook SDK。

    如果由于 App 内的多个深度链接操作,导致难以通过 Airbridge 一目了然地查看再互动(Re-engagement)绩效,您可以通过设置 airbridge.json 文件的 trackAirbridgeLinkOnly 字段,过滤并仅查看由 Airbridge 深度链接产生的绩效。

    开启此功能后,仅当通过符合以下条件的深度链接打开 App 时,才会监测深度链接绩效。

    • 通过 Airbridge 面板中注册的深度链接打开 App 时

    • 通过 airbridge.io 深度链接打开 App 时

    • 通过 deeplink.page 深度链接打开 App 时

    • airbridge_referrer query 信息存在时

    隐私保护设置

    此功能在根据隐私法(例:GDPRCCPA)收集和传输数据时需要征得用户同意的情况下非常有用。

    您可通过设置 airbridge.json 文件的 autoStartTrackingEnabled 字段,明确地开始收集和传输数据。

    如果关闭此功能,则需要明确调用以下函数才能正确进行数据收集:

    • Airbridge.state.startTracking();

    Tracking Authorize Timeout 设置(仅限 iOS)

    如果使用 AppTrackingTransparency.framework 显示询问用户是否允许追踪的弹窗,即使用户选择允许,由于安装事件会在选择之前发送,因此无法在安装事件中收集 IDFA。

    您可以通过在之前添加的 airbridge.json 文件中为 trackingAuthorizeTimeoutSeconds 设置 timeout,让 SDK 在发送安装事件之前等待用户在 timeout 内完成选择。

    位置信息收集 (仅限 Android)

    您可以通过在 airbridge.json 文件中设置 locationCollectionEnabled 字段,收集用户的位置信息。

    此功能仅在 Android 上可用,且 AndroidManifest.xml 中必须包含以下权限设置:

    12
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    注意

    位置信息必须以合法目的和方式收集,使用此功能请谨慎。

    在 App 中使用追踪链接

    为了打开 Airbridge 追踪链接,通常需要通过浏览器。但 Airbridge SDK 提供一项功能, 使追踪链接可以无需经过浏览器直接打开。

    12
    Airbridge.placement.click('https://abr.ge/~~~', 'ablog://main', 'https://airbridge.io');
    Airbridge.placement.impression('https://abr.ge/~~~');

    click

    追踪链接被点击时调用,然后将点击计入点击统计,并将用户跳转到预先设置的 App、Web、或后备目的地。

    impression

    追踪链接被展示在用户界面(UI)时调用,然后将展示计入展示统计。

    注意

    使用品牌域名时,无法使用包含自定义链接短 ID 的追踪链接。

    deviceUUID 获取

    1
    await Airbridge.state.deviceUUID()

    卸载追踪设置

    有关卸载追踪设置,请参阅 本指南

    卸载追踪在 Airbridge React Native SDK 2.1.0 及以上版本可用。

    • Airbridge Android SDK 2.6.0 及以上版本

    • Airbridge iOS SDK 1.28.2 及以上版本

    推送 Token 发送

    请将已获取的推送 Token 通过 registerPushToken 方法发送至 Airbridge。

    1
    Airbridge.registerPushToken(token);

    忽略用于卸载追踪的静默推送通知

    如果传递的远程数据中 airbridge-uninstall-tracking 的值为 true,请使 App 忽略该静默推送通知。

    Hybrid App 设置

    仅通过安装 Web SDK 无法追踪 App 安装、App 启用、深度链接调用等其他事件。您可通过以下设置在 Hybrid App 调用应用内事件:

    123456
    let webInterface = Airbridge.createWebInterface(
            'YOUR_WEB_TOKEN',
            (command) => { 
                return `...`;
            }
        )

    您可通过 Airbridge.createWebInterface 控制 Web Interface。请参阅 React Native Hybrid App 集成指南

    故障排除

    Braze 推送通知

    通过 Braze SDK 发送的推送通知打开深度链接时,可能发生无法收集 “Deeplink open(深度链接打开)”,然而收集 “Open(打开)” 的问题。原因如下:

    Airbridge SDK 通过 ActivityactionintentdataString 值判断深度链接打开和打开。然而,通过 Braze SDK 发送的推送通知打开深度链接时,App 会通过 Braze SDK 中定义的 NotificationTrampolineActivity 打开,但 Airbridge SDK 在该 Activityactionintent 无法获取 dataString 值,导致无法判断事件。

    该问题可以通过 Airbridge React Native SDK 版本 2.7.1 中新增的以下 interface 解决:

    MainApplication

    请在 android/app/src/main/java/.../MainApplication 文件的 onCreate 函数中添加以下代码:

    12345678910111213141516171819
    import co.ab180.airbridge.reactnative.AirbridgeRN
    import co.ab180.airbridge.reactnative.AirbridgeLifecycleIntegration
    
    //...
    
    @Override
    public void onCreate() {
        super.onCreate()
        ...
        AirbridgeRN.init(this, "YOUR_APP_NAME", "YOUR_APP_TOKEN")
        AirbridgeRN.setLifecycleIntegration {
            if (it.javaClass.name.equals("com.braze.push.NotificationTrampolineActivity")) {
                it.intent?.extras?.getString("uri")
            } else {
                null
            }
        }
        ...
    }

    Bitcode 编译错误

    在使用 React Native SDK 1.5.0 及以上版本进行 iOS 构建时,由于不支持 Bitcode,可能会出现如下错误:

    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)

    从 React Native SDK 1.5.0 版本起,Airbridge iOS SDK 升级至 1.28.0 版本,且 Airbridge iOS SDK 从 1.28.0 版本起停止支持 Bitcode。如遇到上述错误,请参阅 Bitcode 编译错误指南

    迁移指南


    更新 SDK 时,请考虑以下内容:

    2.8.0

    对于 2023-09-04 或以后创建的 Airbridge App,2.7.3~2.5.1 版本中存在的深度链接回调提供的深度链接 URL 被解码 2 次的问题得到解决。

    2.5.1

    对于 2023-09-04 或以后创建的 Airbridge App,深度链接回调提供的深度链接 URL 中不再添加 airbridge_referrer

    更新 iOS App 时,SKAN 转化值将以最后计算的值为准,不会进行额外计算。

    • 2.5.1 以下版本计算 SKAN 转化值的时间最多为 24 小时。

    • 对于新安装,这不会成为问题。

    deeplink.page 已被弃用。从 2.5.1 版本开始,请使用 abr.ge 作为深度链接域名进行代码编写。

    • 为了保持向后兼容性,deeplink.page 仍然受支持并可正常运行。

    2.5.0

    trackingAuthorizeTimeout 的默认值更改为 30 秒。

    1.X.X → 2.X.X 更新

    原有的 1.X.X 版本中的事件发送 API 已被删除,并被以下 API 所取代:

    123456
    /**
     * Send event to server.
     * @param {string} category event name
     * @param {EventOption} [option={}] event options
     */
    trackEvent(category: string, option?: EventOption): void;

    有关更多信息,请参阅 React Native 2.X.X 迁移指南

    1.1.X → 1.2.X 更新

    npm

    请替换 package.json 中的 Airbridge React Native SDK 版本。

    123
    ...
        "airbridge-react-native-sdk": "1.2.1",
    ...

    请执行以下命令:

    123
    npm install
    cd ios
    pod install

    Android

    请在 android/app/src/main/java/.../MainActivity 文件中修改以下代码:

    12
    -     AirbridgeRN.getDeeplink().fetch(getIntent())
    +     AirbridgeRN.processDeeplinkData(getIntent())

    iOS

    请在 ios/[Project 名称]/AppDelegate 文件中修改以下代码:

    12
    -     AirbridgeRN.deeplink().handleURLSchemeDeeplink(url, withSourceBundle: sourceApplication)
    +     AirbridgeRN.deeplink().handleURLSchemeDeeplink(url)

    设置
    1. 请在 Project 文件夹中创建 airbridge.json 文件。

    2. 请以 JSON 格式添加配置值。

    示例

    12345678
    {
        "sessionTimeoutSeconds": 300,
        "autoStartTrackingEnabled": true,
        "userInfoHashEnabled": true,
        "trackAirbridgeLinkOnly": false,
        "facebookDeferredAppLinkEnabled": false,
        "locationCollectionEnabled": false
    }

    名称

    类型

    默认值

    说明

    sessionTimeoutSeconds

    Number

    300

    即使用户重新启用 App,如果是在设定的会话期间内,也会被视为同一会话,不会重新发送 App 启用事件。

    autoStartTrackingEnabled

    Boolean

    true

    如果设置为 false,则在调用 Airbridge.state.startTracking() 之前不会发送任何事件。

    userInfoHashEnabled

    Boolean

    true

    如果设置为 false,则在发送事件时不会对 User Email 和 User Phone 进行 SHA256 哈希处理。

    trackAirbridgeLinkOnly

    Boolean

    false

    如果设置为 true,则只有通过 Airbridge 深度链接打开 App 时才会发送深度链接事件。

    facebookDeferredAppLinkEnabled

    Boolean

    false

    当设置为 true、且已安装 Facebook SDK 时,SDK 将收取 Facebook Deferred AppLink。

    locationCollectionEnabled

    Boolean

    false

    (仅限 Android)如果设置为 true,可以收集设备的位置信息。

    使用此功能需要在 AndroidManifest.xml 添加 2 个权限: android.permission.ACCESS_FINE_LOCATION android.permission.ACCESS_COARSE_LOCATION

    1.0.X → 1.1.X 更新

    Install

    uninstall 旧版本的 SDK。

    1
    npm uninstall react-native-airbridge-bridge

    install 新版本的 SDK。

    1
    npm install --save airbridge-react-native-sdk

    请执行以下命令:

    12
    cd ios
    pod install

    Javascript

    DeeplinkListener

    请删除 getInitialDeeplink 函数,仅使用 setDeeplinkListener 函数。

    1234567
    - Airbridge.deeplink.getInitialDeeplink().then((deeplink) => {
    -
    - });
    . 
    . Airbridge.deeplink.setDeeplinkListner((deeplink) => {
    . 
    . });

    Android

    AndroidManifest.xml

    请在 android/app/src/main/AndroidManifest.xml 文件的 MainActivity 区域中插入以下 intent-filter 语句:

    1234567891011121314151617181920212223242526
    + <intent-filter android:autoVerify="true">
    +     <action android:name="android.intent.action.VIEW" />
    +
    +     <category android:name="android.intent.category.DEFAULT" />
    +     <category android:name="android.intent.category.BROWSABLE" />
    +
    +     <data android:scheme="http" android:host="YOUR_APP_NAME.deeplink.page" />
    +     <data android:scheme="https" android:host="YOUR_APP_NAME.deeplink.page" />
    + </intent-filter>
    . <intent-filter android:autoVerify="true">
    .     <action android:name="android.intent.action.VIEW" />
    . 
    .     <category android:name="android.intent.category.DEFAULT" />
    .     <category android:name="android.intent.category.BROWSABLE" />
    . 
    .     <data android:scheme="http" android:host="YOUR_APP_NAME.airbridge.io" />
    .     <data android:scheme="https" android:host="YOUR_APP_NAME.airbridge.io" />
    . </intent-filter>
    . <intent-filter>
    .     <action android:name="android.intent.action.VIEW" />
    . 
    .     <category android:name="android.intent.category.DEFAULT" />
    .     <category android:name="android.intent.category.BROWSABLE" />
    . 
    .     <data android:scheme="EXAMPLE_SCHEME" />
    . </intent-filter>

    MainActivity.java

    请修改 android/app/src/main/java/.../MainActivity.java

    12345678910111213141516
    . import co.ab180.airbridge.reactnative.AirbridgeRN;
    . 
    . public class MainActivity extends ReactActivity {
    +     @Override
    +     protected void onResume() {
    +         super.onResume();
    + 
    +         AirbridgeRN.getDeeplink().fetch(getIntent());
    +     }
    +  
    .     @Override
    .     public void onNewIntent(Intent intent) {
    .         super.onNewIntent(intent);
    .         setIntent(intent);
    .     }
    . }

    iOS

    Xcode

    Universal Link

    1. 请导航至 [Xcode]>[Project File]>[Signing & Capabilities]>[Associated Domains]。

    2. 请点击 + 按钮并添加 applinks:YOUR_APP_NAME.deeplink.page

    YOUR_APP_NAME 可在 Airbridge 面板的 [设置] >[Token] 获取。

    AppDelegate.m

    请修改 ios/.../AppDelegate.m

    123456789101112131415161718192021222324
    . - (BOOL)application:(UIApplication *)application
    .             openURL:(NSURL *)url
    .             options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options
    . {
    -     [AirbridgeRN.instance handleURLSchemeDeeplink:url
    -                                withSourceBundle:options[UIApplicationOpenURLOptionsSourceApplicationKey]];
    +     [AirbridgeRN.deeplink handleURLSchemeDeeplink:url
    +                                withSourceBundle:options[UIApplicationOpenURLOptionsSourceApplicationKey]];
    . 
    .     return YES;
    . }
    . 
    . - (BOOL)application:(UIApplication*)application
    .             openURL:(NSURL*)url
    .   sourceApplication:(NSString*)sourceApplication 
    .          annotation:(id)annotation
    . {
    -     [AirbridgeRN.instance handleURLSchemeDeeplink:url
    -                                withSourceBundle:sourceApplication];
    +     [AirbridgeRN.deeplink handleURLSchemeDeeplink:url
    +                                withSourceBundle:sourceApplication];
    . 
    .     return YES;
    . }

    如 target iOS 8.x 或以下版本,请额外修改以下代码:

    123456789
    . -  (BOOL)application:(UIApplication*)application
    . continueUserActivity:(NSUserActivity*)userActivity
    .   restorationHandler:(void (^)(NSArray* _Nullable))restorationHandler
    . {
    -     [AirbridgeRN.instance handleUniversalDeeplink:userActivity.webpageURL];
    +     [AirbridgeRN.deeplink handleUniversalLink:userActivity.webpageURL];
    . 
    .     return YES;
    . }

    0.2.X → 1.0.X 更新

    terminal

    unlink 旧版本的 SDK。

    1
    react-native unlink react-native-airbridge-bridge

    如果 react-native unlink react-native-airbridge-bridge 出错:

    1. 请修改 android/app/src/main/java/.../MainApplication.java

    1
    - import com.reactlibrary.AirbridgeBridgePackage;
    12345678
    . @Override
    . protected List<ReactPackage> getPackages() {
    .     return Arrays.<ReactPackage>asList(
    +         new MainReactPackage()
    -         new MainReactPackage(),
    -         new AirbridgeBridgePackage()
    .     );
    . }

    2. 请修改 ios/xxx.xcodeproj。

    3. 请删除 Libraries 中的 AirbridgeBridge.xcodeproj。

    uninstall 旧版本的 SDK。

    1
    npm uninstall react-native-airbridge-bridge

    install 新版本的 SDK。

    1
    npm install --save airbridge-react-native-sdk

    link 新版本的 SDK。

    1
    react-native link airbridge-react-native-sdk

    index.js

    请将 index.js 中的 require 改为 import

    12
    - const Airbridge = require('react-native-airbridge-bridge');
    + import Airbridge from 'airbridge-react-native-sdk';

    Build.gradle

    请修改 android/app/build.gradle。

    123456
    . dependencies {
    .     ...
    -     implementation 'io.airbridge:sdk-android:1.5.+'
    -     implementation 'com.android.installreferrer:installreferrer:1.0'
    .     ...
    . }

    AndroidManifest.xml

    请修改 android/app/src/main/AndroidManifest.xml

    permission

    12
    -     <uses-permission android:name="android.permission.INTERNET" />
    -     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    MainActivity

    123
    .     <activity android:name=".MainActivity"
              ...
    +         android:launchMode="singleTask">

    MainApplication.java

    请修改 android/app/src/main/java/.../MainApplication.java

    1
    - import io.airbridge.*;
    1234567
    . @Override
    . public void onCreate() {
    .     super.onCreate();
    -     AirBridge.init(this, "[앱 이름]", "[앱 토큰]");
    +     AirbridgeRN.init(this, "[앱 이름]", "[앱 토큰]");
    .     ...
    . }

    MainActivity.java

    请修改 android/app/src/main/java/.../MainActivity.java

    123456789
    + import co.ab180.airbridge.reactnative.AirbridgeRN;
    
    + public class MainActivity extends ReactActivity {
    +   @Override
    +   public void onNewIntent(Intent intent) {
    +       super.onNewIntent(intent);
    +       setIntent(intent);
    +   }
    + }

    Podfile

    请修改 ios/Podfile

    123
    target '[Project Name]' do
    -   pod 'AirBridge', '1.6.2'
    end

    请在 terminal 执行以下命令:

    1
    pod install

    AppDelegate.m

    请修改 ios/.../AppDelegate.m

    12
    - #import <AirBridge/AirBridge.h>
    + #import <AirbridgeRN/AirbridgeRN.h>
    1234567
    .           - (BOOL)application:(UIApplication *)application 
    . didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    . {
    -     [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN(앱 토큰)" appName:@"YOUR_APP_NAME(앱 이름)" withLaunchOptions:launchOptions];
    +     [AirbridgeRN getInstance:@"YOUR_APP_SDK_TOKEN(앱 토큰)" appName:@"YOUR_APP_NAME(앱 이름)" withLaunchOptions:launchOptions];
    .     ...
    . }
    123456789
    . - (BOOL)application:(UIApplication *)application
    .             openURL:(NSURL *)url
    .             options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
    . {
    -     [[AirBridge instance] handleURL:url];
    +     [AirbridgeRN.instance handleURLSchemeDeeplink:url withSourceBundle:options[UIApplicationOpenURLOptionsSourceApplicationKey]];.
    .
    .     return YES;
    . }
    12345678910
    . - (BOOL)application:(UIApplication *)application 
    .             openURL:(NSURL *)url
    .   sourceApplication:(NSString *)sourceApplication 
    .          annotation:(id)annotation
    . {
    -     [[AirBridge instance] handleURL:url];
    +     [AirbridgeRN.instance handleURLSchemeDeeplink:url withSourceBundle:options[UIApplicationOpenURLOptionsSourceApplicationKey]];
    . 
    .     return YES;
    . }

    如 target iOS 8.x 或以下版本,请额外修改以下代码:

    123456789
    .   - (BOOL)application:(UIApplication *)application 
    .  continueUserActivity:(NSUserActivity *)userActivity
    .    restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
    . {
    -     [[AirBridge instance] handleURL:url];
    +     [AirbridgeRN.instance handleUniversalDeeplink:userActivity.webpageURL];
    . 
    .     return YES;
    . }

    Was this helpful?

    Any questions or suggestions?