灰度与条件下发
从 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"
的用户生效。
条件语句规则
- 支持符号
&&
||
==
!=
>=
<=
>
<
,意思跟程序里一样。 - 用比较符号时
>=
<=
>
<
会把值转为数值进行对比。例如userId>200000
,即使客户端调用+setupUserData:
接口时设置的 userId 字段是字符串,也会转为数值进行对比。 - 使用
==
!=
符号时,会以字符串形式判断是否相等,例如1.0 == 1
结果是 NO。 - 等式的值不需要引号,字符串也不需要,例如:
location!=guangdong
- 支持多个条件,例如:
userId!=31242&&location==guangdong&&name==bang
- 若多个条件里同时有
&&
和||
,&&
的优先级较高。例如userId<200000||location==guangdong&&name==bang
,会先分别计算userId<200000
和location==guangdong&&name==bang
的结果,再进行||
运算。
条件更新规则
在发布脚本时用条件下发后,发布后可以不断修改条件,但在之前已经命中了条件执行了脚本的设备,不会因为修改条件后变为不命中,也就是说已经命中过条件执行了脚本的设备,不会再被条件的更新影响。举个例子:
在发布脚本1时设条件为 userId==1000876
,某设备A设置了 @{@"userId": @"1000876"}
命中了这个条件,执行了这个脚本1。设备B设置了 @{@"userId": @"2000876"}
没有命中。
接着在后台修改条件为 userId>=2000000
,设备A并不符合这个条件,但因为之前的条件命中过,所以设备A不会再受这个改变影响,继续执行脚本1。设备B命中了这个条件,也执行了脚本1。
此外若想撤销条件全量发布,提交空条件即可。
内置信息
除了用户手动设置的 userData,SDK 里还内置了两个信息可供条件判断:iOS
和 isPad
,分别表示 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版本:
-
若第一次下发补丁,包含了条件值,不符合条件的设备补丁不会生效。
-
若非第一次下发补丁,上一个补丁版本是全量下发,不符合条件的设备会请求上一个版本补丁。
- 若非第一次下发补丁,上一个补丁版本非全量下发(灰度/条件/开发),不符合条件的设备若之前请求过补丁,会保留执行之前的补丁,若没有请求过补丁(新用户),不会请求到补丁。
注意事项
+setupUserData:
接口要在+sync:
接口之前调用。- 对于
SDK 1.1
及以下版本会无视任何条件和灰度值,直接全量接收。