applicationDidBecomeActive被调用两次

时间:2012-04-24 19:34:29

标签: iphone objective-c ios cocoa-touch uiapplicationdelegate

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

我该怎么办?

12 个答案:

答案 0 :(得分:38)

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

答案 1 :(得分:14)

如果您想在应用变为有效时只调用一次代码,请尝试从两种方法调用它。 1. didFinishLaunchingWithOptions 2. applicationWillEnterForeground

而不是仅从applicationDidBecomeActive调用它。

答案 2 :(得分:10)

这是因为位置或推送通知提醒。

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

答案 3 :(得分:2)

使用Xcode 6可能会出现这样的新原因:当您在可调整大小的模拟器中启动应用程序时,applicationDidBecomeActive:将被调用两次。它使用默认大小类启动应用程序,然后应用您上次使用的大小 - 即使您使用的是默认值。每当应用size类的更改时,都会调用applicationDidBecomeActive:。

答案 4 :(得分: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报告了两次相同的日志消息。

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

答案 5 :(得分:1)

怎么样:

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

答案 6 :(得分:1)

当应用启动第一次时 它顺序调用,

  1. didFinishLaunchingWithOptions
  2. applicationDidBecomeActive两次
  3. 当我们打开Control Center时,它只调用

    applicationDidBecomeActive
    

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

    1. applicationWillEnterForeground
    2. applicationDidBecomeActive

答案 7 :(得分:0)

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

答案 8 :(得分:0)

如果您在应用启动时只想调用一次代码,请使用

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

代替。

否则,只要您的应用再次变为活动状态,就会调用applicationDidBecomeActive,因此这不仅仅意味着两倍,而是每次用户切换到另一个应用后切换回应用。

答案 9 :(得分: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上。

答案 10 :(得分:0)

我目前正在看双重通知。它正在发生,因为我的AppDelegate的初始化代码被调用了两次。当main()执行[[NSBundle mainBundle] loadNibNamed:@“MainMenu”owner:application topLevelObjects:& tl](即加载.XIB文件时)时,它被调用一次,因为.XIB文件正在设置FirstResponder到我的自定义AppDelegate,然后当main()调用[[myAppDelegate alloc] init]时再次调用它。

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

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

答案 11 :(得分:0)

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