簡體   English   中英

iOS 13 UserDefaults:在某些設備上啟動時應用程序崩潰

[英]iOS 13 UserDefaults: app crash on start on some devices

應用程序在啟動時在某些設備上的 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()
    }

我在 Xcode Organizer Crashes 中看到的 Stacktrace 是:

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 ()
-------------------------------------------------------

我沒有一切,所以這里有一些假設可能無法正確解決:

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返回的一種情況
  3. 我刪除了你的 setter 中的synchonize()調用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM