Swift 为什么请求摄像头/麦克风许可会触发ApplicationIDBecomean?

Swift 为什么请求摄像头/麦克风许可会触发ApplicationIDBecomean?,swift,Swift,我已经接管了一个项目,该项目处理在AppDelegate中的“ApplicationIDBecomeActive”函数中首先显示哪个屏幕。这一直在造成问题,因为每当应用程序请求权限时,有时(不是全部),它会触发这段代码,并将用户发送到错误的屏幕。我不知道该怎么办,因为我以前从未遇到过这种情况。你知道为什么会发生这种情况,或者有什么方法可以避免这种情况吗?但是,我尝试添加一个标志变量,该变量似乎无法持续工作,因为它似乎在触发ApplicationIDBecomeActive之前被取消设置。当显示系

我已经接管了一个项目,该项目处理在AppDelegate中的“ApplicationIDBecomeActive”函数中首先显示哪个屏幕。这一直在造成问题,因为每当应用程序请求权限时,有时(不是全部),它会触发这段代码,并将用户发送到错误的屏幕。我不知道该怎么办,因为我以前从未遇到过这种情况。你知道为什么会发生这种情况,或者有什么方法可以避免这种情况吗?但是,我尝试添加一个标志变量,该变量似乎无法持续工作,因为它似乎在触发ApplicationIDBecomeActive之前被取消设置。

当显示系统通知(如权限)时,应用程序被发送到后台,或变为“非活动”。当权限通知被解除时,应用程序再次变为“活动”。这可以解释为什么会触发didBecomeActive

我接管了一个项目,该项目处理在AppDelegate内的“ApplicationIDBecMeactive”函数中首先显示哪个屏幕。。。你知道为什么会发生这种情况,或者有什么方法可以避免这种情况吗

简单的答案是:不要在
applicationIDBECOMEACTIVE()
中执行此操作。正如您所看到的,应用程序可能会变为非活动状态,然后在应用程序保持在前台的情况下再次激活,因此对于您正在执行的操作来说,这不是正确的状态转换。确定确实要选择屏幕的应用程序状态转换。例如,您可能希望在应用程序启动时执行此操作,以及在应用程序从后台转换到前台时执行此操作,因此您可以使用
应用程序(\uquot:didFinishLaunchingWithOptions:)
应用程序将进入前台(\uquot:)
。(显然,您不希望在两个位置都放置相同的代码,所以请将其放在单独的方法中,然后从这两个方法中调用它。)


苹果公司有一份文件涵盖了这一主题:。参考页上还有很多关于应用程序状态的信息。这两个文档都包括有用的状态转换图和各种状态的含义说明。

作为解决方案;您可以使用applicationWillEnterForeground()。它在applicationIDBecomeActive()之前被调用,而不是由权限请求触发。

这是一个很好的开始,感谢您提供此功能。关于如何防止错误的屏幕转换破坏用户体验,您有什么建议吗?您能否提供更多信息,说明当触发didBecomeActive时,为什么需要执行segue(当您指将用户发送到另一个屏幕时,您指的是执行segue?)?我不是指segue,我的意思是把VC推到UINavigationController堆栈上。除了这是另一个开发人员提出的原始实现之外,没有真正的原因。原因是,应用程序中的数据高度敏感,因此每次打开应用程序时(无论是从后台还是第一次打开),应用程序都需要进行一系列检查,以验证应用程序是否处于与服务器一致的状态,是否具有访问应用程序其余部分的valdiated凭据。为了澄清,如果用户自愿将此应用程序置于后台(按下home按钮),然后再次打开该应用程序,用户是否需要返回上次看到的屏幕或代码逻辑中指定的另一个VC?这取决于其他几个因素,如令牌或会话持续时间的到期等。因此,它可以引导用户访问以前访问过的页面,也可以将他们带到一个全新的页面。有很多因素需要考虑,这使得这个过程如此复杂和繁琐。重复和我的答案是相同的。如果您的代码无法处理在任何时候被停用和激活的应用程序,则说明它是错误的代码或位于错误的位置。您是否有任何文章或链接可以帮助我改进代码结构?居高临下地指出显而易见的事实并不能真正帮助我学习。我希望得到一些建设性的批评或见解,因为我不知道从哪里开始。我正在研究协调器范例,但我不知道有任何替代方案。此外,正如我上面所说的,这不是我写的代码,而是我接管的一个项目。我希望改进它,这就是我最初提出这个问题的原因。不清楚目标是什么,因为您没有显示任何代码。如果这是关于最初显示登录或帮助屏幕,除非用户已经看到它,请查看我的项目,这是非常公平的,我没有提供足够的信息让您离开。该应用程序当前的工作方式是,每当该应用程序被带到前台时,都会显示一个启动屏幕,同时它会处理对服务器的一系列检查。响应指示用户被发送到哪个屏幕;有5+种不同的可能性可以将用户发送到何处。由于数据的敏感性,这是一个强制性过程。对于这样的问题,有哪些方法或解决方案?你的项目还适用吗?我不知道,因为你还没有展示。这也不是这个问题的目的。你问的问题非常有限,而且得到了很好的回答。我建议接受一个答案并提出一个新的问题,该问题实际上解释了您试图执行的操作并显示了当前代码。因此,它需要出现在ApplicationIDBecomeActive中的原因是,在检查期间,我需要从keychain access检索数据,而只能从该委托方法可靠地检索数据。出于这个原因,不可能将代码放在applicationWillEnterForeground中。你建议我做什么?