iOS 13 UserDefaults: сбой приложения при запуске на некоторых устройствах - PullRequest
1 голос
/ 16 октября 2019

Приложение запускается на iOS 13 на некоторых устройствах при запуске. Приложение находится в производстве, и я видел эту проблему в Xcode Organizer Crashes. Я не могу воспроизвести эту проблему ни на симуляторе, ни на каких-либо физических устройствах.

Я полагаю, что это как-то связано с локализацией. Я использую ключ «AppleLanguages» и сохраняю выбранный язык в виде массива. Я сохраняю язык в пользовательских настройках по умолчанию как:

static var language: Language {
    get {

        if UserDefaults.standard.bool(forKey: isLanguageSelectedKey) {
            if let languageCode = UserDefaults.standard.array(forKey: appleLanguagesKey)?.first,
                let language = Language(rawValue: languageCode as! String) {
                return language
            } else {

                return Language.someLanguage
            }
        } else {
            return Language.someLanguage
        }

    }

    set {
        guard language != newValue else {
            return
        }
        UserDefaults.standard.removeObject(forKey: appleLanguagesKey)
        UserDefaults.standard.synchronize()

        UserDefaults.standard.set([newValue.rawValue], forKey: appleLanguagesKey)

        UserDefaults.standard.synchronize()
    }

Stacktrace, который я вижу в Xcode Organizer Аварии:

Last Exception Backtrace (0)
0   (null) in __exceptionPreprocess ()
-------------------------------------------------------
8   (null) in +[NSUserDefaults(NSUserDefaults) standardUserDefaults] ()
9   (null) in __45+[GMSx_GTMSessionFetcher fetcherUserDefaults]_block_invoke ()
10  (null) in _dispatch_client_callout ()
11  (null) in _dispatch_once_callout ()
12  (null) in +[GMSx_GTMSessionFetcher fetcherUserDefaults] ()
13  (null) in +[GMSx_GTMSessionFetcher fetchersForBackgroundSessions] ()
14  (null) in +[GMSx_GTMSessionFetcher load] ()
15  (null) in load_images ()
-------------------------------------------------------



Thread 1
0   (null) in __pthread_kill ()
-------------------------------------------------------
9   (null) in _dispatch_once_callout ()
10  (null) in +[GMSx_GTMSessionFetcher fetcherUserDefaults] ()
11  (null) in +[GMSx_GTMSessionFetcher fetchersForBackgroundSessions] ()
12  (null) in +[GMSx_GTMSessionFetcher load] ()
13  (null) in load_images ()
-------------------------------------------------------

1 Ответ

0 голосов
/ 16 октября 2019

У меня нет всего, поэтому здесь были некоторые предположения, которые могут быть неверно рассмотрены:

static var language: Language {
get {
        if UserDefaults.standard.bool(forKey: isLanguageSelectedKey),
             let languageCode = UserDefaults.standard.array(forKey: appleLanguagesKey)?.first as? string,
             let language = Language(rawValue: languageCode) {
                return language
        }
        // No language value found, so return someLanguage
        return Language.someLanguage

    }
set {
    guard language != newValue else {
        return
    }
    UserDefaults.standard.removeObject(forKey: appleLanguagesKey)
    UserDefaults.standard.set([newValue.rawValue], forKey: appleLanguagesKey)
}

Что было сделано?

  1. languageCode - этотеперь безопасно разворачивается, чтобы избежать принудительного приведения, которое может вызвать сбой
  2. Оператор if был переписан, чтобы сделать его более кратким и исключить один сценарий, который привел к удалению Language.someLanguage return
  3. Isynchonize() звонки в вашем сеттере
...