mp3*_*821 38 background reboot core-location nsuserdefaults ios
我们目前正在使用我们的iPhone应用程序遇到以下奇怪的问题.正如标题所说,NSUserDefaults当手机重新启动但未解锁时,正在丢失我们的自定义键和值,这是在非常特定的情况下发生的.
语境:
我们正在使用NSUserDefaults应用程序来存储用户数据(例如用户名).
我们的应用在后台模式启用了位置.
我们只在通过无线方式或通过Testflight进行分发时遇到此问题.如果我使用Xcode将.ipa(同样是通过空中传播的)拖放到我的手机中,我就不会遇到这个问题.
情况:用户安装应用程序,登录并NSUserDefaults成功存储用户名.然后,用户关闭他们的设备并将其重新打开,让手机在解锁屏幕前坐一会儿.
问题:如果在那个时候触发了重要的位置更改,应用程序将在后台运行,但它NSUserDefaults是空的(只有来自苹果的一些键,但没有我们的自定义键).然后,NSUserDefaults无论你做什么,永远不会恢复这些密钥(例如,如果你解锁手机并打开应用程序,你会发现密钥仍然缺失).
任何帮助或想法将是真正的赞赏:)
小智 29
我遇到了一个非常类似的问题.背景应用程序.使用其他内存繁重的应用程序,直到我的应用程序从内存中被抛弃.(如果您的设备已插入且xcode正在运行构建,您可以观察此事件.Xcode将告诉您"应用程序因内存压力而终止."从此处如果您的应用程序已注册后台获取事件,它将在某些时候唤醒指向并重新启动但进入后台.此时如果您的设备被锁定,您的NSUserDefaults将为空.
经过几天调试这个案例后,我意识到NSUserDefaults并没有被破坏或被填满,而是由于设备锁定,应用程序无法访问它.如果您手动尝试通过xcode管理器下载应用程序内容,您实际上可以观察到此行为,如果您的设备保持锁定,您会注意到存储NSUserDefaults设置的plist不存在.
确定如果在设备锁定时将应用程序启动到后台,则无法访问NSUserDefaults.这不是什么大问题,但最糟糕的是,一旦应用程序启动到后台,它就会保留在内存中.此时,如果用户然后解锁设备并将应用程序启动到前台,则您仍然没有NSUserDefaults内的任何内容.这是因为一旦应用程序将NSUserDefaults加载到内存中(为空),一旦设备解锁,它就不知道重新加载它.在这种情况下,synchronize什么都不做.我发现解决了我的问题就是打电话
[NSUserDefaults resetStandardUserDefaults]在applicationProtectedDataDidBecomeAvailable方法内部.
希望这有助于某人.这些信息本可以为我节省许多小时的悲伤.
mp3*_*821 25
过了一会儿,Apple认为这是一个官方错误.所以我们只有不同的解决方法才能解决:
如果在执行BEFORE手机解锁之前需要数据,请使用以下选项之一并设置NSPersistentStoreFileProtectionKey = NSFileProtectionNone选项:
NSPersistentStoreFileProtectionKey =
NSFileProtectionNone选择你的;)
如果您在解锁手机之前不需要或不关心数据,可以使用此方法(谢谢@maxf):
注册applicationProtectedDataDidBecomeAvailable:通知并在回调中执行以下代码行[NSUserDefaults resetStandardUserDefaults]
这将使您NSUserDefault在手机获得访问受保护数据的权限后立即重新加载,从而帮助您完全避免此问题.
谢谢大家的帮助!
| 归档时间: |
|
| 查看次数: |
11661 次 |
| 最近记录: |