> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 华为 SDK 设置

> OneSignal 华为 SDK Android Studio 设置指南。

## 概述

本指南说明如何将 OneSignal 推送通知集成到在华为应用市场分发的华为应用中。

这些说明适用于使用 Java 或 Kotlin 编写的原生应用。有关其他支持的 SDK，请参见：

<Columns cols={2}>
  <Card title="Ionic/Cordova/Capacitor" href="./huawei-cordova-sdk-setup" arrow={true} />

  <Card title="Flutter" href="./huawei-flutter-sdk-setup" arrow={true} />

  <Card title="React Native" href="./huawei-react-native-sdk-setup" arrow={true} />

  <Card title="Unity" href="./huawei-unity-sdk-setup" arrow={true} />
</Columns>

***

## 要求

* [Android Studio](https://developer.android.com/studio)
* 安装了"华为应用市场"的华为设备
* 已配置的 OneSignal 应用和平台

***

### 配置您的 OneSignal 应用和平台

使用您支持的平台配置您的 OneSignal 应用——Apple (APNs)、Google (FCM)、华为 (HMS) 和/或 Amazon (ADM)。

<Note>
  如果您的组织已有 OneSignal 账户，请[申请加入](/docs/cn/manage-team-members)组织。否则，请[注册免费账户](https://onesignal.com)以开始使用。
</Note>

<Accordion title="分步设置说明" icon="circle-chevron-down">
  <Steps>
    <Step title="创建或选择您的应用">
      点击 **新应用/网站** 创建新应用，或在 **设置 > 推送和应用内** 中向现有应用添加平台。选择您要配置的平台，然后点击 **下一步：配置您的平台**。

      <Frame caption="设置您的第一个 OneSignal 应用、组织和频道。">
        <img src="https://mintcdn.com/onesignal/BK2J-grzBpDdh8NC/images/dashboard/new-app-org-channel.png?fit=max&auto=format&n=BK2J-grzBpDdh8NC&q=85&s=ee0045484152ed15095f619344aa0564" alt="OneSignal 控制台显示包含组织名称、应用名称和频道选择的新应用设置流程" width="2592" height="1904" data-path="images/dashboard/new-app-org-channel.png" />
      </Frame>
    </Step>

    <Step title="配置平台凭据">
      为您的平台输入凭据：

      * **Android**：[设置 Firebase 凭据](/docs/cn/android-firebase-credentials)
      * **iOS**：[p8 令牌（推荐）](/docs/cn/ios-p8-token-based-connection-to-apns) 或 [p12 证书](/docs/cn/ios-p12-generate-certificates)
      * **Amazon**：[生成 API 密钥](/docs/cn/generate-an-amazon-api-key)
      * **华为**：[授权 OneSignal](/docs/cn/authorize-onesignal-to-send-huawei-push)

      输入您的凭据后点击 **保存并继续**。
    </Step>

    <Step title="保存您的应用 ID 并安装 SDK">
      您的 **应用 ID** 显示在最终屏幕上。复制并保存它——初始化 SDK 时需要使用它。选择您的 SDK 平台，然后按照设置指南操作。

      <Frame caption="保存您的应用 ID 并邀请其他团队成员。">
        <img src="https://mintcdn.com/onesignal/VypVshrFHTBZfEma/images/dashboard/app-id-and-team-invite.png?fit=max&auto=format&n=VypVshrFHTBZfEma&q=85&s=e1e2aab6cca7c4aa6b9a76eff362d5af" alt="OneSignal 控制台显示设置完成后的应用 ID 和团队邀请选项" width="2592" height="1904" data-path="images/dashboard/app-id-and-team-invite.png" />
      </Frame>
    </Step>
  </Steps>
</Accordion>

***

## 设置

### 1. 设置 OneSignal SDK

<Card title="OneSignal Android SDK 设置" href="./android-sdk-setup" arrow={true}>
  按照 OneSignal Android SDK 设置指南将我们的 SDK 实现到您的应用中。
  请注意，发布到华为应用市场的应用构建不需要 Firebase/Google 设置。
</Card>

### 2. 华为配置 (agconnect-services.json)

<Info>
  如果您的 Android Studio 项目中已经有来自设置其他华为服务的华为 `agconnect-services.json`，则可以跳过此步骤。
</Info>

在 [AppGallery Connect 项目列表](https://developer.huawei.com/consumer/en/service/josp/agc/index.html#/myProject) 中选择您的应用。

点击"agconnect-services.json"按钮下载此文件。

<Frame>
  <img src="https://mintcdn.com/onesignal/56ctKxZSV4m5VEkn/images/docs/b4f866d-Huawei_AppGallery_Connect_ProjectSettings_Download_agconnect-services.json_file.png?fit=max&auto=format&n=56ctKxZSV4m5VEkn&q=85&s=0d2a452e3c007ce4a63fa3ed50204a32" width="1262" height="696" data-path="images/docs/b4f866d-Huawei_AppGallery_Connect_ProjectSettings_Download_agconnect-services.json_file.png" />
</Frame>

将此文件放置在 Android Studio 的应用目录中。

<Frame>
  <img src="https://mintcdn.com/onesignal/jFWn5xzleD8du3j6/images/docs/5a9ee3b-Huawei_AndroidStudio_agconnect-services.json_file.png?fit=max&auto=format&n=jFWn5xzleD8du3j6&q=85&s=6c9e6eb15b63c4089b959e3652b9b695" width="362" height="326" data-path="images/docs/5a9ee3b-Huawei_AndroidStudio_agconnect-services.json_file.png" />
</Frame>

### 3. 生成签名证书指纹

<Info>
  如果您已经为其他华为服务将 SHA-256 证书指纹添加到华为的控制台，则可以跳过此步骤。
</Info>

在您的 Android Studio 中，转到 **View > Tool Windows > Gradle**。

<Frame>
  <img src="https://mintcdn.com/onesignal/6v_cVPknFpo5qSVB/images/docs/092273b-Huawei_AndroidStudio_Open_Gradle_Tasks_List.png?fit=max&auto=format&n=6v_cVPknFpo5qSVB&q=85&s=6a59f3f7060ee0d384c281e234c92f17" width="595" height="358" data-path="images/docs/092273b-Huawei_AndroidStudio_Open_Gradle_Tasks_List.png" />
</Frame>

在这里选择 **app > Tasks > android > signingReport**。

<Frame>
  <img src="https://mintcdn.com/onesignal/Z6xkXGfmy814If53/images/docs/db2ecdd-Huawei_AndroidStudio_Run_signingReport.png?fit=max&auto=format&n=Z6xkXGfmy814If53&q=85&s=d239877b38edbdf268dce6c999726fb0" width="294" height="216" data-path="images/docs/db2ecdd-Huawei_AndroidStudio_Run_signingReport.png" />
</Frame>

复制您的 `release` 变体的 `SHA-256`。

* 可选但建议为您的 `debug` 变体的 `SHA-256` 也复制，以便更快地进行测试。
* 您的项目中可能还有其他自定义变体，如果您需要对它们的推送支持，也请复制这些。

<Frame>
  <img src="https://mintcdn.com/onesignal/KSCNwSpBCNSQ8xdF/images/docs/f6b08a6-Huawei_AndroidStudio_signingReport_output.png?fit=max&auto=format&n=KSCNwSpBCNSQ8xdF&q=85&s=05d59af3ed44175b67778fa8d0c4cf8f" width="798" height="346" data-path="images/docs/f6b08a6-Huawei_AndroidStudio_signingReport_output.png" />
</Frame>

在 [AppGallery Connect 项目列表](https://developer.huawei.com/consumer/en/service/josp/agc/index.html#/myProject) 中选择您的应用。

滚动到底部找到"SHA-256 证书指纹"字段，您应该在其中输入您的密钥。

<Frame>
  <img src="https://mintcdn.com/onesignal/6tscVAtiSqz353kV/images/docs/9bf59ea-Huawei_AppGallery_Connect_SHA256_cert_fingerprint.png?fit=max&auto=format&n=6tscVAtiSqz353kV&q=85&s=e3b1c87ac0ec02d95e60fa115f8f51a2" width="1292" height="622" data-path="images/docs/9bf59ea-Huawei_AppGallery_Connect_SHA256_cert_fingerprint.png" />
</Frame>

### 4. 添加华为 gradle 插件和依赖项

在 Android Studio 中打开您的根 `build.gradle`（项目：），并在 `buildscript { repositories }` 和 `allprojects { repositories }` 下添加 ` maven {url 'https://developer.huawei.com/repo/'}`

在 `buildscript { dependencies }` 下添加 `classpath 'com.huawei.agconnect:agcp:1.6.5.300'`

您的根 `build.gradle` 中总共应该有 3 行新内容，如下所示。

<Frame>
  <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/d1791d3-Huawei_AndroidStudio_root_build.gradle_file_2.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=b5e3b1016d53fb02c4c7eee1fee75c43" width="941" height="664" data-path="images/docs/d1791d3-Huawei_AndroidStudio_root_build.gradle_file_2.png" />
</Frame>

打开您的 `app/build.gradle` 文件，并在 `dependencies` 部分下添加 `implementation 'com.huawei.hms:push:6.3.0.304'`。

同样在 `app/build.gradle` 文件中，在文件的最底部添加 `apply plugin: 'com.huawei.agconnect'`。

您的 `app/build.gradle` 中总共应该有 2 行新内容，如下所示。

<Tip>
  确保在保存后点击弹出横幅上的"立即同步"！
</Tip>

<Frame>
  <img src="https://mintcdn.com/onesignal/6v_cVPknFpo5qSVB/images/docs/0b441ec-Huawei_AndroidStudio_sync_now.png?fit=max&auto=format&n=6v_cVPknFpo5qSVB&q=85&s=ae87a2d2f8a1b7aaf9fe17208255be4c" width="1033" height="112" data-path="images/docs/0b441ec-Huawei_AndroidStudio_sync_now.png" />
</Frame>

***

## 其他配置步骤

### 与其他 HMS 推送库或您自己的 `HmsMessageService` 类的兼容性

需要时：

* 除了 OneSignal 之外，您的应用中还有另一个 HMS 推送 SDK/库
* 您有自己的 `HmsMessageService`

<Accordion title="更多详细信息...">
  创建一个继承自 `HmsMessageService` 的类（如果您还没有的话），并添加以下方法。

  <Warning>
    如果您已经有一个继承自 `HmsMessageService` 的类，请添加两行新的 `OneSignalHmsEventBridge` 代码，而不是创建另一个类。
  </Warning>

  ```java Java theme={null}
  public class YourHmsMessageService extends HmsMessageService {
    public void onNewToken(String token) {
        // ...
        // Forward event on to OneSignal SDK
        OneSignalHmsEventBridge.onNewToken(this, token);
    }

    @Override
    public void onMessageReceived(RemoteMessage message) {
        // ...
        // Forward event on to OneSignal SDK
        OneSignalHmsEventBridge.onMessageReceived(this, message);
    }
  }
  ```

  这是为了通过 `OneSignalHmsEventBridge` 将 `onNewToken` 和 `onMessageReceived` 转发给 OneSignal。

  如果您之前没有继承自 `HmsMessageService` 的类，请确保将其添加到 `<application>` 标签下的 `AndroidManifest.xml` 中。

  ```xml AndroidManifest.xml theme={null}
  <application>
      ...

      <!--
        Ensure you only have one intent-filter for "com.huawei.push.action.MESSAGING_EVENT".
        HMS only supports one per app.
      -->
      <service
          android:name=".YourHmsMessageService"
          android:exported="false">
          <intent-filter>
              <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
          </intent-filter>
      </service>

      ...
  </application>
  ```
</Accordion>

### 为华为应用市场构建省略 Google 库（可选）

<Accordion title="更多详细信息...">
  <Tabs>
    <Tab title="选项 1">
      如果您的应用仅在华为应用市场上可用，并且您希望省略 OneSignal 包含的任何 Google 相关依赖项，您可以在 `app/build.gradle` 中使用 `implementation` 的 `exclude`。

      <CodeGroup>
        ```groovy app/build.gradle theme={null}
        implementation('com.onesignal:OneSignal:[5.4.0, 5.99.99]') {
            exclude group: 'com.google.android.gms'
            exclude group: 'com.google.firebase'
        }
        ```
      </CodeGroup>
    </Tab>

    <Tab title="选项 2">
      如果您的应用同时适用于 Google Play 商店和华为应用市场，并且您希望有选择地包含哪些库以使 APK 更小，您可以根据 buildTypes 或变体添加依赖项。示例：

      <CodeGroup>
        ```groovy app/build.gradle theme={null}
        android {
          // ...
           buildTypes {
               debug {
               }
               release {
               }
               // **** Add your custom hauwei buildType here
               huawei {
               }
           }
        }

        dependencies {
        // \*\*\*\* Use the full OneSignal dependencies for Google Play Store builds
        debugImplementation 'com.onesignal:OneSignal:[5.0.0, 5.99.99]'
        releaseImplementation 'com.onesignal:OneSignal:[5.0.0, 5.99.99]'

            // **** Only include hms:push for your Huawei AppGallery builds.
            huaweiImplementation 'com.huawei.hms:push:6.3.0.304'
            // Omit Google / Firebase libraries for Huawei builds.
            huaweiImplementation('com.onesignal:OneSignal:[5.0.0, 5.99.99]') {
                exclude group: 'com.google.android.gms'
                exclude group: 'com.google.firebase'
            }

        }

        ```
      </CodeGroup>
    </Tab>
  </Tabs>
</Accordion>

### 首选 HMS 而不是 FCM（可选）

<Accordion title="更多详细信息...">
  ***如果您在上面的华为应用市场构建中已经[省略了 Google 库](./huawei-sdk-setup#omit-google-libraries-for-huawei-appgallery-builds-optional)，则此步骤不适用。***

  默认情况下，如果您的应用中包含 FCM 和 HMS，OneSignal 更倾向于使用 FCM。如果您希望将其更改为首选 HMS，可以将以下内容添加到您的 `AndroidManifest.xml` 中：

  <CodeGroup>
    ```xml xml theme={null}
    <application>
            ...
            <meta-data android:name="com.onesignal.preferHMS" android:value="true"/>
            ...
     </application>
    ```
  </CodeGroup>
</Accordion>

***

## 华为故障排除

在测试时，确保将 [OneSignal setLogLevel 方法](./mobile-sdk-reference#setloglevel) 设置为 VERBOSE。

检查日志以查看抛出的任何错误和 [华为通用错误代码](https://developer.huawei.com/consumer/en/doc/development/HMS-2-References/hmssdk_huaweipush_api_reference_errorcode)。

<Accordion title="6003 错误">
  您可能需要创建调试或发布密钥库签名（选择正确的应用构建路径，`debug` 或 `release`），以便在使用 OneSignal SDK 注册华为 `pushToken` 时避免 `6003` 错误。请参见 ["配置签名" 部分](https://developer.huawei.com/consumer/en/doc/HMS-Guides/Preparations#h2-1584707362385)
</Accordion>

<Accordion title="notification_types: -25">
  `"notification_types":-25` 意味着 OneSignal 在等待华为 HMS 响应以获取推送令牌时超时。这很可能是由于另一个第三方 HMS 推送 SDK 或您自己的 HmsMessageService 获取了此事件而不是 OneSignal。

  请查看 [有关如何检查此情况并在此情况下转发事件的步骤](#compatibility-with-other-hms-push-libraries-or-your-own-hmsmessageservice-class)。
</Accordion>

<Accordion title="notification_types: -28">
  这意味着应用中缺少推送所需的 HMS 类。只要在 `build.gradle` 中有 `com.huawei.hms:push`，就不会再发生这个特定错误。但是，如果您有一些激进的 Proguard 或 R8 设置，这可能会导致问题。如果您有的话，我们建议暂时关闭 `minifyEnabled`，看看这是否是问题的根源。

  另外，您不应该混合其他 HMS 库的主要发布版本。从 4 或 5 开始。确保不要有从 3 到 5 的混合，这会产生其他错误
</Accordion>

<Accordion title="获取华为推送令牌时出错">
  ```
  E/OneSignal: HMS ApiException getting Huawei push token!
      com.huawei.hms.common.ApiException: -5: Core error
  ```

  检查您的 Proguard 或 R8 规则以确保它们设置正确。可能暂时禁用它，看看是否相关。如果在禁用 Proguard 或 R8 后修复了问题，那么您可以按照此指南重新启用它。请参见 ["配置签名" 部分](https://developer.huawei.com/consumer/en/doc/HMS-Guides/Preparations#h2-1584707362385)
</Accordion>

## 测试 OneSignal SDK 集成

本指南帮助您通过测试推送通知、订阅注册和应用内消息来验证 OneSignal SDK 集成是否正常工作。

### 检查移动端订阅

<Steps>
  <Step title="在测试设备上启动您的应用。">
    如果您在初始化时添加了 `requestPermission` 方法，原生推送权限提示应该会自动出现。

    <Frame caption="iOS 和 Android 推送权限提示">
      <img src="https://mintcdn.com/onesignal/RWtLFPeffHrC81wI/images/docs/a90c2cc443f5fe9e7c80368c680a16cf1ca6203f7b28a0a6eec212add8510f80-Untitled_design_11.png?fit=max&auto=format&n=RWtLFPeffHrC81wI&q=85&s=96dbf224b3ae93b3d814712cdc5416ba" width="1920" height="1080" data-path="images/docs/a90c2cc443f5fe9e7c80368c680a16cf1ca6203f7b28a0a6eec212add8510f80-Untitled_design_11.png" />
    </Frame>
  </Step>

  <Step title="检查您的 OneSignal 控制台">
    在接受提示之前，请检查 OneSignal 控制台：

    * 转到 **受众 > 订阅**。
    * 您应该看到一个状态为"从未订阅"的新条目。

    <Frame caption="控制台显示 '从未订阅' 状态的订阅">
      <img src="https://mintcdn.com/onesignal/Xl2NHJvxakrK4JbL/images/docs/f19fa5ada3572ce14447bb5639744e9da75cd7a3ab43ecc1a057f2ed92b38e6f-Screenshot_2025-03-16_at_14.55.39.png?fit=max&auto=format&n=Xl2NHJvxakrK4JbL&q=85&s=b04ca3217e22155841b500a55c7f1511" width="1588" height="976" data-path="images/docs/f19fa5ada3572ce14447bb5639744e9da75cd7a3ab43ecc1a057f2ed92b38e6f-Screenshot_2025-03-16_at_14.55.39.png" />
    </Frame>
  </Step>

  <Step title="返回应用并在提示中点击允许。" />

  <Step title="刷新 OneSignal 控制台的订阅页面。">
    订阅状态现在应该显示为**已订阅**。

    <Frame caption="控制台显示 '已订阅' 状态的订阅">
      <img src="https://mintcdn.com/onesignal/0qspEXXeJ8zJbkJ-/images/docs/85b0376cdcc6f93fb7b3895b18cd1788d2342776d7995909881e5c64dd40fb62-Screenshot_2025-03-16_at_15.57.34.png?fit=max&auto=format&n=0qspEXXeJ8zJbkJ-&q=85&s=c6abec64d102b84e30f6c9c0327808ef" width="1588" height="976" data-path="images/docs/85b0376cdcc6f93fb7b3895b18cd1788d2342776d7995909881e5c64dd40fb62-Screenshot_2025-03-16_at_15.57.34.png" />
    </Frame>

    <Check>您已成功创建了[移动端订阅](/docs/cn/subscriptions)。
    移动端订阅是在用户首次在设备上打开您的应用时创建的，或者在同一设备上卸载并重新安装您的应用时创建的。</Check>
  </Step>
</Steps>

### 设置测试订阅

测试订阅有助于在发送消息之前测试推送通知。

<Steps>
  <Step title="添加到测试订阅。">
    在控制台中，在订阅旁边，点击**选项（三个点）**按钮并选择**添加到测试订阅**。

    <Frame caption="将设备添加到测试订阅">
      <img src="https://mintcdn.com/onesignal/NCUI56Tiw7V-s0dT/images/dashboard/add-to-test-subscriptions.png?fit=max&auto=format&n=NCUI56Tiw7V-s0dT&q=85&s=2455d4cd74ea4ad686f76730cd95bbaa" width="1188" height="742" data-path="images/dashboard/add-to-test-subscriptions.png" />
    </Frame>
  </Step>

  <Step title="为您的订阅命名。">
    为订阅命名，以便您稍后能够在**测试订阅标签**中轻松识别您的设备。
  </Step>

  <Step title="创建测试用户分组。">
    转到 **受众 > 分组 > 新建分组**。
  </Step>

  <Step title="为分组命名。">
    将分组命名为 `Test Users`（名称很重要，因为稍后会使用到）。
  </Step>

  <Step title="添加测试用户过滤器并点击创建分组。">
    <Frame caption="使用测试用户过滤器创建 'Test Users' 分组">
      <img src="https://mintcdn.com/onesignal/NCUI56Tiw7V-s0dT/images/dashboard/create-test-users-segment.png?fit=max&auto=format&n=NCUI56Tiw7V-s0dT&q=85&s=91b8a021be6e83662854e68ec3e1da04" width="1188" height="742" data-path="images/dashboard/create-test-users-segment.png" />
    </Frame>

    <Check>您已成功创建了测试用户分组。
    现在我们可以测试向这个单独的设备和测试用户组发送消息。</Check>
  </Step>
</Steps>

### 通过 API 发送测试推送

<Steps>
  <Step title="获取您的应用 API 密钥和应用 ID。">
    在您的 OneSignal 控制台中，转到 **设置 > [密钥和 ID](/docs/cn/keys-and-ids)**。
  </Step>

  <Step title="更新提供的代码。">
    将下面代码中的 `YOUR_APP_API_KEY` 和 `YOUR_APP_ID` 替换为您的实际密钥。此代码使用我们之前创建的 `Test Users` 分组。

    ```curl theme={null}
    curl -X \
    POST --url 'https://api.onesignal.com/notifications' \
     --header 'content-type: application/json; charset=utf-8' \
     --header 'authorization: Key YOUR_APP_API_KEY' \
     --data \
     '{
      "app_id": "YOUR_APP_ID",
      "target_channel": "push",
      "name": "Testing basic setup",
      "headings": {
      	"en": "👋"
      },
      "contents": {
        "en": "Hello world!"
      },
      "included_segments": [
        "Test Users"
      ],
      "ios_attachments": {
        "onesignal_logo": "https://avatars.githubusercontent.com/u/11823027?s=200&v=4"
      },
      "big_picture": "https://avatars.githubusercontent.com/u/11823027?s=200&v=4"
    }'
    ```
  </Step>

  <Step title="运行代码。">
    在您的终端中运行代码。
  </Step>

  <Step title="检查图片和确认送达。">
    如果所有设置步骤都成功完成，测试订阅应该会收到包含图片的通知：

    <Frame caption="iOS 和 Android 上包含图片的推送通知">
      <img src="https://mintcdn.com/onesignal/Z6xkXGfmy814If53/images/docs/e4e3e812eb6841ff11795a6ee0ea36eff483920ea9266733d6948ed34df3def3-Untitled_design_9.png?fit=max&auto=format&n=Z6xkXGfmy814If53&q=85&s=9bf6f4a73e38ec424b8cfec75a474a26" width="1200" height="800" data-path="images/docs/e4e3e812eb6841ff11795a6ee0ea36eff483920ea9266733d6948ed34df3def3-Untitled_design_9.png" />
    </Frame>

    <Info>图片在折叠的通知视图中会显得很小。展开通知以查看完整图片。</Info>
  </Step>

  <Step title="检查确认送达。">
    在您的控制台中，转到 **送达 > 已发送消息**，然后点击消息查看统计数据。

    您应该会看到**已确认**统计，表示设备收到了推送。
    <Check>您已成功通过我们的 API 向分组发送了通知。</Check>

    <Warning>
      * 没有收到图片？您的[通知服务扩展](#ios-setup)可能缺失。
      * 没有确认送达？请检查您的[应用组设置](#ios-setup)。
      * 遇到问题？将 API 请求和应用启动从开始到结束的日志复制粘贴到 `.txt` 文件中。然后将两者都发送给 `support@onesignal.com`。
    </Warning>
  </Step>
</Steps>

### 发送应用内消息

[应用内消息](/docs/cn/in-app-messages-setup)让您可以在用户使用您的应用时与他们进行沟通。

<Steps>
  <Step title="在设备上关闭或将您的应用切换到后台。">
    这是因为用户必须在新会话开始\_之前\_满足应用内受众条件。在 OneSignal 中，当用户在应用处于后台或关闭至少 30 秒后重新打开应用时，会开始一个新会话。更多详情，请参阅我们的[应用内消息如何显示](/docs/cn/in-app-messages-setup#how-are-iams-displayed%3F)指南。
  </Step>

  <Step title="创建应用内消息。">
    * 在您的 OneSignal 控制台中，导航到 **消息 > 应用内 > 新建应用内消息**。
    * 找到并选择**欢迎**消息。
    * 将您的受众设置为我们之前使用的 **Test Users** 分组。

    <Frame caption="使用应用内消息定位 'Test Users' 分组">
      <img src="https://mintcdn.com/onesignal/3zq1PvSaqvUE2bIx/images/docs/2979dfb2c6e0711669ebe737d78d975dcfed9f8117bdd68846255b9fc91e4771-Screenshot_2025-03-17_at_14.56.23.png?fit=max&auto=format&n=3zq1PvSaqvUE2bIx&q=85&s=f705ee679a9248dab378305e15fa24bf" width="1410" height="752" data-path="images/docs/2979dfb2c6e0711669ebe737d78d975dcfed9f8117bdd68846255b9fc91e4771-Screenshot_2025-03-17_at_14.56.23.png" />
    </Frame>
  </Step>

  <Step title="如需要，请自定义消息内容。">
    <Frame caption="应用内欢迎消息的自定义示例">
      <img src="https://mintcdn.com/onesignal/YOTSrtBSoqdrJ37A/images/docs/4c511ebdb04f33055556b9969bab8deee0d62154573cf0b41ffb25cc8431e7c0-Screenshot_2025-03-17_at_14.59.37.png?fit=max&auto=format&n=YOTSrtBSoqdrJ37A&q=85&s=6134cc70e578d1055f770edcbad47efb" width="1646" height="1070" data-path="images/docs/4c511ebdb04f33055556b9969bab8deee0d62154573cf0b41ffb25cc8431e7c0-Screenshot_2025-03-17_at_14.59.37.png" />
    </Frame>
  </Step>

  <Step title="将触发器设置为 '应用打开时'。" />

  <Step title="安排频率。">
    在 **安排 > 您希望多久显示一次此消息？** 下选择 **每次触发条件满足时**。

    <Frame caption="应用内消息安排选项">
      <img src="https://mintcdn.com/onesignal/9_Q1FZLh6C0BFLq-/images/docs/c48ccaf33a74d5aa442c768a18b8e642024b89305aae665d613aee1d8bde43ec-Screenshot_2025-03-17_at_15.00.40.png?fit=max&auto=format&n=9_Q1FZLh6C0BFLq-&q=85&s=9a57431acffa267d22af4e19052fb5ee" width="1646" height="1070" data-path="images/docs/c48ccaf33a74d5aa442c768a18b8e642024b89305aae665d613aee1d8bde43ec-Screenshot_2025-03-17_at_15.00.40.png" />
    </Frame>
  </Step>

  <Step title="使消息生效。">
    点击 **使消息生效**，这样每次测试用户打开应用时都可以使用该消息。
  </Step>

  <Step title="打开应用并查看消息。">
    应用内消息生效后，打开您的应用。您应该会看到它显示：

    <Frame caption="在设备上显示的欢迎应用内消息">
      <img src="https://mintcdn.com/onesignal/RWtLFPeffHrC81wI/images/docs/a7ed4bb02be56900a65d2519e3d69f9c9b2c2a1c65fe740f07789e4ffe79cd67-Untitled_design_10.png?fit=max&auto=format&n=RWtLFPeffHrC81wI&q=85&s=6f692b569706ca39df0b4cc2b70f3de2" width="1920" height="1080" data-path="images/docs/a7ed4bb02be56900a65d2519e3d69f9c9b2c2a1c65fe740f07789e4ffe79cd67-Untitled_design_10.png" />
    </Frame>

    <Warning>
      没有看到消息？

      * 开始新会话
        * 您必须关闭或将应用切换到后台至少 30 秒后再重新打开。这可以确保开始新会话。
        * 更多信息，请参阅[应用内消息如何显示](/docs/cn/in-app-messages-setup#how-are-iams-displayed%3F)。
      * 仍在 `Test Users` 分组中？
        * 如果您重新安装或更换了设备，请重新将设备添加到[测试订阅](#set-up-test-subscriptions)并确认它是 Test Users 分组的一部分。
      * 遇到问题？
        * 在重现上述步骤时，请遵循[获取调试日志](/docs/cn/capturing-a-debug-log)。这将生成额外的日志，您可以与 `support@onesignal.com` 分享，我们将帮助调查正在发生的情况。
    </Warning>
  </Step>
</Steps>

<Check>
  您已成功设置 OneSignal SDK 并学习了重要概念，如：

  * 收集[订阅](/docs/cn/subscriptions)，设置[测试订阅](/docs/cn/find-set-test-subscriptions)，以及创建[分组](/docs/cn/segmentation)。
  * 使用分组和我们的[创建消息](/reference/create-message) API 发送带图片的[推送](/docs/cn/push)和[确认送达](/docs/cn/confirmed-delivery)。
  * 发送[应用内消息](/docs/cn/in-app-messages-setup)。

  继续阅读本指南以在您的应用中识别用户并设置其他功能。
</Check>

***

## 用户识别

之前，我们演示了如何创建移动端[订阅](/docs/cn/subscriptions)。现在我们将扩展到使用 OneSignal SDK 在所有订阅（包括推送、电子邮件和短信）中识别[用户](/docs/cn/users)。我们将涵盖外部 ID、标签、多渠道订阅、隐私和事件跟踪，以帮助您统一用户并跨平台与他们互动。

### 分配外部 ID

使用外部 ID 通过您后端的用户标识符在设备、电子邮件地址和电话号码之间一致地识别用户。这确保您的消息传递在各个渠道和第三方系统中保持统一（对[集成](/docs/cn/integrations)特别重要）。

每次您的应用识别用户时，使用我们 SDK 的[`login` 方法](/docs/cn/mobile-sdk-reference#login-external-id)设置外部 ID。

<Note>
  OneSignal 为订阅（订阅 ID）和用户（OneSignal ID）生成唯一的只读 ID。

  当用户在不同设备上下载您的应用、订阅您的网站，和/或在您的应用之外提供电子邮件地址和电话号码时，将创建新的订阅。

  强烈建议通过我们的 SDK 设置外部 ID，以在用户的所有订阅中识别用户，无论订阅是如何创建的。
</Note>

### 添加数据标签

[标签](/docs/cn/add-user-data-tags)是字符串数据的键值对，您可以使用它们来存储用户属性（如 `username`、`role` 或偏好）和事件（如 `purchase_date`、`game_level` 或用户交互）。标签支持高级[消息个性化](/docs/cn/message-personalization)和[分组](/docs/cn/segmentation)，允许更高级的用例。

在您的应用中发生事件时，使用我们 SDK 的[`addTag` 和 `addTags` 方法](/docs/cn/mobile-sdk-reference#data-tags)设置标签。

在这个示例中，用户达到了第 6 级，可以通过名为 `current_level` 的标签识别，其值设置为 `6`。

<Frame caption="OneSignal 中带有名为'current_level'标签设置为'6'的用户档案">
  <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/d4674261847231079fecc176ba88065409c90943e3854b9df200457325a0aed4-Screenshot_2025-03-18_at_14.47.25.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=91083bf83a4c03ea40d485b23f072259" width="1380" height="941" data-path="images/docs/d4674261847231079fecc176ba88065409c90943e3854b9df200457325a0aed4-Screenshot_2025-03-18_at_14.47.25.png" />
</Frame>

我们可以创建一个等级在 5 到 10 之间的用户分组，并使用它来发送有针对性的个性化消息：

<Frame caption="分组编辑器显示针对 current_level 值大于 4 且小于 10 的用户的分组">
  <img src="https://mintcdn.com/onesignal/3zq1PvSaqvUE2bIx/images/docs/300d36b632a6f6d7017780457bbe2610b71767fd0db093c7611e59714dcbda5b-Screenshot_2025-03-18_at_14.49.56.png?fit=max&auto=format&n=3zq1PvSaqvUE2bIx&q=85&s=b84ab0d2c6eedbd6d4e7a2bf15afe103" width="1380" height="941" data-path="images/docs/300d36b632a6f6d7017780457bbe2610b71767fd0db093c7611e59714dcbda5b-Screenshot_2025-03-18_at_14.49.56.png" />
</Frame>

<br />

<Frame caption="屏幕截图显示针对 5-10 级分组发送的个性化推送通知">
  <img src="https://mintcdn.com/onesignal/tc0EvmtSSX56SX0c/images/docs/97e09b42d25c6d3f4c7cb0a6fff4dfb8893cbb4b283f7ff1f77977c33113319c-Screenshot_2025-03-18_at_14.55.47.png?fit=max&auto=format&n=tc0EvmtSSX56SX0c&q=85&s=c7839b12057d65a12a4eaddce6e2c11f" width="2764" height="2286" data-path="images/docs/97e09b42d25c6d3f4c7cb0a6fff4dfb8893cbb4b283f7ff1f77977c33113319c-Screenshot_2025-03-18_at_14.55.47.png" />
</Frame>

<br />

<Frame caption="iOS 和 Android 设备上收到的包含个性化内容的推送通知">
  <img src="https://mintcdn.com/onesignal/_KaXe4GQkxsEfa17/images/docs/3bf1810580f30984745017056383f151b874513b6bfb1445fb1016e5c9a79e82-Untitled_design_12.png?fit=max&auto=format&n=_KaXe4GQkxsEfa17&q=85&s=94b6e9eeeb5516285a256a72063a0906" width="1920" height="1080" data-path="images/docs/3bf1810580f30984745017056383f151b874513b6bfb1445fb1016e5c9a79e82-Untitled_design_12.png" />
</Frame>

### 添加电子邮件和/或短信订阅

之前我们了解了我们的 SDK 如何创建移动端订阅来发送推送和应用内消息。您还可以通过创建相应的订阅，通过电子邮件和短信渠道联系用户。

* 使用[`addEmail` 方法](/docs/cn/mobile-sdk-reference#addemail-%2C-removeemail)创建电子邮件订阅。
* 使用[`addSms` 方法](/docs/cn/mobile-sdk-reference#addsms-%2C-removesms)创建短信订阅。

如果电子邮件地址和/或电话号码在 OneSignal 应用中已存在，SDK 会将其添加到现有用户，不会创建重复项。

您可以通过控制台中的 **受众 > 用户** 或使用[查看用户 API](/reference/view-user)查看统一的用户。

<Frame caption="通过外部 ID 统一的包含推送、电子邮件和短信订阅的用户档案">
  <img src="https://mintcdn.com/onesignal/56ctKxZSV4m5VEkn/images/docs/b1cf9999d41da6e4ce333e1126612529b85eac47447bb0b434418d082f595acd-Screenshot_2025-03-18_at_14.43.46.png?fit=max&auto=format&n=56ctKxZSV4m5VEkn&q=85&s=7c3885b66e44e097fa0ed7c47f27c911" width="1506" height="848" data-path="images/docs/b1cf9999d41da6e4ce333e1126612529b85eac47447bb0b434418d082f595acd-Screenshot_2025-03-18_at_14.43.46.png" />
</Frame>

<Note>
  多渠道沟通的最佳实践

  * 在添加电子邮件或短信订阅之前获得明确同意。
  * 向用户解释每个沟通渠道的好处。
  * 提供渠道偏好，让用户可以选择他们偏好的渠道。
</Note>

***

### 隐私和用户同意

要控制 OneSignal 何时收集用户数据，请使用 SDK 的同意管控方法：

* [`setConsentRequired(true)`](/docs/cn/mobile-sdk-reference#setconsentrequired)：阻止数据收集直到获得同意。
* [`setConsentGiven(true)`](/docs/cn/mobile-sdk-reference#setconsentgiven)：一旦获得同意即启用数据收集。

有关更多信息，请参阅我们的隐私和安全文档：

* [SDK 收集的数据](/docs/cn/data-collected-by-the-onesignal-sdk)
* [处理个人数据](/docs/cn/handling-personal-data)

***

## 提示推送权限

不要在应用打开时立即调用 `requestPermission()`，而是采取更策略性的方法。在请求权限之前，使用应用内消息解释推送通知的价值。

有关最佳实践和实现细节，请参阅我们的[提示推送权限](/docs/cn/prompt-for-push-permissions)指南。

***

## 监听推送、用户和应用内事件

使用 SDK 监听器来响应用户操作和状态变化。

SDK 提供了几个事件监听器供您使用。更多详情请参阅我们的[SDK 参考指南](/docs/cn/mobile-sdk-reference)。

### 推送通知事件

* [`addClickListener()`](/docs/cn/mobile-sdk-reference#addclicklistener-push)：检测通知被点击时。对[深度链接](/docs/cn/deep-linking)有帮助。
* [`addForegroundLifecycleListener()`](/docs/cn/mobile-sdk-reference#addforegroundlifecyclelistener-push)：控制通知在前台的行为方式。

要进行完全自定义，请参阅[移动端服务扩展](/docs/cn/service-extensions)。

### 用户状态变化

* [`addObserver()` 用于用户状态](/docs/cn/mobile-sdk-reference#addobserver-user-state)：检测外部 ID 设置时。
* [`addPermissionObserver()`](/docs/cn/mobile-sdk-reference#addpermissionobserver-push)：跟踪用户与原生推送权限提示的特定交互。
* [`addObserver()` 用于推送订阅](/docs/cn/mobile-sdk-reference#addobserver-push-subscription-changes)：跟踪推送订阅状态变化时。

### 应用内消息事件

* [`addClickListener()`](/docs/cn/mobile-sdk-reference#addclicklistener-in-app)：处理应用内点击操作。适用于深度链接或跟踪事件。
* [`addLifecycleListener()`](/docs/cn/mobile-sdk-reference#addclicklistener-in-app)：跟踪应用内消息的完整生命周期（显示、点击、关闭等）。

***

## 高级设置和功能

探索更多功能以增强您的集成：

* [🔁 从其他服务迁移到 OneSignal](/docs/cn/migrating-to-onesignal)
* [🌍 位置跟踪](/docs/cn/mobile-sdk-reference#location)
* [🔗 深度链接](/docs/cn/deep-linking)
* [🔌 集成](/docs/cn/integrations)
* [🧩 移动端服务扩展](/docs/cn/service-extensions)
* [🛎️ 操作按钮](/docs/cn/action-buttons)
* [🌐 多语言消息](/docs/cn/multi-language-messaging)
* [🛡️ 身份验证](/docs/cn/identity-verification)
* [📊 自定义结果](/docs/cn/custom-outcomes)
* [📲 Live Activities](/docs/cn/live-activities)

### 移动端 SDK 设置和参考

通过查看[移动端推送设置](/docs/cn/mobile-push-setup)指南，确保您已启用所有关键功能。

有关可用方法和配置选项的完整详细信息，请访问[移动端 SDK 参考](/docs/cn/mobile-sdk-reference)。

<Check>恭喜！您已成功完成移动端 SDK 设置指南。</Check>

***

<Info>
  需要帮助？

  与我们的支持团队聊天或发送邮件至 `support@onesignal.com`

  请包含以下信息：

  * 您遇到的问题详情以及复现步骤（如有）
  * 您的 OneSignal 应用 ID
  * 外部 ID 或订阅 ID（如适用）
  * 您在 OneSignal 控制台中测试的消息 URL（如适用）
  * 任何相关的[日志或错误信息](/docs/cn/capturing-a-debug-log)

  我们很乐意为您提供帮助！
</Info>

***
