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

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

    谢谢!

    最佳答案

    由于您已经在考虑提供 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
    }
    

    关于c# - Windows 10 : differentiate between preinstalled app and downloaded app,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31044057/

    10-10 21:36