簡體   English   中英

iOS 后台線程上的鑰匙串訪問和應用程序崩潰

[英]iOS Keychain access on background thread and app crash

我正在編寫一個測試應用程序,其中涉及“大量”鑰匙串訪問,其中包括添加和刪除具有不同訪問控制屬性和不同項目類型的鑰匙串項目。

這個應用程序非常簡單 - 有一個文本區域,用作寫入和刪除內容的日志; 觸發運行測試的按鈕。 該應用程序只有 1 個 ViewController class,它具有按鈕的 IBAction 方法。 此方法包含讀取/刪除鑰匙串項的所有代碼。

我的問題是,如果從 XCode 啟動該應用程序運行良好 - 當單擊按鈕時,我會收到 TouchID 的鑰匙串提示,一切看起來都很好。 但是,一旦我從 Springboard 啟動應用程序並單擊按鈕,我就會收到鑰匙串提示,但應用程序會在幾秒鍾后崩潰。 檢查日志顯示原因是“場景更新看門狗違規:用盡了 10.00 秒的實時余量”。

我做錯了什么,從 XCode 啟動與用戶啟動它有什么不同?

顯然,我不是一位經驗豐富的開發人員,並且想要一些正確方向的幫助/指針。

編輯添加代碼:只有 for of 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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM