我正在编写一个涉及“繁重”钥匙串访问的测试应用,其中添加和删除了具有不同访问控制属性和不同项目类型的钥匙串项目。
此应用程序非常简单-具有一个文本区域,可记录正在写入和删除的内容;一个触发运行测试的按钮。该应用程序只有1个ViewController类,该类具有针对按钮的IBAction方法。此方法保存所有读取/删除钥匙串项的代码。
我的问题是,如果该应用程序是从XCode启动的,则该应用程序运行良好-单击该按钮时,我会收到TouchID的钥匙串提示,一切看起来都很好。但是,一旦我从Springboard启动应用程序并单击按钮,我就会收到钥匙串提示,但应用程序在几秒钟后崩溃。检查日志后发现原因是“场景更新看门狗越界:10.00秒的实时余量耗尽”。
我在做什么错,XCode与用户启动有什么不同?
显然,我不是一个经验丰富的开发人员,希望在正确的方向上提供一些帮助/指标。
编辑以添加代码:valet.set()
或seceureValet.set()
仅用于。
@IBAction func keychainItemsTest() {
log.text += "Starting read/write..."
valet.removeAllObjects()
secureValet.removeAllObjects()
log.text += "Adding value test1 to keychain"
valet.set(string:"test1", forKey:"test1")
...
}
您的应用因长时间没有响应而被杀死。从Xcode启动的应用程序(连接了调试器)在真实硬件上不受启动启动看门狗超时的限制。
没有任何代码很难给您具体的反馈,但是我的猜测是,您试图在主线程可用之前从主线程访问钥匙串,从而锁定了应用程序。
等待直到访问钥匙串之前调用applicationProtectedDataDidBecomeAvailable
委托方法。在iOS中,对钥匙串的调用是线程安全的,因此您还应该能够在主线程之外执行对钥匙串API的调用,以避免任何阻塞请求锁定您的UI。