4

我的一位客户与 OEM 达成了交易。他们的应用 X 将预装在许多笔记本电脑上。此应用将接收来自 Windows 10 商店的更新。此应用 X 也可以在 Windows 10 商店中下载给其他用户。只有使用预装版本的用户才能获得 3 个月的免费试用。

不幸的是,OEM 没有提供任何设备 ID,用户也没有获得任何用于试用的解锁代码。我想出了以下最初的“解决方案”:

  • 为预安装的应用程序使用版本 1.0.1.0。
  • 将 1.0.0.0 上传到商店。

当应用程序启动并且版本为 1.0.1.0 时,它被识别为预装版本,此时我可以进行服务器调用以将设备 ID 发送到客户端的服务器以识别此设备,即使在应用程序删除后也是如此。

我可以更新商店应用程序而不会丢失任何预装应用程序的知识,因为我可以更新到 1.0.1.0 以下的任何版本。这意味着预安装的版本不会被商店版本的自动更新覆盖(因为安装的版本号大于商店版本)。但是,如果在预装版本中检测到严重错误,我将无法更新该应用程序,否则某些类别的用户将无法获得免费试用。即在 Windows 10 之前尚未在设备上启动应用程序的用户将应用程序更新为新版本(例如 1.0.1.1)。

这一切听起来都不必要地复杂,我希望是这样。谁能想到一种更简单的方法来区分万无一失的预装版本和下载版本?

谢谢!

4

1 回答 1

1

由于您已经在考虑提供 2 个不同的版本,这可能是一个更好的解决方案,您可以在其中部署两倍的版本1.0.0.0

不要使用版本来区分状态,而是使用构建符号。创建两个不同的版本,一个用于您的 OEM 客户端,一个用于商店部署。

对于要允许试用的 OEM,请使用以下内容 - 作为示例:

private bool CanUseTrial()
{
#if OEM
    return true;
#else
    return false;
#endif
}

这样做可以让您为所有客户端维护相同的代码库,但在案例 OEM 和案例商店部署之间有所不同,不需要太多逻辑。

编辑#1:

要解决 OEM 客户端更新为非 OEM 客户端的问题,您仍然可以采用这种方法(只要应用程序至少作为 #OEM 构建运行一次):

private async Task<bool> CanUseTrial()
{
    var clientCode = GenerateClientCode(); // However you're going to do this

#if OEM        
    WebServiceXyz.RegisterOemClient(clientCode);
    return true;
#else
    try
    {
        return await WebServiceXyz.IsRegisteredOemClient(clientCode);
    }
    catch
    {
        return false;
    }
#endif
}
于 2015-06-25T07:48:11.893 回答