新的事件发送定义(讨论中).md 4.84 KB

##CHANGELOG ###[2016-02-16]

Add

  • 追加MNS授时问题的解决方案

###[2016-01-12]

Changed

  • profile相关事件追加

###[2015-12-26]

Changed

  • 心跳时间从3分钟降低为1分钟

##1、格式的定义 提交地址:URL?TOKEN=XXXX,参考:MNS

目前测试用提交的服务器地址为:http://1296825402699921.mns.cn-hangzhou.aliyuncs.com/queues/boxfish-log-v2-test

method:POST

事件格式(事件之间有序)

[event,...]

event定义(事件内部无序)

{
"app_key":"应用标示",
"user_id":"用户唯一标示,可以为空",
"device_id":"设备唯一标示(IDFA,OPENUDID)",
"event_id":"事件唯一标示GUID",
"key":"自定义事件名称",
"time":"时间戳(单位:毫秒)",
"type":"调取的方法",
"properties":{"自定义参数":"键值对的形式"}
}

参数级别按先后顺序分为:系统级,会话级,事件级

  • 系统级:系统启动时由SDK获取到的系统信息,固定以$开头
  • 会话级:在整个会话的生命周期里的全局参数(可以修改)
  • 事件级:在当前事件里的参数

最后上报的事件为这三个级别依次叠加后的结果。

系统级参数

参数 级别 栗子 定义
$lib 系统 iOS SDK类库
$lib_version 系统 1.2.0 SDK库版本
$os 系统 iPhone OS 操作系统
$os_version 系统 9.1 操作系统版本
$model 系统 iPod touch or x86_64 硬件型号
$watch_model 系统 Apple Watch 38mm 不重要 手表型号
$screen_width 系统 1024 屏幕宽度
$screen_height 系统 768 屏幕高度
$manufacturer 系统 Apple 制造商,默认值为:UNKNOWN
$app_version 系统 655 编译号(Bundle version)
$app_release 系统 1.0 语义化版本号(Bundle versions string, short)
$ios_ifa 系统 xxxxxxxx 苹果广告唯一标示
$province 系统 北京 省份,可以忽略
$city 系统 北京 城市,可以忽略
$country 系统 中国 国家,可以忽略
$wifi 会话 1 or 0 是否启用wifi
$ip 会话 192.168.0.110 IP(目前从http://user.i.test.boxfish.cn/ip来获取),默认值为:UNKNOWN
$network 会话 NULL or 2G or 3G or 4G or WIFI 网络状态
$carrier 会话 中国联通 运营商,默认值为:UNKNOWN

type的取值

类型 说明 备注
begin_session 应用启动 应用启动或进入前台时自动触发
end_session 应用关闭 应用启动退出到后台或者关闭时自动触发
session_duration 心跳 应用每1分钟发出一次
track 普通监测 只有这个事件才有key属性
track_signup 注册监测(服务器会对用户进行处理) 用于第一次注册
profile_set 设置profile 批量存放properties为用户属性,覆盖所有已存在的属性
profile_set_once 设置一次profile 批量存放properties为用户属性,只有当属性不存在时才保存
profile_unset 取消设置profile 批量删除已经存在的属性,如果不存在,则不删除
profile_increment profile自增长 可以对已经存在的属性进行增减,必须已经存在,且为int或者float类型,参数可以为负数
profile_append profile追加 这个是什么鬼?
profile_delete profile删除 删除该用户

##2、缓存机制

A. 离线缓存 所有离线事件均进行缓存,当有网络后,会批量发出这些事件。

B. 服务器确认 如果服务器未能确认成功接收事件,则隔一段事件后,需要重新发出

C. 服务器去重 服务器会记录已经发出事件的GUID,如果某GUID已经接收过,则不会将该事件再次记录,返回客户端消息成功接收(重复信息)。

D. 服务器重排列 服务器会定期梳理事件,尽可能保证last_event_id的事件在event_id的前面。如果出现循环,丢失等情况,则略过。

##3、MNS授时问题 由于我们采取的方式为客户端将事件直接发送给MNS服务器,而用户设备的时间是否准确直接影响到MNS到底能否正确接收,所以这里出现了授时问题,解决方案如下:

  1. 提交时如果response状态码为:408,则发生了授时问题,此时需要通过response拿到正确的服务器时间
  2. 拿到正确的服务器时间后计算与本设备的时间偏移量并保存起来
  3. 拿当前时间加上偏移量重新计算签名并重新提交

##参考: