2014-09-25 127 views

回答

29

我猜你遇到的問題是你的代碼在applicationWillResignActiveapplicationDidBecomeActive,影響請求觸摸ID驗證的視圖控制器,它引發了一個棘手的循環。

您需要做的是將這些調用移動到applicationDidEnterBackgroundapplicationWillEnterForeground,因爲在調用Touch ID機制時不會調用它們。

要解釋當你的應用程序啓動以下順序執行程序,:

  1. applicationDidBecomeActive
  2. ..other東西您的應用功能
  3. 您的應用程序調用觸摸ID,其中火:
  4. applicationWillResignActive

...您的應用被禁止,直到用戶驗證指紋(失敗或成功 )...

  • applicationDidBecomeActive
  • 如果在代碼applicationDidBecomeActive - 或 - applicationWillResignActive影響Touch ID,您將創建一個無限循環或更糟糕的是,您將創建充滿標誌和特殊情況的代碼。

    相反,你應該在兩種情況下調用觸摸ID:

    • 當你的應用程序啓動(通常在didFinishLaunchingWithOptions

    • 當你的應用的applicationWillEnterForeground被調用。

    +0

    你如何建議在applicationWillEnterForeground中實現Touch ID檢查?即在返回到您的應用程序時,它會提示用戶,並在他們驗證其指紋之前不讓他們使用任何內容。 – user3246173 2016-03-31 01:40:38

    1

    你可以在你的登錄腳本中創建一個靜態布爾,你可以從你的AppDelegate中檢查!

    static var isShowingTouchID = false 
    

    然後你context.evaluatePolicy呼叫之前,可以將其設置爲true,並在回調函數,它設置爲false。我相信你使用reply參數來設置回調。

    然後在您的AppDelegate中,檢查此bool的狀態。

    最初我在AppDelegate中使用了一個公共變量並設置了它,但我覺得同樣的我不想這樣做。坦率地說,我也不喜歡這個解決方案,但它是我唯一能夠提出的。

    我甚至在我的登錄腳本中嘗試覆蓋viewDidDisappear,但我很快發現即使在觸摸ID提示符下點擊「取消」時也沒有被調用。

    如果有人有更好的解決方案,我很想知道。

    相關問題