【发布时间】:2014-09-29 13:50:30
【问题描述】:
我使用NSUserDefaults 在用户的 iOS 设备上保留大约 100 个键/值对。每对只是一个字符串键和布尔值。这几乎一直都很好。最近,一些用户提到他们的应用程序正在“重置”。具体来说,他们的应用程序没有正确读取来自NSUserDefaults 的数据。我正在尝试了解这是如何发生的。
需要注意的几点:
- 每次更新用户默认值后,我都会调用
synchronize - 我没有任何代码可以清除单个条目或整个默认值
- 默认值在
application:didFinishLaunchingWithOptions:中读取 - 应用从后台移到前台时不会读取默认值
我发现了一些有趣的 cmets in this Loom.com blog post。当应用程序在后台重新启动时,听起来像 NSUserDefaults 支持 plist 可能无法访问。如果后台应用程序在后台崩溃,我不确定它们是否会重新启动。但是,我很好奇,因为根据我的崩溃报告服务,我的应用程序确实在后台崩溃了。此外,此崩溃会在收到内存警告后立即发生。
在崩溃后(在后台)在后台重新启动时,应用是否可能无法读取用户默认值?
非常感谢任何有关如何诊断此问题的建议!
编辑 - 更多信息:听起来 CoreLocation 框架可能会导致应用在后台崩溃后在后台重新启动。我的应用程序包含一些 3rd 方广告和分析 SDK。事实上,这个问题是在添加一个可以使用 CoreLocation 的特定 SDK 后开始出现的。
【问题讨论】:
-
键/值是否永远消失了?
-
正在重置的键是否有通用名称?也许第三方会覆盖此键?
-
似乎很多人都有同样的问题。查看link,希望有所帮助。
-
" 此外,此崩溃在收到内存警告后立即发生。"这意味着您的应用程序没有正确响应内存警告。
-
您的应用程序是否曾经通过位置更改(或推送通知)在后台启动?如果您启用了“静态加密”,您的应用程序可以在后台启动(大概是在手机被锁定时)并且 NSUserDefaults 无法访问。您可以通过 [[UIApplication sharedApplication] isProtectedDataAvailable] 进行查询,如果返回 NO 您将无法访问受保护的数据(或钥匙串)
标签: ios nsuserdefaults