【发布时间】:2019-10-16 13:12:44
【问题描述】:
应用程序在 iOS 13 上在某些设备上启动时崩溃。该应用程序正在生产中,我在 Xcode Organizer 崩溃中看到了这个问题。我无法在模拟器或任何物理设备上重现此问题。
我想这与本地化有关。我使用“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 崩溃中看到的 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 ()
-------------------------------------------------------
【问题讨论】:
-
你可以试试没有这条线
UserDefaults.standard.removeObject(forKey: appleLanguagesKey) -
我认为这不会引发这种情况,因为在用户选择语言之后调用了“set”代码块,并且在此之前应用程序崩溃
-
设置前不需要删除key,也不要使用
synchronize。苹果表示“这种方法是不必要的,不应该使用。” -
你还有
languageCode as! String- 你确定它是一个字符串而不是,比如说,Int?
标签: ios swift ios13 userdefaults