- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在应用商店中有一个应用,我正在使用日志记录服务来获取崩溃日志和相关的日志数据。我看到间歇性崩溃(受影响的用户数量很少,每个用户的崩溃数量也很少),但这让我感到困惑。
这些崩溃发生的情况如下:
应用启动并初始化核心数据栈
应用程序尝试使用以下代码(storeURL
有效)将 SQL 存储添加到 NSPersistentStoreCoordinator:
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @(YES),
NSInferMappingModelAutomaticallyOption : @(YES)
};
sqlStore = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:options
error:&error];
添加该店铺时出现以下错误之一:
NSError:
Domain=NSCocoaErrorDomain
Code=256 "The operation couldn’t be completed. (Cocoa error 256.)"
UserInfo=0x1dd946a0 {NSUnderlyingException=authorization denied, NSSQLiteErrorDomain=23}
或
NSError:
Domain=NSCocoaErrorDomain
Code=256 "The operation couldn’t be completed. (Cocoa error 256.)"
UserInfo=0xc6525d0 {NSUnderlyingException=disk I/O error, NSSQLiteErrorDomain=10}
在这种情况下,应用程序将崩溃 b/c 应用程序运行需要 SQL 存储。我可以尝试通过尝试新的 storeURL 来优雅地处理此故障,但我不希望用户丢失现有数据。此外,我从未亲自重现此问题,并且根据受影响的用户数量和崩溃日志,我认为这是一个影响较小的问题,不会在后续应用程序启动时再次出现。
我希望有一位 Core Data 大师可以就如何调试和预防/处理这些情况提出一些建议。我的核心数据堆栈初始化代码直接来自 xcode 项目生成器,我已经排除了任何并发问题,因为持久存储协调器仅初始化一次(启动时),并且此错误发生在该初始化中。
如果相关,很乐意提供更多代码/信息。
谢谢!
最佳答案
看来 XJones 和我已经找到了原因。它似乎是 iOS 边缘案例错误或未记录的行为。我已将其归档在 Apple 错误 ID 12935031 下。
有一个无法解释的场景,即使用 Core Location 显着位置变化或区域监控的应用程序可能无法正常启动(或产生其他意想不到的后果),因为从 iOS 5 开始,Core Data 存储使用数据保护(默认加密)。
重现步骤:
1) 在设备上开启密码保护
2) 创建一个启动重要位置监控或区域监控的应用程序,即使在后台也能保持启动状态。 IE。使用后台显着位置更改或区域监控的应用。
3)等待设备上的电池电量耗尽(也可能有其他原因)
4) 设备将关闭
5) 将设备连接到 Mac
6) 电量充足后,设备将启动。重要提示:此时不要解锁设备。
7) 退出或进入监控范围或导致位置发生重大变化。该设备现在将自动重新启动该应用程序,因为它注册了重要位置监控或区域监控
8) 但是,由于用户尚未解锁设备(尚未输入密码),应用程序将无法读取其任何 protected 数据文件。在 Core Data 应用程序中,这将导致持久存储协调器无法将持久存储文件添加到托管对象上下文。这将导致应用程序崩溃,或者根据开发人员使用的代码甚至尝试重置数据库。在其他应用程序中,它可能会由于其他原因导致崩溃,因为这是 iOS 5 及更高版本中默认为核心数据存储打开的数据保护功能的意外、未记录的副作用。
在 Apple 更正此问题或至少记录它之前的解决方案或变通方法是确保您的应用程序停止监视 applicationWillTerminate 中的重要位置更改/区域或
通过为 NSFileProtectionKey 设置 NSFileProtectionNone 来关闭默认数据保护功能将核心数据存储添加到持久存储协调器时在选项字典中输入键。
使用 while() 循环检查 protected 数据是否可用,以等待文件存储可用。使用 KVO 可能还有其他方法可以做到这一点,但这种方法工作可靠,并且最容易插入现有代码,而无需重新处理整个应用程序启动过程。
更新:如果数据保护已在商店中激活,那么仅仅设置该 key 似乎是不够的。你必须手动设置它:
<strike></strike>
<strike>
<pre><code>[[NSFileManager defaultManager] setAttributes:[NSDictionary dictionaryWithObject:NSFileProtectionNone forKey:NSFileProtectionKey] ofItemAtPath:storePath error:nil];
</code></pre>
</strike>
<strike></strike>
由于 XJones 的更多输入以及对 Apple 分散文档的更多研究,这是需要后台位置监控的应用程序的修复:
<pre><code>while(![[UIApplication sharedApplication] isProtectedDataAvailable]) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5f]];
}
</code></pre>
此代码在您尝试将存储数据文件添加到持久存储协调器之前进入。
2015 年更新:您还可以将 NSPersistentStoreFileProtectionKey 设置为 NSFileProtectionNone。这将正确禁用文件保护(如果您不需要它)并且无需任何变通方法即可正常工作。它在之前的尝试中不起作用的原因是我测试的字典键不正确。
关于ios - 将 SQL 存储添加到 NSPersistentStoreCoordinator 时如何调试/处理间歇性 "authorization denied"和 "disk i/o"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12845790/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!