我的一位客户与 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)更新应用程序之前尚未在设备上启动应用程序的用户。
这一切听起来都不必要地复杂,我希望是这样。谁能想到一种更简单的方法来区分万无一失的预装版本和下载版本?
谢谢!
最佳答案
由于您已经在考虑提供 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/