【问题标题】:iOS Keychain access on background thread and app crashiOS 钥匙串访问后台线程和应用程序崩溃
【发布时间】:2020-04-19 22:45:16
【问题描述】:

我正在编写一个测试应用程序,其中涉及“大量”钥匙串访问,其中包括添加和删除具有不同访问控制属性和不同项目类型的钥匙串项目。

这个应用程序非常简单 - 有一个文本区域,可作为写入和删除内容的日志;触发运行测试的按钮。该应用程序只有 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")
 ...
}

【问题讨论】:

    标签: ios swift xcode keychain


    【解决方案1】:

    您的应用因长时间无响应而被终止。从 Xcode 启动的应用程序(附加了调试器)在真实硬件上不受启动看门狗超时的影响。

    没有任何代码很难给你具体的反馈,但我猜你正试图在主线程可用之前从主线程访问 Keychain,从而锁定应用程序。

    等到applicationProtectedDataDidBecomeAvailable 委托方法被调用后再访问钥匙串。对钥匙串的调用在 iOS 中是线程安全的,因此您还应该能够在主线程之外执行对钥匙串 API 的调用,以避免任何阻塞请求锁定您的 UI。

    【讨论】:

    • 我认为你是对的。请参阅下面的示例代码,了解我在做什么。 log 对象是对文本区域的引用,我只是在记录运行钥匙串读/写时正在做的事情。我想我在运行钥匙串访问代码时锁定了 UI(文本区域和按钮)。我需要在执行此操作时异步更新log。请告诉我。 ``` @IBAction func keychainItemsTest() { log.text += "开始读/写..." valet.removeAllObjects() secureValet.removeAllObjects() log.text += "将值 test1 添加到钥匙串" .... ```
    • 我正在尝试显示更多代码,但我弄乱了格式。已经很糟糕了。对不起!
    • @htcm8 没有足够的代码来判断(它应该被截断吗?)。但是您可以执行以下操作:DispatchQueue.global(qos: .userInteractive).async { ... blocking code here ... } 然后在该背景关闭中,使用:DispatchQueue.main.async { ... update UI here ... } 更新 UI。很难在评论中表达,但希望你能明白。
    • 谢谢。我想我可以通过一些博客文章来解决这个问题。
    猜你喜欢
    • 2020-06-27
    • 2017-01-19
    • 1970-01-01
    • 2012-05-10
    • 2019-08-03
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多