Windows 10:区分预装应用程序和下载应用程序

本文关键字:应用程序 下载 Windows | 更新日期: 2023-09-27 17:59:30

我的一个客户与一家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)之前,尚未在设备上启动该应用程序的用户。

这一切听起来不必要地复杂,我希望是这样。有人能想出一种更简单的方法来区分预装版和下载版吗?

谢谢!

Windows 10:区分预装应用程序和下载应用程序

因为您已经在考虑提供两个不同的版本,所以这个版本可能是更好的解决方案,您可以部署两倍于版本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
}