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