我的耐用应用内购买存在问题。出于测试目的,我已将我的应用的高级试用版IAP设置为在一天后过期。我从https://msdn.microsoft.com/en-gb/windows/uwp/monetize/get-license-info-for-apps-and-add-ons复制了以下代码以获取应用的许可证信息:
private StoreContext context = null;
private async Task<bool> getLicenseInfo()
{
try
{
if (context == null)
{
context = StoreContext.GetDefault();
}
StoreAppLicense appLicense = await context.GetAppLicenseAsync();
// license wasn't retrieved, for example because user is offline, so..
// need to fallback on non-premium version
if (appLicense == null)
{
return false;
}
// iterate through the add on licenses for add-ons for this app.
foreach (KeyValuePair<string, StoreLicense> item in appLicense.AddOnLicenses)
{
StoreLicense addOnLicense = item.Value;
if (addOnLicense.InAppOfferToken.Equals("test1_premium"))
Windows.Storage.ApplicationData.Current.RoamingSettings.Values["PremiumPurchased"] = addOnLicense.IsActive;
else if (addOnLicense.InAppOfferToken.Equals("test1_premiumTrial"))
Windows.Storage.ApplicationData.Current.RoamingSettings.Values["PremiumTrialActive"] = addOnLicense.IsActive;
}
return true;
}
catch( Exception e )
{
return false;
}
}
在购买高级试用版IAP后的24小时内,高级试用版IAP将在appLicense.AddOnLicenses中返回,并在正确的到期时间内正确设置为活动状态。但是,大约一天后(我不是100%),appLicense.AddOnLicenses不再包含IAP记录(因此未输入循环,导致RoamingSetting的值表示IAP的活动状态没有更新,以反映它可能已过期,即错误)。
事实上IAP对我有一个isActive属性表明IAP甚至在它们过期之后仍应保留appLicense.AddOnLicenses中的记录,尽管isActive设置为false。然而,我所看到的可能会暗示其他情况。有人可以就此提供任何澄清吗?如果确认过期的IAP确实删除了其记录,那么它将是直截了当的 - 如果没有找到记录,只需将IAP的RoamingSetting设置为false。但是,我有一种感觉,这里可能需要一个不同的解决方案。
答案 0 :(得分:0)
我可以确认过期的IAP会在我的应用中删除其记录,这样我们就需要做一些记录,就像你说使用RoamingSetting检查IAP是否过期一样。
此外,我会咨询相关团队,看看它是否是预期的行为。
另一种解决方法是使用Windows.ApplicationModel.Store命名空间实现IAP,我们可以使用以下方法检查IAP的到期日期:
LicenseInformation licenseInformation = CurrentApp.LicenseInformation;
if(licenseInformation.ProductLicenses[productId].IsActive)
{
var productLicense1 = licenseInformation.ProductLicenses[productId];
var longdateTemplate = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("longdate");
MyExpireDataTextBlock.Text = "ExpirationDate" + longdateTemplate.Format(productLicense1.ExpirationDate) + ". remain days: " + (productLicense1.ExpirationDate - DateTime.Now).Days;
}
else
{
}