如何在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
相关产品推荐
相关产品推荐

