Tengo un problema con mis compras duraderas dentro de la aplicación. Para fines de prueba, configuré el IAP de prueba premium para que mi aplicación caduque después de un día. Copié el siguiente código de https://msdn.microsoft.com/en-gb/windows/uwp/monetize/get-license-info-for-apps-and-add-ons para obtener la información de licencia de la aplicación:

    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;
        }
    }

Durante las 24 horas posteriores a la compra del IAP de prueba premium, el IAP de prueba premium se devuelve en appLicense.AddOnLicenses y se configura correctamente como activo con el tiempo de vencimiento correcto. Sin embargo, después de aproximadamente un día (no estoy al 100%), appLicense.AddOnLicenses ya no contiene un registro para el IAP (por lo que el bucle no se ingresa, lo que da como resultado el valor de RoamingSetting para indicar el estado activo del IAP no se actualiza para reflejar que puede haber caducado, es decir, falso).

El hecho de que los IAP tengan una propiedad isActive para mí sugiere que los IAP, incluso después de que hayan expirado, deberían conservar un registro en appLicense.AddOnLicenses, aunque con isActive establecido en falso. Sin embargo, lo que estoy viendo puede sugerir lo contrario. ¿Alguien puede proporcionar alguna aclaración sobre esto? Si se confirma que un IAP vencido tiene su registro eliminado, entonces será sencillo: simplemente configure el RoamingSetting del IAP en falso si no se encontró ningún registro. Sin embargo, tengo la sensación de que algo más está sucediendo aquí que puede requerir una solución diferente.

1
Barrrdi 9 dic. 2016 a las 20:16
Ahora puedo confirmar que la AddOnLicense de IAP se elimina exactamente 1 minuto después de su fecha de vencimiento. ¿Es este comportamiento previsto?
 – 
Barrrdi
10 dic. 2016 a las 20:24
Estoy probando esto y la aplicación tardará entre 1 y 2 días en caducar, si tengo alguna información de actualización, la publicaré aquí.
 – 
Cherry Bu - MSFT
13 dic. 2016 a las 12:52
Microsoft cambió su documentación para que se ajuste a la realidad: docs.microsoft.com/en-us/windows/uwp/monetize/…
 – 
Javert
15 dic. 2017 a las 14:30

1 respuesta

La mejor respuesta

Puedo confirmar que el IAP caducado tendrá su registro eliminado en mi aplicación, de esta manera necesitamos hacer algunos registros como dijiste usando RoamingSetting para verificar si el IAP caducó o no.

Además, consultaré al equipo relacionado para ver si es un comportamiento esperado.

Otra solución es implementar el IAP mediante Windows.ApplicationModel.Store espacio de nombres y podemos usar el siguiente método para verificar la fecha de vencimiento del 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
   {

   }
0
Amy Peng - MSFT 23 dic. 2016 a las 05:25