应用程序在iOS 13上运行时会在一些设备上崩溃。该应用程序正在生产中,我在Xcode组织者崩溃中看到了这个问题。我不能在模拟器或任何物理设备上重现这个问题。
我想这与本土化有关。我使用'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组织者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 ()
-------------------------------------------------------发布于 2019-10-16 16:35:34
我不是什么都有,所以这里有一些假设可能没有得到适当的解决:
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返回H 210G 211中的synchonize()调用。https://stackoverflow.com/questions/58414197
复制相似问题