He buscado por todas partes y no puedo averiguar cómo notificar a un usuario cuando un nuevo dispositivo inicia sesión en su cuenta. Estoy usando la autenticación de Firebase. Me gustaría configurar algún tipo de sistema de notificación o correo electrónico que le diga al usuario que alguien ha iniciado sesión en su cuenta desde un dispositivo diferente para que pueda saberlo por razones de seguridad.
¿Ideas?
Además, ¿cómo podría monitorear la información sobre qué dispositivo(s) están registrados en una cuenta específica? Por ejemplo, tal vez el usuario tenga curiosidad sobre cuántos dispositivos ha iniciado sesión en su cuenta, qué tipo de dispositivo son, cuál es el nombre de esos dispositivos y dónde están ubicados (ejemplo: San Antonio, Texas).
¿Ideas?
sí, puedes usar llavero para esta situación. Primero debe crear un ID único. Después de que pueda guardar en la base de datos uniqueId. Este valor cambiará si el usuario usa otro dispositivo. Estoy usando un marco de trabajo de terceros para los servicios de llavero. Puedes usar el marco. Es perfecto.
https://github.com/kishikawakatsumi/KeychainAccess
final class DeviceManager { static let shared = DeviceManager() private init() { } var uniqueDeviceId: String { get { let keychain = Keychain(service: KeyManager.keychainServiceName).accessibility(.always) if let deviceId = keychain[KeyManager.keychainDeviceIdKey] { return deviceId } let vendorId = UIDevice.current.identifierForVendor!.uuidString keychain[KeyManager.keychainDeviceIdKey] = vendorId return vendorId } } }Súper simple; tenga un campo en su documento de usuario que almacene un nombre de dispositivo junto con su estado.
Su aplicación observará este documento de usuarios y cuando algo cambie, todos los dispositivos de los usuarios serán notificados de ese cambio.
Déjame configurar esto; aquí hay una estructura básica de Firestore
users uid_0 userName: "Jay" devices: device_0: offline device_1: offlineCuando se inicie la aplicación, agregará un observador a este documento de usuario (usando el uid como documentId)
func observeUser() { let usersCollection = self.db.collection("users") usersCollection.document("uid_0").addSnapshotListener { (documentSnapshot, err) in guard let document = documentSnapshot else { print("Error fetching document: \(err!)") return } let device = document.get("devices") as! [String: String] print(device) } }Ahora, en el cierre de Firestore que se muestra arriba, si el dispositivo de un usuario cambia de estado, de fuera de línea a en línea, por ejemplo, envía todos los dispositivos a la consola. Tomará cualquier acción que sea necesaria cuando el dispositivo cambie de estado.
Tenga en cuenta que si se agrega un NUEVO dispositivo, ese evento también se activará, por lo que podría presentar un mensaje en la interfaz de usuario "¡Se agregó un nuevo dispositivo!"
Entonces, un código de prueba que alterna el estado del dispositivo_0 de fuera de línea a en línea. Tengo un clic de botón que hace self.status = !self.status y luego llama a la función toggleStatus
var status = false func toggleStatus() { var isOnline = "" if self.status == false { isOnline = "online" } else { isOnline = "offline" } let userCollection = self.db.collection("users") let thisDevice = "device_0" let devicesDict = [ "devices": [thisDevice: isOnline] //sets device_0 to offline or online ] let document = usersCollection.document("uid_0").setData(devicesDict, merge: true) }En pocas palabras, cuando un usuario se autentica con un dispositivo por primera vez, tal vez solicite un nombre de dispositivo, o cree uno a partir de la dirección mac del dispositivo o algo oculto. Ese nombre de dispositivo se almacena en el documento/dispositivos de los usuarios con su estado en línea.
El nombre del dispositivo también se almacenaría localmente, en los valores predeterminados del usuario, por ejemplo, por lo que se envía automáticamente a Firestore al iniciar sesión.
El resultado final aquí es que si los dispositivos de los usuarios cambian de estado; fuera de línea a en línea o viceversa, o se agrega o elimina cualquier dispositivo, todos los dispositivos reciben una notificación de ese evento.