0

我们想为我们的产品 (C++) 添加自动更新或更新通知。

更新应该是基于订阅的:

  • 用户购买订阅 1 年的更新
  • 订阅到期时,不再提供更新。

有人可以建议实施此类服务的软件或提供商吗?

我发现了一些自动更新的例子,但它们在时间上都是无限的。

此服务必须在每个用户的基础上进行限制,并允许扩展。

4

1 回答 1

1

就成分而言,您需要的是:

  • 一种下载更新的方法 - 我建议使用 HTTP(S)
  • 一种对许可证进行编码的方法,包括您有权获得什么样的更新以及您有权获得它多长时间。理想情况下,这对用户来说是不透明的,但在两端都很容易验证(因此可以将错误的条目通知给用户,而无需联系服务器)
  • 一种了解更新是否可用以及何时再次检查的简单方法

我的建议是使用可嵌入的 HTTP 客户端(例如(无耻的插件)Arachnida)使用简单的 API 定义一个简单的 XML over HTTP 服务,例如:

class UpdateAgent
{
/* boilerplate */
public :
    /* set the key to use. Throws an InvalidKey exception if not valid
     * validity is checked locally - no HTTP queries are used.
     * Key may have been invalidated on the server without notification
     * at this point */
    void setKey(const std::string &key);
    // Get the key currently set
    std::string getKey() const;
    /* using a synchronous HTTPS query, check with the server if updates are
     * available for the current key. Throws on error: one of the QueryError
     * subclasses if there has been a query error, or InvalidKey is the
     * key is either not set or is not valid (i.e. invalidated server-side) */
    bool isUpdateAvailable() const;
/* etc. */
};

如上所示,它们的密钥本身将是一个字符串,通过其编码,将包含某种关于其有效性的信息——例如,某种 CRC 以了解输入的字符串是否有效。密钥的其余部分 - 包括其到期日期 - 可以在服务器端进行管理,尽管到期信息也可以编码在密钥本身中(但这意味着如果用户延长许可证,则需要更改密钥)。

至于服务器端,当出现密钥和更新请求时,服务器会

  1. 检查密钥的有效性
  2. 检查密钥所用的软件是否有可用的更新(信息可能是也可能不是密钥本身的一部分,具体取决于您是要在数据库中管理它还是希望它成为许可证密钥的一部分)
  3. 将文件复制或硬链接到可以下载的位置,具有唯一且难以猜测的名称
  4. 向客户端提供下载的 URL - 例如在为 HTTP 请求返回的 XML 流中
  5. 在文件未下载 N 秒/分钟/小时后开始超时以删除文件
  6. 客户端下载文件后删除该文件

如果下载失败,可以重新启动或再次请求。如果您想对单个下载收费,则需要客户端确认下载成功 - 或在失败时报告错误 - 这样您就不会重复计算单个下载。

当然,这一切都在我的脑海中——可能有一些我没有想到的细节。每种成分都很容易获得。SourceForge 上提供了 Arachnida 的开源版本,如果您需要,我有一些代码可以对许可证密钥进行编码(用于我的另一个产品),但我相信如果您不想这样做,您可以编写用我的。

您可能需要考虑的一些事情是对您的客户端进行安全身份验证 - 因此它们不会共享许可证密钥 - 保护您的 HTTP 连接,这样您就不会最终将您的更新发布到世界等。无论是服务器还是客户端需要非常复杂的实现,因为大多数构建块已经存在。

高温高压

rlc

于 2011-03-24T01:09:36.887 回答