Integración Nativa en iOS 18
Diseño de Apps iOS: Integración de Funciones Nativas
Animaciones de Transiciones en iOS 18: Uso de Efecto Zoom
Funcionalidades avanzadas de Scroll View en SwiftUI para iOS 18
Animaciones de Símbolos en SwiftUI: Efectos y Transiciones
Geometry Changes
Animaciones con Timeline View en Swift para iOS
Animación de Texto con Google Text en Aplicaciones
Degradados avanzados con MeshGradient en iOS 18
Graficación de funciones matemáticas con Charts en iOS 18
Interacción con el Usuario y el Sistema Operativo
Creación de Widgets en iOS con Xcode
Live Activities en Dynamic Island: Estado de Entrega de Producto
Automatización con App Intents en iOS
Voice Over en iOS: Mejorando la Accesibilidad de Aplicaciones
UIKit en SwiftUI
Multimedia y Medios Visuales
Acceso y manipulación de cámara en iOS nativamente
Acceso a Fotos en iOS con PhotosUI: Manejo de Galería y Selección
Reproducción de Audio y Video con AVKit y AVFoundation en iOS
Gráficos y Sensores
Gráficos con Metal y Swift: Crear Forma Geométrica en iOS
Manejo del Acelerómetro en Aplicaciones iOS
Salud y Bienestar
Cuenta Pasos con HealthKit de iOS
Mapas y Geolocalización
Mapas Interactivos en iOS: Uso Avanzado de MapKit
Implementación de Funciones de Localización en SwiftUI
Notificaciones y Autenticación
Notificaciones locales en iOS: implementación y permisos
Autenticación Face ID en iOS: Implementación Práctica
Implementación de Passkeys para Autenticación Segura en iOS
Autenticación con Apple en SwiftUI: Implementación Paso a Paso
Gestión de Datos y Almacenamiento
Persistencia de Datos en Swift: Uso de SwiftData para Apps iOS
Manejo seguro de contraseñas con Keychain en iOS
Optimización de Aplicaciones iOS con Instruments de Xcode
Fundamentos de Apps Inmersivas
Simulador para Aplicaciones en visionOS con Apple Vision Pro
Estrategias para el Futuro
Uso de SwiftUI y UIKit para Apps iOS Modernas
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Almacenar información sensible de manera local y segura es esencial en el desarrollo de aplicaciones. Aquí es donde entra el concepto de "Keychain". Este mecanismo te permite guardar información en un formato clave-valor, generalmente encriptada, ideal para manejar inicios de sesión, contraseñas y cualquier otro dato que necesite protección adicional. En resumen, los Keychains son fundamentales para mantener segura tu aplicación.
En el proyecto de ejemplo, tenemos una vista con un diseño básico que incluye botones para guardar, listar y eliminar tokens, además de un área donde se muestran estos tokens. Sin embargo, para gestionar estos tokens, necesitamos una clase específica, conocida como "KeyChainManager".
La gestión de Keychain comienza con la creación de una clase llamada KeyChainManager
. Esta clase utiliza Foundation
, una herramienta que proporciona las clases necesarias para trabajar con Keychains. Lo primero que debes hacer es crear una instancia compartida para acceder a la clase desde cualquier parte de la aplicación.
import Foundation
class KeyChainManager {
static let shared = KeyChainManager()
// Aquí se define la clase y los métodos que necesitas
}
Una vez tenemos la instancia compartida, necesitamos crear funciones para guardar, obtener y eliminar datos en el Keychain.
Función para guardar datos: Se necesita una clave y un valor, ambos en formato String
. La función devuelve un booleano que indica si la operación fue exitosa.
Conversión a formato UTF-8: El valor que ingresa se debe convertir a este formato para poder ser encriptado y almacenado.
Creación de un diccionario de consulta: Define parámetros como el tipo de dato que se está guardando, en este caso, una contraseña genérica, utilizando kSecClassGenericPassword
.
Agregando el valor al Keychain:
var query: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecValueData as String: data]
Verifica existencia previa: Si ya hay un valor almacenado con la misma clave, es necesario eliminarlo antes de agregar el nuevo.
Guardar el nuevo valor: Usa SecItemAdd
para añadir el elemento al Keychain.
Para recuperar valores, se define un nuevo diccionario de consulta, especificando el tipo de dato y la clave buscada. La función busca devolver el valor en formato String
.
var query: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecReturnData as String: kCFBooleanTrue!,
kSecMatchLimit as String: kSecMatchLimitOne]
La eliminación de un valor es similar a la obtención. Envía los parámetros del diccionario de consulta para identificar cuál es el elemento que se quiere eliminar.
El diseño básico interactúa con el usuario para almacenar, listar o eliminar tokens:
Variables de Estado: Se crean variables de estado para manejar el token actual, el token introducido por el usuario y la lista de claves almacenadas.
Interfaz Gráfica:
TextField
donde se ingresa el token.Acciones de los Botones:
UUID
.Este tipo de implementación no solo es un ejercicio práctico de programación, sino también un ejemplo de buenas prácticas para gestionar datos sensibles en tus aplicaciones.
Aportes 0
Preguntas 0
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?