You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android Studio WebView应用中获取OneSignal PlayerId实现单用户推送?

两种无需深度修改Android代码的OneSignal单用户推送方案

方案1:获取PlayerId同步到后端数据库

你可以在Android应用的Application初始化阶段,通过OneSignal的API获取PlayerId,然后将其与当前登录用户的ID一起发送到你的后端接口,由后端存入MySQL表中。

核心代码(直接复制到Application类即可)

import com.onesignal.OneSignal;
import com.onesignal.DeviceState;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.util.Observable;
import java.util.Observer;

public class MyApplication extends android.app.Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化OneSignal
        OneSignal.initWithContext(this);
        OneSignal.setAppId("你的OneSignal App ID");

        // 监听设备状态变化,获取PlayerId
        OneSignal.getDeviceState().addObserver(new Observer() {
            @Override
            public void update(Observable observable, Object data) {
                DeviceState deviceState = (DeviceState) data;
                String playerId = deviceState.getUserId();
                // 从本地获取当前登录用户的ID(比如从SharedPreferences读取)
                String userId = getSharedPreferences("user_info", MODE_PRIVATE).getString("user_id", null);

                if (playerId != null && userId != null) {
                    // 子线程中发送请求到后端,避免ANR
                    new Thread(() -> {
                        try {
                            URL url = new URL("https://你的网站域名/api/save-player-id");
                            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                            conn.setRequestMethod("POST");
                            conn.setDoOutput(true);
                            conn.setRequestProperty("Content-Type", "application/json");
                            // 构造JSON参数
                            String jsonBody = String.format("{\"user_id\":\"%s\",\"player_id\":\"%s\"}", userId, playerId);
                            OutputStream os = conn.getOutputStream();
                            os.write(jsonBody.getBytes());
                            os.flush();
                            // 检查响应(可选)
                            int responseCode = conn.getResponseCode();
                            if (responseCode == 200) {
                                // 同步成功
                            }
                            conn.disconnect();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }).start();
                }
            }
        });
    }
}

后端处理

后端只需要提供一个接收user_id和player_id的接口,将两者关联存入你的MySQL表即可,后续用Curl推送时,根据用户ID查询对应的PlayerId,再调用OneSignal的API:

curl --request POST \
  --url https://onesignal.com/api/v1/notifications \
  --header 'Authorization: Basic 你的OneSignal REST API密钥' \
  --header 'Content-Type: application/json' \
  --data '{
    "app_id": "你的OneSignal App ID",
    "contents": {"en": "你的推送内容"},
    "include_player_ids": ["查询到的PlayerId"]
  }'

方案2:给OneSignal设置用户ID标签(更省心,无需维护映射表)

直接在用户登录成功后,将网站的用户ID作为标签发送给OneSignal,后续后端推送时,通过标签筛选目标用户,无需自己存储PlayerId。

核心代码(登录成功后调用)

import com.onesignal.OneSignal;

// 用户登录成功后调用此方法
public void setUserTagOnOneSignal(String userId) {
    // 将网站用户ID作为标签设置到OneSignal
    OneSignal.sendTag("user_id", userId);
}

后端Curl推送示例

直接通过filters参数指定目标用户的user_id标签即可:

curl --request POST \
  --url https://onesignal.com/api/v1/notifications \
  --header 'Authorization: Basic 你的OneSignal REST API密钥' \
  --header 'Content-Type: application/json' \
  --data '{
    "app_id": "你的OneSignal App ID",
    "contents": {"en": "你的推送内容"},
    "filters": [
      {"field": "tag", "key": "user_id", "relation": "=", "value": "目标用户的网站ID"}
    ]
  }'

注意事项

  • 确保APP能正确获取登录后的用户ID,建议存在SharedPreferences或本地数据库中
  • 网络请求必须在子线程执行,避免应用无响应(ANR)
  • 若使用标签方案,用户切换账号时需调用OneSignal.sendTag更新标签,避免推送错误用户
  • OneSignal单个用户最多支持20个标签,完全满足此场景需求

内容的提问来源于stack exchange,提问作者alebal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:15:38