domingo, 12 de abril de 2020

Xamarin.Forms - Administrar sesión de usuario

Hola que tal a todos, espero estén de lo mejor. Hoy quiero compartirles un ejemplo practico acerca de la administración de sesión de usuario al ingresar a una aplicación móvil.

Este post o artículo es parte de la implementación de la aplicación DÍAbetes que se viene elaborando. Todas las pruebas se viene realizando en un equipo móvil físico con Sistema Operativo Android, esto no restringe el uso de emuladores, además recordar que sólo se viene implementado por ahora los ejemplos prácticos para la plataforma de Android.

Requisitos:
Microsoft Visual Studio Community 2019.
Xamarin.Froms - XAML.
SQLite - Gestión de datos local.

Iniciamos agregando una propiedad para definir y almacenar el estado de la aplicación y persistirá en todo el código de la aplicación, es decir el valor se conservará en el dispositivo cuando la aplicación está en pausa o apagada y haremos uso de 2 propiedades (IsLoggedIn keyEmail) a nivel de aplicación que será creadas en diferentes momento.

Desarrollo de código:
Abrimos el archivo App.xaml.cs y agregamos la propiedad Properties["IsLoggedIn"] e inicializamos en false (propiedad que cambiará el valor a true cuando se ingresa a la aplicación):

        public static NavigationPage Mainpage;
       
        public App()
        {
            InitializeComponent();

            Properties["IsLoggedIn"] = false;
            MainPage = new MainPage();
            MainPage = new NavigationPage(new MainPage())
            {
                BarBackgroundColor = Color.FromHex("#3399ff")
            };

        }

Ahora abrimos el archivo Login.xaml.cs y adicionaremos la propiedad de nombre keyEmail donde le pasaremos el valor del email del usuario Application.Current.Properties["keyEmail"] = userNameEntry.Text.Trim(); (en mi caso estoy considerando como un valor único el email, con la cual realizare todas mis validaciones) y asignamos el valor true a la propiedad IsLoggedIn (es decir estamos activando los valores de la sesión de acceso a la aplicación) Application.Current.Properties["IsLoggedIn"] = true;

        /// <summary>
        /// Botón para ingresar a la pantalla principal de la app
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void loging_Clicked(object sender, EventArgs e)
        {
            if (await ValidateForm())
            {
             
                IEnumerable<User> result = userData.whereUser(userNameEntry.Text.Trim(), passwordEntry.Text.Trim());

                if (result.Count() == 0)
                {
                    await DisplayAlert("Alerta", "Email o Password Incorrectos.", "OK");
                }
                else if (result.Count() == 1)
                {
                    Application.Current.Properties["keyEmail"] = userNameEntry.Text.Trim();
                    Application.Current.Properties["IsLoggedIn"] = true;

                    await Navigation.PushAsync(new PageMain());
                }
                else if (result.Count() >= 1)
                {
                    await DisplayAlert("Alerta", "Existe más de una cuenta registrada, favor de solicitar la correción de la cuenta.", "OK");
                }
            }
        }

Seguidamente agregaremos una clase utilitario e implementar nuestros métodos que administra nuestra sesión de cada usuario, para la cual creamos un directorio de nombre Utility y agregamos una nueva clase en el mencionado directorio, asignamos el nombre de LoginAccess a la nueva clase y dentro de ella se crea los siguiente métodos:

LoginAccess(string pstrEmailUser) Encargado de asignar un valor a la propiedad keyEmail (propiedad que creada al iniciar la sesión - se encuentra en el método del login).

AuthentifyLogin() método encargado de retornar el valor de la propiedad keyEmail después de iniciar la sesión (valor que persistirá durante todo el ciclo de vida de nuestra aplicación).

LogoutLogin() encargado de limpiar las propiedades que administrar la sesión de la aplicación.

using Xamarin.Forms;

namespace AppDIAbetes.Utility
{
    public class LoginAccess
    {
        public static string sstrEmail = "";
        public LoginAccess(string pstrEmailUser)
        {

            if (Application.Current.Properties.ContainsKey("keyEmail"))
            {
                var vKeyEmail = Application.Current.Properties["keyEmail"];
                sstrEmail = vKeyEmail.ToString();
            }
        }
        public string AuthentifyLogin()
        {
            return sstrEmail;
        }

        public void LogoutLogin()
        {
      Application.Current.Properties["IsLoggedIn"] = false; 
      Application.Current.Properties["keyEmail"] = null;
        }
    }

}

Y para finalizar abrimos el archivo PageMain.xaml.cs (corresponde a la publicación de Crear Menú Hamburguesa) y adicionaremos las siguiente instrucciones para poder obtener lo valores asignados a las propiedades IsLoggedIn keyEmail desde el login:

1. Referenciamos e invocamos al método LoginAccess(sstrEmailUser); para pasar el valor del email del usuario, y luego pasarlo a la propiedad labelEmail.Text = strAuthentifyUser

        private string strAuthentifyUser;
        public static string sstrEmailUser;
        LoginAccess OAuthLogin = new LoginAccess(sstrEmailUser);

        public PageMain()
        {
     strAuthentifyUser = OAuthLogin.AuthentifyLogin();                  
     InitializeComponent();
            labelEmail.Text = strAuthentifyUser

            NavigationPage.SetHasNavigationBar(this, false);
            myPageMain();

        }

2. Para cerrar la sesión invocamos al método OAuthLogin.LogoutLogin(); desde la opción cerrar sessión del menú de nuestra aplicación.

        private async void OnListItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            var option = e.SelectedItem as Option;
            if (option.page != null)
            {               
                IsPresented = false;
                Detail = new NavigationPage(option.page);
            }
            else if (option.page == null || option.title == "Cerrar Sesión") {

                var result = await DisplayAlert("Confirmar", "Estas seguro de cerrar sesión", "SI", "NO");
                if (result)
                {
                    OAuthLogin.LogoutLogin();
                    await Navigation.PushAsync(new MainPage());
                }
                else
                {
                    return;
                }
            }

        }

Resultado:
Al finalizar la edición de esté post ya se cuenta con las siguiente interfaces desarrolladas.

   

   

Gratitud a Dios 😊 y gracias a todos ustedes por la acogida de este nuevo artículo, éxitos y bendiciones 🙏 y un gran abrazo a todos ✌...!!!

0 comentarios :