【发布时间】:2012-07-26 10:40:18
【问题描述】:
Google 在其License Verification Library 中提供的默认ServerManagedPolicy 依赖于服务器响应来确定许可证重新验证间隔。这导致需要永久每隔几天重新验证一次。这不仅会给用户带来麻烦,对于长时间没有连接的用户来说,这可能是一个严重的问题。 (我们刚刚收到一位用户的询问,该用户预计将在几周内没有互联网连接,这就是提出这个问题的原因。)
总之,我正在寻找一种能够完成两件事的算法:
- 与
ServerManagedPolicy相比,大大降低了连接要求; - 提供相同级别的反盗版保护。
在对this question 的回答中,建议的策略算法是忽略 Google 服务器响应中提供的时间,而是使用大约一个月的 LICENSED 到期期限,每隔几天尝试一次许可证检查(以延长如果收到 LICENSED 响应,则为有效期)。
虽然这种方法部分实现了第一个目标,但它仍然要求用户在使用该应用程序时每月连接一次,因此它不适用于我们的(至少一个)用户。
以下算法实现了第一个目标,但我不知道第二个目标。任何指出该算法弱点的 cmets 或其他方法的建议都将受到欢迎。
- 首次运行时,请进行许可证检查并坚持在提供完整功能之前做出 LICENSED 响应。收到后,设置一个相对较短的到期期限(但比 Google Play 提供的退款期限长,目前为 15 分钟)。在此之后还要注册几天的宽限期。
- 应用程序将在许可证到期后再次开始检查。如果连接失败(飞行模式等),在宽限期到期之前,它仍然可以运行。
- 在宽限期到期后,坚持第二次 LICENSED 响应,然后再允许应用正常运行。
- 在收到第二个 LICENSED 响应后,永久启用该应用的所有功能,再也不用检查了。
- 如果在任何时候收到 UNLICENSED 响应,请永久禁用全部功能。 (当然,用户可以通过删除所有应用数据恢复到第 1 步。)
补充点:
- 建议放弃第一次许可证检查,等到返回期限到期后再进行许可证检查。坚持第一个 LICENSED 响应的目的是防止在许可证检查失败后用户简单地停止应用程序进程、清除应用程序数据并重新启动应用程序的漏洞利用。 (即使一次只能使用 15 分钟,该应用也能提供价值。)
- 坚持第二个 LICENSED 响应的目的是绕过购买-运行-备份-退货-恢复漏洞。
- 我不是在问回调许可证检查是否是一个好主意(这就是 Google 提供的替代其已弃用的复制保护机制的方法)。我也很清楚,没有任何反盗版保护是万无一失的,谷歌的整个许可机制都可以被规避(在这种情况下,所有关于策略算法设计的问题都无关紧要)。这个问题的重点是上述算法的相对风险(对我们)和收益(对用户)与其他策略相比(例如
ServerManagedPolicy)。
【问题讨论】:
-
从“已购买,仍需要验证”到“已购买,不再需要验证”的“不可见”过渡存在问题。您需要在应用程序的某处反映这一点,即使只是在某些设置对话框中。 (许可证:某处的临时许可证,如果在“返回窗口”关闭后单击会强制检查立即,如果“太早”无法获得永久许可证,则会生成错误消息。一旦验证第二时间(自动或手动),变为许可证:永久。)
-
@Yakk - 我不确定你看到了什么问题。是否需要让用户控制第二次检查的时间?
-
所以有人购买了你的产品,知道它“离线工作”。然后他们下载它,运行它,它可以工作。接下来,他们失去了连接(没有数据,无论出于何种原因wifi关闭)。 3 天后,他们的应用程序停止工作,几乎没有诊断。关键是能够说“应用程序离线工作一旦它说永久许可”。对于您的客户来说,这(显然)是一个重要的状态更改:让客户看到该状态更改非常重要。
-
@Yakk - 啊,我明白你的意思了。客户体验至关重要,因此该政策仍需要进行一些调整。我问这个问题已经三年了,我们实际上采用了一种变体,基本上客户永远不会看到任何不愉快的事情,除非应用程序得到明确的 NOT_LICENSED(或类似)响应。特别是,在第一次许可证检查之后,无法与服务器通信永远不会影响用户。这很容易受到“始终离线运行此应用”的攻击,但由于我们应用的性质,我们认为这是一个可接受的风险。
-
我建议您不要“永久禁用所有功能”,而应该只发出一个坚持付款和注册的弹出窗口。您的目标并不是真正阻止使用,而是收取收入。
标签: android algorithm google-play android-lvl access-rights