灰度与条件下发

SDK 1.2 版本开始支持脚本的灰度与条件下发。

灰度

在后台发布补丁脚本时可以选择灰度下发,分为按比例灰度与按人数灰度。

按比例灰度

若选择按比例灰度,这个补丁就会按选定的百分比只对这个比例的用户起作用。例如选择灰度 30%,那这个补丁脚本只会在所有接入的设备中随机挑选 30% 的设备生效。

按比例灰度下发无需 SDK 额外设置,只需接入的 SDK 版本在 1.2 以上。

灰度发布后后续可以修改这个灰度值,便于逐渐增加灰度数量,直到全量发布。

按人数灰度

按人数灰度可以指定补丁对多少个用户生效,超过设置的人数后不会再生效。例如设置灰度1000人,在1000台设备加载补丁后,后续其他设备都不会加载这个补丁。灰度人数可以修改增加,但不能减少,可以逐渐增加灰度人数,直到全量发布。按人数下发需要 SDK 版本在 1.6.2 以上。

条件下发

在后台发布补丁脚本时可以选择条件下发,然后填入条件语句,只有满足条件的设备才会执行这个补丁脚本,条件语句由 key/value/运算符组成,示例:userId==10000876, iOS>9.0&&isMale==1

条件语句里用到的 key/value 需要事先在 APP 里通过 +setupUserData: 设置,支持设置多个字段,用 NSDictionary 表示,例如可以设置当前登录的用户ID以及性别:

//_userId = @"1000876"
//_isMale = @(1)
[JSPatch setupUserData:@{@"userId": _userId, @"isMale": _isMale}];

这样在下发脚本时填入条件 userId==1000876 后,这个脚本就只对这个用户生效,如果填入 isMale==0 则对这个用户不生效,对其他在 SDK 设置了 @"isMale": @"0" 的用户生效。

条件语句规则

  1. 支持符号 && || == != >= <= > <,意思跟程序里一样。
  2. 用比较符号时 >= <= > < 会把值转为数值进行对比。例如 userId>200000,即使客户端调用 +setupUserData: 接口时设置的 userId 字段是字符串,也会转为数值进行对比。
  3. 使用 == != 符号时,会以字符串形式判断是否相等,例如 1.0 == 1 结果是 NO。
  4. 等式的值不需要引号,字符串也不需要,例如:location!=guangdong
  5. 支持多个条件,例如:userId!=31242&&location==guangdong&&name==bang
  6. 若多个条件里同时有 &&||&& 的优先级较高。例如 userId<200000||location==guangdong&&name==bang,会先分别计算 userId<200000location==guangdong&&name==bang 的结果,再进行 || 运算。

条件更新规则

在发布脚本时用条件下发后,发布后可以不断修改条件,但在之前已经命中了条件执行了脚本的设备,不会因为修改条件后变为不命中,也就是说已经命中过条件执行了脚本的设备,不会再被条件的更新影响。举个例子:

在发布脚本1时设条件为 userId==1000876,某设备A设置了 @{@"userId": @"1000876"} 命中了这个条件,执行了这个脚本1。设备B设置了 @{@"userId": @"2000876"} 没有命中。

接着在后台修改条件为 userId>=2000000 ,设备A并不符合这个条件,但因为之前的条件命中过,所以设备A不会再受这个改变影响,继续执行脚本1。设备B命中了这个条件,也执行了脚本1。

此外若想撤销条件全量发布,提交空条件即可。

内置信息

除了用户手动设置的 userData,SDK 里还内置了两个信息可供条件判断:iOSisPad,分别表示 iOS 版本号和是否iPad,不需要设置就可以拿这两个字段用于条件判断。

例如只针对 iOS8 的 iPad 下发,可以直接写这个条件:iOS>=8.0&&iOS<9.0&&isPad==1

注意 iOS 版本号只会精确到两位,例如 9.2.1 会记录成 9.2,iOS==9.2 会命中 9.2.x 版本。

不符合条件的设备

对于一个APP版本:

  1. 若第一次下发补丁,包含了条件值,不符合条件的设备补丁不会生效。

  2. 若非第一次下发补丁,上一个补丁版本是全量下发,不符合条件的设备会请求上一个版本补丁。

  3. 若非第一次下发补丁,上一个补丁版本非全量下发(灰度/条件/开发),不符合条件的设备若之前请求过补丁,会保留执行之前的补丁,若没有请求过补丁(新用户),不会请求到补丁。

注意事项

  1. +setupUserData: 接口要在 +sync: 接口之前调用。
  2. 对于 SDK 1.1 及以下版本会无视任何条件和灰度值,直接全量接收。
JSPatch.com © 2017 Github开源 | 联系我们 | 合作伙伴