martes, 9 de abril de 2013

Error en CurrentApp.LoadListingInformationAsync() HRESULT: 0x801900CC

Amigos,

Como mucho de ustedes ya sabrán, en los últimos días hemos estado bastante ocupados tratando de certificar una aplicación que tenemos pronta hace ya un tiempo, sin éxito.

Luego de un ida y vuelta con los técnicos que certifican las aplicaciones del Windows Store, pudimos obtener el error que nos estaba impidiendo certificar nuestra aplicación.

El error surge cuando un intenta llamar a la función CurrentApp.LoadListingInformationAsync() sin estar conectado a Internet.

Es necesario controlar las excepciones de red lanzadas por CurrentApp.LoadListingInformationAsync, así la aplicación no se bloqueará cuando pase por el proceso de certificación y para que no se bloquee cuando un usuario intenta ejecutarla sin conectividad con el Store.

Si por algún motivo, no se obtener la información devuelta por la función anteriormente mencionada, nuestra aplicación aún debería poder funcionar en modo de prueba (trial), desactivando todas las opciones de compra dentro de la aplicación, ya que las mismas obviamente no se pueden completar sin estar conectados.

Los detalles de dicha implementación dependerán de su aplicación y de como tiene implementadas las compras en la misma.

Si caducó el periodo de prueba, la aplicación no se inicia, por lo que no es necesario pensar la lógica para ese caso en particular

Finalmente quiero comentarles que el ejemplo que uno se baja de Microsoft - Trial app and in-app purchase sample - carece de estos chequeos que mencionaba anteriormente
por lo que he decidido compartir con ustedes un código un poco mas completo (por lo menos en lo que tiene que ver con aplicaciones de prueba)

  935 private static async Task<bool> ChequearEstadoDeLaLicencia()
  936   {
  937       if (CurrentApp.LicenseInformation == null)
  938       {
  939           return false;
  940       }
  941 
  942       var hayInternet = HayConexionInternet();
  943 
  944       if (CurrentApp.LicenseInformation.IsActive)
  945       {
  946           try
  947           {
  948               if (hayInternet)
  949               {
  950                   var listing = await CurrentApp.LoadListingInformationAsync();
  951                   App.LicenciaPrecio = listing.FormattedPrice;
  952               }
  953           }
  954           catch (Exception ex)
  955           {
  956               MetroEventSource.Log.Error("MainPage.Xaml: Error en CurrentApp.LoadListingInformationAsync(). Detalle:" + ex.Message);
  957               hayInternet = false;
  958           }
  959 
  960           if (CurrentApp.LicenseInformation.IsTrial)
  961           {
  962               var licenciaDiasRestantesDeTrial = (CurrentApp.LicenseInformation.ExpirationDate - DateTime.Now).Days;
  963 
  964               if (licenciaDiasRestantesDeTrial <= 0)
  965               {
  966                   var apretoComprar = false;
  967                   var messageDialog = new MessageDialog("Your_trial_has_expired__Do_you_want_to_purchase_full_license");
  968                   if (hayInternet)
  969                   {
  970                       messageDialog.Commands.Add(new UICommand("Purchase", (command) =>; apretoComprar = true));   
  971                   }
  972                   messageDialog.Commands.Add(new UICommand("Close", (command) =>; { }));
  973                   await messageDialog.ShowAsync();
  974                   if (apretoComprar)
  975                   {
  976                       await ConvertirTrialToFull();
  977                   }
  978 
  979                   return false;
  980               }
  981               else
  982               {
  983                   var apretoComprar = false;
  984                   var messageDialog =
  985                       new MessageDialog(
  986                           "Thank_you_for_evaluating_Our_App__Your_license_will_expire_in"
  987                           + licenciaDiasRestantesDeTrial + " days." + Environment.NewLine
  988                           + "Do_you_want_to_purchase_full_license");
  989 
  990                   if (hayInternet)
  991                   {
  992                       messageDialog.Commands.Add(new UICommand("Purchase"), (command) =>; { apretoComprar = true; }));
  993                   }
  994                   messageDialog.Commands.Add(new UICommand("Continue_using_trial", (command) =>; { }));
  995                   await messageDialog.ShowAsync();
  996                   if (apretoComprar)
  997                   {
  998                       await ConvertirTrialToFull();
  999                       return false;
 1000                   }
 1001               }
 1002 
 1003           }
 1004           else
 1005           {
 1006               // Show the features that are available only with a full license.
 1007               return true;
 1008           }
 1009       }
 1010       else
 1011       {
 1012           // A license is inactive only when there's an error.
 1013           var messageDialog = new MessageDialog("Could_not_find_any_valid_license_for_Our_App__The_application_will_be_closed");
 1014           messageDialog.Commands.Add(new UICommand("Ok", (command) => { }));
 1015           await messageDialog.ShowAsync();
 1016           return false;
 1017       }
 1018 
 1019       return true;
 1020   }
 1021 
 1022 
 1023   public static bool HayConexionInternet()
 1024   {
 1025       ConnectionProfile connections = NetworkInformation.GetInternetConnectionProfile();
 1026       bool internet = connections != null && connections.GetNetworkConnectivityLevel() == NetworkConnectivityLevel.InternetAccess;
 1027       return internet;
 1028   }
 
 
Espero les sea de utilidad, hasta la próxima!

No hay comentarios:

Publicar un comentario