25

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

我该怎么办?

4

12 回答 12

42

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

于 2012-04-25T04:41:47.153 回答
16

如果您只想在应用程序激活时调用您的代码一次,请尝试通过两种方法调用它。

  1. didFinishLaunchingWithOptions
  2. applicationWillEnterForeground

而不是只从applicationDidBecomeActive.

于 2015-10-08T14:53:36.513 回答
12

这是因为位置或推送通知警报。

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

于 2013-03-20T01:28:22.480 回答
2

我不知道这是否会有所帮助,但我只是在一个完全简单的应用程序中遇到了同样的问题,它不使用定位服务,我发现这是一种错觉。查看我收到的日志消息:

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 两次报告相同的日志消息。

就我而言,我可以通过关闭所有运行行为 -> 生成输出来防止这种情况。

于 2012-12-22T18:59:38.213 回答
2

使用 Xcode 6 有一个新的原因会发生这种情况:当您在可调整大小的模拟器中启动应用程序时,applicationDidBecomeActive: 将被调用两次。

它使用默认大小类启动应用程序,然后应用您上次使用的大小——即使您使用的是默认值。任何时候应用大小类的变化,applicationDidBecomeActive: 都会被调用。

于 2014-09-18T01:29:32.877 回答
2

关于什么:

  • 递增applicationDidBecomeActive
  • applicationDidBecomeActive减少权限请求的回调事件或关闭时触发另一个警报的其他警报。
于 2016-07-01T03:29:01.067 回答
1

当应用程序一次启动时,它会按顺序调用,

  1. didFinishLaunchingWithOptions
  2. applicationDidBecomeActive两次

当我们打开控制中心时,它只会调用,

applicationDidBecomeActive

当应用程序从后台到前台时,它会按顺序调用

  1. applicationWillEnterForeground
  2. applicationDidBecomeActive
于 2017-05-28T07:46:25.440 回答
1

我目前看到双重通知。

这是因为我的 AppDelegate 的初始化代码被调用了两次。
它在执行时(即加载 .XIB 文件时)被调用一次main()[[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:application topLevelObjects:&tl]因为 .XIB 文件正在将 FirstResponder 设置为我的自定义 AppDelegate,然后在 main() 调用时再次调用它[[myAppDelegate alloc] init]

初始化代码是addObserver调用的内容,因此为我关心的每个通知设置了两个观察者,这就是为什么我的通知被调用两次的原因。

我是一个新手 OS X 程序员,所以我还不确定解决这两个问题的最佳方法,但想在这里发布它以防它对其他人有帮助,另一个地方可以查看。

于 2018-04-07T16:41:32.890 回答
0

您是否可能在 Interface Builder 和 AppDelegate 代码中创建了您的类的实例?

于 2012-04-24T19:36:31.973 回答
0

如果您的代码只希望在应用程序启动时调用一次,请使用

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

反而。

否则,每当您的应用程序再次激活时,都会调用 applicationDidBecomeActive ,因此这不仅意味着您的情况的两倍,而且每次用户在切换到另一个应用程序后切换回您的应用程序时。

于 2012-04-24T20:09:06.707 回答
0

如果您使用 RxSwift,那么您可以限制应用程序事件,因此它不会在同一秒内调用两次:

NotificationCenter.default.rx.notification(Notification.Name.UIApplicationDidBecomeActive)
        .throttle(1, scheduler: MainScheduler.instance)
        .subscribe { (event) in
            self.appEnteredFromBackground()
        }.disposed(by: disposeBag)

private func appEnteredFromBackground() {
        Analytics.trackPageView(withScreen: .home)
        dataStore.checkIfAllowingRides()
    }

我把这段代码放在我的实际视图控制器中,逻辑应该发生在 ApplicationDidBecomeActive 上。

于 2018-03-14T05:24:01.817 回答
0

我只是检查applicationDidBecomeActive:请求是否真的发送(我为此创建了一个函数,检查状态),如果是,我已经返回。第二次applicationDidBecomeActive:,函数读取状态为拒绝或允许,因为这是在用户回答警报之后。

于 2019-10-18T12:58:19.710 回答