如果你 在合作伙伴中心 将应用配置为免费试用版,以便客户可以在试用期内免费使用你的应用,则可以通过排除或限制试用期内的某些功能来吸引客户升级到应用的完整版本。 确定在开始编码之前应限制哪些功能,然后确保应用仅在购买完整许可证时允许它们工作。 还可以在客户购买应用之前启用仅在试用期间显示的功能(如横幅或水印)。
本文介绍如何在 Windows.Services.Store 命名空间中使用 StoreContext 类的成员来确定用户是否有应用的试用许可证,并在应用运行时许可证的状态发生更改时收到通知。
注释
Windows.Services.Store 命名空间是在 Windows 10 版本 1607 中引入的,并且只能在面向 Windows 10 周年版(10.0; 版本 14393) 或更高版本的项目中使用,需在 Visual Studio 中构建。 如果你的应用面向早期版本的 Windows 10,则必须使用 Windows.ApplicationModel.Store 命名空间而不是 Windows.Services.Store 命名空间。 有关详细信息,请参阅 本文。
实施试用版指南
应用的当前许可证状态存储为 StoreAppLicense 类的属性。 通常,将依赖于许可证状态的函数放在条件块中,如下一步中所述。 在考虑这些功能时,请确保可以采用在所有许可证状态中正常工作的方式实现这些功能。
此外,确定在应用运行时如何处理应用许可证的更改。 试用应用程序可以是功能齐全的,但其中有应用内广告横幅,而付费版本则没有。 或者,试用应用可以禁用某些功能,或显示定期消息,要求用户购买它。
考虑你正在制定的应用类型,以及适合它的试用或过期策略。 对于游戏的试用版,良好的策略是限制用户可以玩的游戏内容量。 对于实用工具的试用版,可以考虑设置到期日期,或限制潜在买家可以使用的功能。
对于大多数非游戏应用,设置到期日期效果良好,因为用户可以很好地了解完整的应用。 下面是一些常见的过期方案以及用于处理它们的选项。
当应用运行 时,
试用版许可证过期 如果试用期在应用正在运行时过期,您的应用可以:
- 什么都不做。
- 向客户显示一条消息。
- 关闭。
- 提示客户购买应用。
最佳做法是显示一条消息,提示你购买应用,如果客户购买它,请继续启用所有功能。 如果用户决定不购买应用,请将其关闭或提醒他们定期购买应用。
试用许可证在应用启动 之前过期
如果试用在用户启动应用之前过期,则你的应用不会启动。 相反,用户会看到一个对话框,该对话框提供从应用商店购买应用的选项。
客户在应用运行时购买它
如果客户在应用运行时购买了你的应用,那么你的应用可以采取以下操作。
- 不执行任何操作,并让他们继续处于试用模式,直到重启应用。
- 感谢顾客的购买或展示一条信息。
- 静默地启用完全许可证功能(或取消仅限试用版的提示)。
请务必解释你的应用在免费试用期间和之后的行为方式,以便你的客户不会对你的应用的行为感到惊讶。 有关描述应用的详细信息,请参阅 创建应用说明。
先决条件
此示例具有以下先决条件:
- 适用于面向 Windows 10 周年纪念版(10.0;版本 14393)或更高版本的通用 Windows 平台 (UWP) 应用的 Visual Studio 项目。
- 已在合作伙伴中心创建了一个应用,该应用配置为 免费试用版,且此应用在应用商店中发布。 可以选择配置应用,以便在测试应用时无法在应用商店中发现它。 有关详细信息,请参阅我们的 测试指南。
此示例中的代码假定:
- 代码在 Page 上下文中运行,其中包含名为 的
workingProgressRing
,以及名为 的textBlock
。 这些对象分别用于指示异步操作的发生和显示输出消息。 - 代码文件中有一个 ,该文件使用 语句用于 Windows.Services.Store 命名空间.
- 该应用是一个单用户应用,仅在启动应用的用户的上下文中运行。 有关详细信息,请参阅 应用内购买和试用版。
注释
如果你有使用 Desktop Bridge的桌面应用程序,则可能需要添加本示例中未显示的其他代码来配置 StoreContext 对象。 有关详细信息,请参阅在使用桌面桥的桌面应用程序中使用的 StoreContext 类 。
代码示例
应用初始化时,获取应用的 StoreAppLicense 对象,并处理 OfflineLicensesChanged 事件,以便在应用运行时许可证更改时接收通知。 例如,如果试用期到期或客户通过应用商店购买应用,应用的许可证可能会更改。 许可证更改时,获取新许可证并相应地启用或禁用应用的一项功能。
此时,如果用户购买了应用,则最好向用户提供许可状态已更改的反馈。 如果这是您编写代码的方式,您可能需要要求用户重启应用。 但是,使这种过渡尽可能无缝和无痛。
private StoreContext context = null;
private StoreAppLicense appLicense = null;
// Call this while your app is initializing.
private async void InitializeLicense()
{
if (context == null)
{
context = StoreContext.GetDefault();
// If your app is a desktop app that uses the Desktop Bridge, you
// may need additional code to configure the StoreContext object.
// For more info, see https://aka.ms/storecontext-for-desktop.
}
workingProgressRing.IsActive = true;
appLicense = await context.GetAppLicenseAsync();
workingProgressRing.IsActive = false;
// Register for the licenced changed event.
context.OfflineLicensesChanged += context_OfflineLicensesChanged;
}
private async void context_OfflineLicensesChanged(StoreContext sender, object args)
{
// Reload the license.
workingProgressRing.IsActive = true;
appLicense = await context.GetAppLicenseAsync();
workingProgressRing.IsActive = false;
if (appLicense.IsActive)
{
if (appLicense.IsTrial)
{
textBlock.Text = $"This is the trial version. Expiration date: {appLicense.ExpirationDate}";
// Show the features that are available during trial only.
}
else
{
// Show the features that are available only with a full license.
}
}
}
有关完整的示例应用程序,请参阅 Store 示例。