Пользовательские значения по умолчанию, изменяющиеся на предыдущие значения через некоторое время - Swift - PullRequest
2 голосов
/ 20 февраля 2020

Пожалуйста, не отмечайте мой вопрос дубликатом. Перешли по следующим ссылкам и попробовали то, что они упомянули, но не повезло.

UserDefaults в IOS 10 иногда показывает старое значение

Пользовательские значения по умолчанию, переходящие к предыдущим значениям на первый взгляд случайным образом - Swift

UserDefaults в IOS 10 иногда показывает старое значение

Когда пользователь входит в приложение, я сохраняю некоторые значения из ответа API входа в пользовательские значения по умолчанию.

UserDefaults.standard.set(val, forKey: "XYZ")

Когда пользователь выходит из приложения, я удаляю настройки пользователя по умолчанию.

logOutAlert.addAction(UIAlertAction(title: "Yes", style: .default, handler: { (action: UIAlertAction!) in
    // Mark:- Function that remove user defaults data
                        self.resetDefaults()
                        BackgroundTask().stopUpdate()

                            let loginVC = self.storyboard?.instantiateViewController(withIdentifier: "LoginVC") as! LoginVC

                            self.showAlert(title: Constant.projectTitle, message: "Successfully loged out.")

                            let appDel:AppDelegate = UIApplication.shared.delegate as! AppDelegate

                            appDel.window?.rootViewController = loginVC

                        }))

        // Reset userdefaults
        func resetDefaults() {
            //let domain = Bundle.main.bundleIdentifier!
            //UserDefaults.standard.removePersistentDomain(forName: domain)
            UserDefaults.standard.dictionaryRepresentation().keys.forEach(UserDefaults.standard.removeObject(forKey:))
    //        let defaults = UserDefaults.standard
    //        let dictionary = defaults.dictionaryRepresentation()
    //        dictionary.keys.forEach { key in
    //            defaults.removeObject(forKey: key)
    //        }
        }

Комментированные строки - это способы, с помощью которых я пытался решить проблему. Пожалуйста go по следующему сценарию

  • Установить приложение
  • Войти (пользователь A)
  • Выйти (пользователь A)
  • Войти (пользователь B)
  • Убить приложение из памяти (не удалять)
  • Подождите около 20 минут.
  • Перезапустите приложение.

Проблема - по умолчанию данные пользователя А восстанавливаются автоматически.

Заранее спасибо. Любая помощь, безусловно, ценится, извините за мой Engli sh.

Ответы [ 5 ]

3 голосов
/ 26 февраля 2020

Попробуйте, может быть, это сработает. Используйте этот removeobject на выходе кнопки выхода из системы.

let defaults = UserDefaults.standard
defaults.synchronize()

        UserDefaults.standard.removeObject(forKey: "email")
        UserDefaults.standard.removeObject(forKey: "name")
        UserDefaults.standard.removeObject(forKey: "userid")
        UserDefaults.standard.removeObject(forKey: "mobno")
        UserDefaults.standard.removeObject(forKey: "profileimage")
        UserDefaults.standard.removeObject(forKey: "iphoneid")


0 голосов
/ 27 февраля 2020

Добавить наблюдателя Для изменений в значениях по умолчанию

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

В вашем AppDelegate Добавьте следующий код:

 UserDefaults.standard.addObserver(self, forKeyPath: "XYZ", options: NSKeyValueObservingOptions.new, context: nil)

И наблюдайте, используя метод

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

    // Check when It's getting trigged. 
}

Метод Apple Synchronize

Если вы работаете с этими асинхронными задачами, вам, возможно, придется попробовать вызвать этот метод UserDefaults.standard.synchronize().

Проверьте, какое значение он возвращает. Если это ложь (я никогда не видел, чтобы этот метод возвращал ложь). Вы можете сделать вывод, что что-то внутреннее мешает вам сохранить на диск.

func synchronize() -> Bool

Возвращаемое значение

true, если данные были успешно сохранены на диск, в противном случае - false.

0 голосов
/ 26 февраля 2020

Мне кажется, проблема в том, что вы пытаетесь удалить все ключи из UserDefaults.standard без фильтра. UserDefaults.standard содержит больше ключей, чем вы думаете, и некоторые из них управляются самим iOS. Чтобы определить ключи, которыми вы управляете, вы должны поставить префикс или (например: «MYAPP_username») и удалить только эти ключи. Вот код:

let keys = UserDefaults.standard.dictionaryRepresentation().keys.filter { return $0.starts(with: "MYAPP_") }
    for key in keys {
        UserDefaults.standard.removeObject(forKey: key)
    }

Это должно работать и надеюсь, что это работает ;-)

0 голосов
/ 26 февраля 2020

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

Попробуйте

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)
NSUserDefaults.standardUserDefaults().synchronize()

Лучше всего добавить синхронизацию, если ваша целевая версия iOS 11 или ниже, что поможет немедленно записать в dis c.

0 голосов
/ 25 февраля 2020

Возможно, вы захотите попробовать другой способ:

//Set an empty dictionary for the main domain, instead of removing the old one
guard let domain = Bundle.main.bundleIdentifier else { return }
let emptyDomain = [String : Any]()
UserDefaults.standard.setPersistentDomain(emptyDomain, forName: domain)

У меня есть теория, что метод removePersistentDomainForName содержит ошибки, и он удаляет старый домен, но не в состоянии создать пустой словарь домена после удаление, поэтому он просто сохраняет старый для этого случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...