2014-09-25 128 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提示符下点击“取消”时也没有被调用。

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

    相关问题