[英]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)
}
做了什么?
languageCode
代碼以避免強制轉換,這可能會導致崩潰Language.someLanguage
返回的一種情況synchonize()
調用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.