2012-04-24 208 views
18

我的应用程序委托方法applicationDidBecomeActive:在第一次启动应用程序时被调用两次。我有一部分代码,我只想执行一次&,我已投入applicationDidBecomeActive:applicationDidBecomeActive被调用两次

我该怎么办?

+2

没有堆栈跟踪看,当你设置applicationDidBecomeActive断点像什么:?两次通话都完全一样吗?如果不是的话(那不应该是),那么这会导致你的问题。 – 2012-04-25 01:28:33

回答

35

我得到了问题。我正在使用位置服务。在点击位置服务警报的“确定”后第一次启动时,我的applicationDidBecomeActive被再次调用一次,这是正常的iOS行为。

+0

我的应用程序每次启动时都需要进行身份验证。使用此位置警报时,用户需要在弹出警报后立即键入密码。我需要避免这种情况发生。 – 2015-04-22 10:04:06

+0

@LocPham:我的建议是在应用程序委托实现文件中保存一个实例变量,每当调用applicationDidBecomeActive时增量。当此变量的值大于1时,请勿执行您的登录警报代码。不要忘记重置它。此外,这个建议纯粹是基于你的需求而不看你的代码。也可能是更好的方法。 – Abhinav 2015-05-05 10:19:52

0

你有没有可能在Interface Builder和你的AppDelegate代码中创建了你的类的实例?

+0

检查一下NSLog(@“%x”,(int)self);在该代表中,确保它是相同的实例... – 2012-04-24 19:37:39

+0

即使是这种情况,应用程序对象本身也只能有一个代理,并且只会发送一次消息。 – 2012-04-24 19:43:41

+0

@Grady:有指针的格式说明符:'NSLog(@“%p”,self);' – 2012-04-24 19:47:48

0

如果您想要只调用一次,当应用程序启动代码,然后用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

代替。

否则,applicationDidBecomeActive将在您的应用程序再次变为活动状态时被调用,因此,这不仅仅意味着您的情况是两次,而且每次切换到另一个时切换回您的应用程序。

+0

在应用程序之间切换很好。我也希望这段代码能够被执行。但在第一次发射时,它被称为两次。 – Abhinav 2012-04-24 20:32:11

1

我不知道这是否会有所帮助,但是我对于一个完全不使用位置服务的简单应用程序只是有同样的问题,我发现这是一种错觉。看看我得到的日志消息:

2012-12-22 10:47:45.329 Bizarro[10416:907] start applicationDidBecomeActive: 
2012-12-22 10:47:45.333 Bizarro[10416:907] end applicationDidBecomeActive: 
2012-12-22 10:47:45.329 Bizarro[10416:907] start applicationDidBecomeActive: 
2012-12-22 10:47:45.333 Bizarro[10416:907] end applicationDidBecomeActive: 

仔细看看。看看。第一条和第三条消息有相同的时间。第二条和第四条消息有相同的时间。他们是相同的信息!这是一个Xcode错误;它与我的代码无关。 Xcode两次报告相同的日志消息。

就我而言,我可以通过关闭“正在运行的所有行为 - >生成输出”来阻止此操作。

9

这是由于位置或推送通知警报。

本机位置/推送通知被解除后,将调用applicationDidBecomeActive。

+2

我们如何正确区分“真实”applicationDidBecomeActive:当我们的应用程序实际进入背景时,由于位置警报而强行进入后台? – 2015-04-22 10:01:20

+0

我的应用程序每次启动时都需要进行身份验证。使用此位置警报时,用户需要在弹出警报后立即键入密码。我需要避免这种情况发生。 – 2015-04-22 10:03:35

2

使用Xcode 6可能会发生一个新的原因:当您在可调整大小的模拟器中启动应用程序时,applicationDidBecomeActive:将被调用两次。它使用默认大小类启动应用程序,然后应用您上次使用的大小 - 即使您使用的是默认大小。无论何时应用更改大小类,applicationDidBecomeActive:都会被调用。

7

如果您只想在应用程序变为活动状态时调用您的代码,请尝试使用两种方法调用它。 1. didFinishLaunchingWithOptions 2. applicationWillEnterForeground

而不是只从applicationDidBecomeActive调用它。

+1

这应该是被接受的答案。 – Darko 2017-05-09 14:45:01

0

什么:在applicationDidBecomeActive

  • 递减

    • 增量在关闭时触发另一个applicationDidBecomeActive权限请求或其他警报的回调事件。
  • 0

    当应用程序启动第一时间 它依次调用,

    1. didFinishLaunchingWithOptions
    2. applicationDidBecomeActive两次

    当我们打开它仅调用Control Center

    applicationDidBecomeActive 
    

    当应用程序来自于背景,前景它依次调用

    1. applicationWillEnterForeground
    2. applicationDidBecomeActive