OneSignal带标签过滤推送失败:提示“所有目标用户未订阅”求助
解决OneSignal通知发送失败:“所有包含的用户未订阅”问题
刚碰到过类似的坑,来帮你一步步排查这个报错,大概率是这几个细节没注意到:
1. 标签大小写不匹配(最可能的原因)
OneSignal的标签是大小写敏感的!你提到要给带“Broodjes”(首字母大写)标签的用户发通知,但你的curl请求里写的是"key": "broodjes"(全小写)。这会导致OneSignal找不到任何匹配的用户,直接返回“所有用户未订阅”的错误。
修正方法:把过滤器里的key改成和用户标签完全一致的大小写:
"filters": [ {"field": "tag", "key": "Broodjes", "relation": "exists"} ]
2. 确认用户确实带有目标标签
有时候可能误以为用户已经打上了标签,但实际操作中可能漏了。你可以用OneSignal的Players API来验证:
curl -X GET "https://onesignal.com/api/v1/players?app_id=<你的APP_ID>" \ -H "Authorization: Basic <你的REST_API_KEY>"
返回结果里,检查每个用户的tags字段,确认是否存在"Broodjes"标签。
3. 过滤掉未订阅/失效的用户
即使用户有标签,也可能处于未订阅或失效状态。你可以在过滤器里加上订阅状态条件,确保只针对活跃订阅用户:
"filters": [ {"field": "tag", "key": "Broodjes", "relation": "exists"}, {"field": "subscription_status", "relation": "=", "value": "1"} ]
这里value: 1代表用户处于订阅状态,0是未订阅,2是失效状态。
4. 再次确认API权限和APP_ID
虽然你说已经填了有效信息,但还是快速核对下:
- 你的REST API Key是否有
Create Notifications权限(在OneSignal控制台的「Settings > Keys & IDs」里查看) - APP_ID是否和用户所属的应用完全匹配
修正后的完整curl示例
curl -X POST \ https://onesignal.com/api/v1/notifications \ -H 'Authorization: Basic <你的REST_API_KEY>' \ -H 'Cache-Control: no-cache' \ -H 'Content-Type: application/json' \ -d '{ "app_id": "<你的APP_ID>", "filters": [ {"field": "tag", "key": "Broodjes", "relation": "exists"}, {"field": "subscription_status", "relation": "=", "value": "1"} ], "contents": {"en": "English Message"} }'
内容的提问来源于stack exchange,提问作者Sascha Mendel
相关产品推荐
相关产品推荐

