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

Windows 10: differentiate between preinstalled app and downloaded app

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

遗憾的是,OEM 没有提供任何设备 ID,用户也没有获得任何解锁码来试用。我想出了以下初始 "solution":

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

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