Пользователь не выходит из системы при завершении работы приложения

#ios #swift #xcode

#iOS #swift #xcode

Вопрос:

Я создаю приложение для чата, однако, когда пользователь завершает работу приложения, хорошей практикой для меня является выход из системы этого пользователя и его удаление. Однако, когда пользователь завершает работу приложения, если я что-то печатаю, оно будет напечатано, однако, когда я помещаю код для выхода из системы пользователя, код, похоже, не выполняется, я не знаю почему!

Вот это код:

 func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        
        Auth.auth().currentUser?.delete(completion: { (error) in
            
            if error == nil {
                
                do{
                    try Auth.auth().signOut()
                    print("user has been logged out without problems!")
                    
                }catch{
                    print("there was an error when trying executing logout function")
                }
            }
        })
    }
    
    func applicationWillTerminate(_ application: UIApplication) {
        Auth.auth().currentUser?.delete(completion: { (error) in
            
            if error == nil {
                
                do{
                    try Auth.auth().signOut()
                    print("user has been logged out without problems!")
                    
                }catch{
                    print("there was an error when trying executing logout function")
                }
            }
        })
    }
  

любое решение для выполнения этого кода, когда пользователь завершает работу приложения?

Комментарии:

1. Как Auth.auth() регистрирует вход и выход пользователя?

2. @GarethPrice когда пользователь вводит свой адрес электронной почты, будет сгенерирован случайный пароль, и он войдет в систему, и эта функция работает с кнопкой без проблем, однако она не работает при завершении работы приложения, я не мог понять, почему

3. У вас не будет достаточно времени выполнения для выполнения сетевой операции. Вы не можете полагаться на то, что этот метод всегда вызывается в любом случае. Почему бы вам не сохранить вход пользователя во время выполнения? В качестве альтернативы просто попросите их повторно пройти проверку подлинности при запуске

4. @Paulw11 мое приложение основано на скорости, поэтому пользователю не нужно выполнять все эти шаги, просто имя пользователя, возраст и вход в систему напрямую, вам не нужно регистрироваться или что-то еще, в этом случае я буду судьей, чтобы убедиться, что пользователь выходит из системы при завершении работы приложения и переходит в автономный режим, когда приложениенаходится в фоновом режиме

5. К сожалению, я не думаю, что это то, чего вы сможете достичь исключительно на стороне приложения. Возможно, вам потребуется, чтобы ваше приложение отправляло на сервер сообщения «keep alive», а сервер показывал пользователям, что они находятся в автономном режиме, после нескольких пропущенных сохранений. Приложение может быть завершено пользователем без willTerminate вызова.

Ответ №1:

Я попытался стимулировать ваш код, и я заметил проблему.

Из того, что я могу сказать (возможно):

  1. Приложение не предоставляет время для завершения кода.
  2. Вы удаляете пользователя, а затем выходите из системы. Auth.auth().currentUser?.delete

Я попробовал этот код, и, похоже, он работает нормально без проблем:

     do{
        Auth.auth().currentUser?.delete(completion: nil)
        try Auth.auth().signOut()
        print("user has been logged out without problems!")
        
    }catch{
        print("there was an error when trying executing logout function")
    }