TouchID调用applicationWillResignActive和applicationDidBecomeActive函数

27
我想知道苹果是否有意让TouchID功能调用这些生命周期方法。是否有可能检查TouchID进程是否正在调用这些方法(我希望避免在AppDelegate中设置一个BOOL值,以判断当前是否显示TouchID输入)。

你找到答案了吗?我也很好奇。 - Reneli
2个回答

53
我猜测你遇到的问题是,你的代码存在于 applicationWillResignActiveapplicationDidBecomeActive 中,这些代码会影响请求 Touch ID 验证的视图控制器,并且会引发一个棘手的循环。
你需要做的是将这些调用移动到 applicationDidEnterBackgroundapplicationWillEnterForeground 中,因为当调用 Touch ID 机制时,它们不会被调用。
要解释一下这个顺序,当你的应用程序启动时,执行以下序列:
  1. applicationDidBecomeActive
  2. ..其他应用程序执行的操作
  3. 你的应用程序调用 Touch ID,触发:
  4. applicationWillResignActive

...直到用户验证指纹(成功或失败)之前,您的应用程序将被禁用...

  1. applicationDidBecomeActive
如果你在 applicationDidBecomeActive 或者 applicationWillResignActive 中有影响 Touch ID 的代码,你将创建一个无限循环,或者更糟糕的是,你会创建一个充满标志和特殊情况的代码。
相反,在两种情况下,你应该调用 Touch ID:
  • 当你的应用程序启动时(通常在 didFinishLaunchingWithOptions 中)

  • 当你的应用程序的 applicationWillEnterForeground 被调用时。


你如何建议在applicationWillEnterForeground中实现Touch ID检查?即当返回到您的应用程序时,它会提示用户并且不允许他们使用任何内容,直到他们验证指纹。 - user3246173

4

你可以在登录脚本中创建一个静态布尔变量,然后可以从你的AppDelegate中检查它!

static var isShowingTouchID = false

在你的context.evaluatePolicy调用之前,你可以将其设置为true,并在回调函数中将其设置为false。我相信你使用reply参数来设置此回调。

然后在你的AppDelegate中,检查这个布尔值的状态。

最初我在AppDelegate中使用一个公共变量并将其设置,但我觉得这样做也不好。老实说,我也不喜欢这个解决方案,但这是我能想出的唯一一个。

我甚至尝试在我的登录脚本中覆盖viewDidDisappear,但很快发现,即使我点击了指纹识别提示上的“取消”按钮,它也没有被调用。

如果有更好的解决方案,我会很乐意知道。


2
这是一个好的解决方案。只需注意,didBecomeActiveNotification 并不总是在 reply 回调之前被调用。我曾经看到过 1-2 秒的延迟。 - Elijah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接