跳到正文

软件授权心跳与离线验证

这两个设置都在“授权策略”中,但解决的是两件事:有网时多久联系服务器,以及联系不上时还能使用多久。

心跳间隔:多久验证一次

在“心跳请求间隔(秒)”中填写 600,SDK 就会在运行期间大约每 10 分钟发送一次心跳。每次成功都会取得最新的运行规则,并刷新本机授权缓存。

可填写 600–86400 秒。填写 0 会关闭定时心跳,应用仍可以主动调用验证或刷新。定时请求会增加 0–10% 的随机延迟,实际间隔不会低于 600 秒。

绑定设备且缓存有效时,启动会先恢复授权,再在后台联网刷新,关闭定时心跳时也会刷新。不允许离线或使用浮动席位时,启动必须等服务器确认。

离线时间:服务器联系不上时能用多久

“允许离线方式”有三种选择。它不会替你修改心跳间隔。

允许指定时长
例如填写 24 小时:从最近一次成功联网验证开始,签名缓存最多有效 24 小时。期间断网或服务器临时故障,软件可以继续用;超过这个时间后,需要成功联网验证。
不允许离线回退
启动必须成功联系服务器,请求失败时不会靠磁盘缓存放行。运行中取得的短期签名最多有效 max(10, 心跳间隔) 秒;应用需要持续验证并检查功能权限。
允许永久离线
已经取得的本机签名可以长期使用,网络失败时仍能检查权限。如果许可证本身只有 30 天,仍会在 30 天到期;永久离线不会把期限授权变成永久授权。

接口用 offline_mode 表示这三种选择,依次为 limited、none、permanent。指定时长时,offline_seconds 为 1–31536000 秒;另外两种方式填 0。

这几个组合会怎样运行?

心跳 / 离线设置实际行为
10 分钟 / 24 小时有网时每 10 分钟验证。断网后按最后一次成功验证的时间,最多继续使用 24 小时
10 分钟 / 永久离线仍然每 10 分钟尝试心跳,成功时更新规则;联系不上时继续使用有效签名
0 / 永久离线有有效缓存时,启动可直接使用,不定时发送请求。应用主动验证或刷新时仍会联系服务器
0 / 24 小时不定时心跳,但缓存仍会到期;应用要自行安排验证,不能靠关闭心跳延长离线时间

建议离线时间长于心跳间隔。如果设成“每小时心跳,但只允许离线 1 分钟”,签名会在下一次定时心跳前过期,应用必须另行验证。

修改策略后,旧许可证会更新吗?

会。保存授权策略时,服务器会在同一笔事务中把设备或席位上限、功能、功能次数、授权方式、维护期和版本限制同步到所有关联且未吊销的许可证。页面不需要再逐条勾选“应用策略”。

同步保留每份许可证自己的期限类型、有效天数、首次激活、到期时间、客户归属、已用次数和单独延长的维护期。策略的期限类型只用于以后签发的新许可证,不会把已有的 30 天许可证改成永久许可证。

如果切换设备绑定与浮动席位时仍有活跃设备或会话,或者新上限低于当前占用量,保存会返回 ACTIVE_DEVICES_CONFLICT,策略和所有关联许可证都不会发生部分更新。先释放冲突设备,再重新保存。

保存成功后,关联的旧许可证和新许可证都在下一次成功激活、验证或心跳时采用新规则,SDK 用新签名替换缓存。相同 Idempotency-Key 的重试仍会返回原来那次请求的结果。

持续断网的设备暂时不知道规则变了,仍按已有签名使用。仅仅接上网络也不会自动改写缓存,要有一次成功的请求。应用可以在网络恢复时主动刷新。

“应用策略”仍有一个用途。

需要把选中的许可证改为另一份策略时,在许可证页面勾选记录并使用“应用策略”预览迁移。编辑许可证当前已经关联的策略时,直接保存即可自动同步。

主动联网刷新

下面的方法始终尝试联系服务器,包括“永久离线 + 关闭心跳”的情况。成功后更新签名;网络失败会报刷新失败,同时保留仍允许使用的旧缓存;明确被吊销或释放时清除缓存。

语言调用方式
Goclient.RefreshOnline(ctx)
Javaclient.refreshOnline()
Cln_refresh_online(client)
C++client.RefreshOnline()
C#await client.RefreshOnline()
Pythonclient.refresh_online()
JavaScriptawait client.refreshOnline()

刷新成功计一次激活 API 请求。如果刚更新的策略开启了原来关闭的心跳,再调用对应语言的 StartHeartbeat 启动调度。持续离线时,设备也无法收到吊销或释放通知。