我的一位客户与OEM达成了协议。他们的应用程序X将预装在许多笔记本电脑上。此应用程序将从Windows 10商店接收更新。此应用程序X还可以在Windows 10商店中下载给其他用户。只有使用预装版本的用户才能获得3个月的免费试用。
不幸的是,OEM没有提供任何设备ID,并且用户没有获得任何解锁代码用于他们的试用。我想出了以下最初的"解决方案":
当应用程序启动且版本为1.0.1.0时,它被识别为预先安装的版本,此时我可以进行服务器调用以将设备ID发送到客户端的服务器以识别该设备应用删除后。
我可以更新商店应用,而不会丢失任何预装应用程序的知识,因为我可以更新到1.0.1.0以下的任何版本。这意味着预安装版本不会被自动更新与商店版本覆盖(因为安装的版本号大于商店版本)。但是,如果在预安装的版本中检测到严重错误,我无法更新该应用程序或某类用户将无法获得免费试用。也就是说,在Windows 10之前尚未在设备上启动应用程序的用户使用新版本(例如1.0.1.1)更新应用程序。
这听起来不必要地复杂,我希望是这样。任何人都可以想到一种更简单的方法来区分预装和下载的版本是否万无一失?
谢谢!
答案 0 :(得分: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
}