长时间后重新启动应用程序时,用户默认设置会被清除

问题描述 投票:0回答:2

我有一个可以登录的 iOS 应用程序,并且我使用用户默认值来存储“firstLogin”、“freshInstall”、“userName”、“sessionTime”等数据。我在终止应用程序时遇到问题(双单击主页并向上滑动应用程序将其删除)并在很长一段时间(大约 6 小时后)后重新启动它会清除我设置的所有 userDefaults,并且应用程序将在全新安装屏幕中打开。它实际上应该在登录状态下打开。

我正在使用

synchronize
正确保存用户默认值。

我没有任何代码来显式删除 userDefault 键值或清除它们。我有一些第三方框架,但我不确定如何检查这些框架是否导致此问题。 我怎么知道这个问题是从哪里来的?有没有 userDefaults 被自动清除的情况?

启动屏幕是根据保存在 [NSUserDefaults standardUserDefaults] 中的变量“isLaunchScreenShown”确定的。显示第一个安装和启动屏幕后,该变量设置为 true。卸载应用程序后,UserDefaults 将被清除。 但就我现在的情况而言,“isLaunchScreenShown”的 UserDefaults 值返回 null,表明它未设置,即使它不是安装后第一次启动。

ios objective-c nsuserdefaults
2个回答
1
投票

这是 iOS 15 SDK、Xcode 13 的问题...有人报告了。

检查此处:https://github.com/firebase/firebase-ios-sdk/issues/8695 并在此处查看:https://developer.apple.com/forums/thread/685685


1
投票

这与苹果在 iOS 15 中引入的新预热功能有关。

https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app/about_the_app_launch_sequence

它不应该达到

didFinishLaunching
的程度,但开发者论坛上的一位评论者表示,他们的信息直接来自苹果。

可能是一个错误。可能是故意的。有报道称此问题已在 15.4 中修复,但无法确认,因为无法知道预热何时发生。


为什么使用用户默认值和钥匙串?

一般在设备锁定时会发生预热。如果它被锁定,则对钥匙串或用户默认值的访问将被阻止。因此,当您检查布尔值时,它将返回 false...因为找不到它。


解决方案?

您可以使用 bool 以外的其他值,这样您就可以检查

nil
或存储在那里的值。因为现在不太理想,在用户默认值中 bool 对于
false
false
都返回
nil
。如果您存储
String
,您将获得 3 个选项。
"true"
"false"
nil
。使用
nil
确定您是否有权访问用户默认值。

或者,不要使用 UserDefaults。而是写入不同的文件。

如果此功能可以选择加入,或者至少选择退出,那就太好了。可以肯定的是,这是一个实施得很差的功能,而且我确信此时可能造成了价值数千美元的损失。

© www.soinside.com 2019 - 2024. All rights reserved.