# uni-push2.0、uni-id、uni统计的组合说明

# 包含的opendb表

数据表名称 操作(添加/更新)时机 内容/作用
opendb-tempdata 旧token过期时 向个推服务器发起请求的token
opendb-device 设备启动、登录 push_clientid与详细的设备信息
uni-id-device 登录 主要用于存储user_id 与 device_id的映射关系,完整字段:user_id、device_id、token_expired、push_clientid、appid

详情:

  1. uni统计模块,在设备启动时立即调用getPushClientId获取push_clientid,如果获取成功后(应用未在manifest中启用uni-push2.0则会获取失败)则调用uni-stat-receiver云对象的report方法(参数:push_clientid),服务器会向opendb-device表写入或更新(存在时):设备信息push_clientid

  2. uni-id-pages插件,调用uniCloud.onRefreshToken 监听token发生变化(即:用户登录和token续期时),调用uni-id-co云对象的setPushCid方法(参数:push_clientid)服务器操作uni-id-device表,记录device_iduser_id的映射关系;完整字段包含user_iddevice_idtoken_expiredpush_clientidappid。同时再向opendb-device表写入或更新(存在时):设备信息push_clientid

综上:push_clientid被存储在uni-id-deviceopendb-device两个表,前者用于存储device_iduser_id的映射关系,仅用户登录成功后才有对应数据;后者用于存储完整的设备信息,未登录的用户也有对应的数据。

注意: 当用户未登录时,我们可以基于device_id向用户推送消息,但有被窃听的风险(营销类消息不用太关心这个)。因为opendb-device表中存储的设备信息,底层的技术原理是获取客户端自动上报的信息,理论上存在被篡改可能。如:张三使用李四的device_id+张三的push_clientid。上报数据;服务器会认为李四的push_clientid更新了,从而将李四的device_idpush_clientid的映射关系,指向张三的push_clientid;张三从而窃听到,其他人发给李四的消息。 而基于user_id或者user_tag推送消息,是基于uni-id-device表,在新增/更新操作时:会校验当前用户的user_id,不会被其他用户篡改,即没有被他人窃听消息的风险。

# 设备信息

来源uniCloud云对象中的this.getClientInfo方法,完整字段列表参考:uni.getSystemInfo

# 推送接口查库详解:

  • 推送目标依据为:push_clientid直接执行推送。
  • 推送目标依据为:device_id,查opendb-device表,获得push_clientid执行推送
  • 推送目标依据为:users_iduni-id-device表(如果需要验证platform就联查opendb-device表),获得push_clientid执行推送
  • 推送目标依据为:user_taguni-id-users表,获得users_iduni-id-device表(如果需要验证platform就联查opendb-device表),获得push_clientid执行推送