Iphone ApplicationIDBecomeActive被调用两次

Iphone ApplicationIDBecomeActive被调用两次,iphone,objective-c,ios,cocoa-touch,uiapplicationdelegate,Iphone,Objective C,Ios,Cocoa Touch,Uiapplicationdelegate,My app delegate方法ApplicationIDBecomeActive:在应用程序首次启动时被调用两次。我有一部分代码只想执行一次&我已将其放入applicationdidebecomeactive: 我该怎么办?您是否可能在Interface Builder和AppDelegate代码中创建了类的实例,或者?如果您有只想在应用程序启动时调用一次的代码,请使用 - (BOOL)application:(UIApplication *)application didFinishLau

My app delegate方法
ApplicationIDBecomeActive:
在应用程序首次启动时被调用两次。我有一部分代码只想执行一次&我已将其放入
applicationdidebecomeactive:


我该怎么办?

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

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

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


否则,每当你的应用程序再次激活时,就会调用ApplicationIDBecMeactive,因此这不仅仅意味着是你的两倍,而是每次用户在切换到另一个应用程序后切换回你的应用程序时

我明白了。我正在使用定位服务。在我点击位置服务警报上的“OK”后第一次启动时,我的ApplicationIDBecomeActive再次被调用,这是iOS的正常行为。

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

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


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

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


取消本地位置/推送通知后,将调用ApplicationIDBecMeactive。

对于Xcode 6,出现这种情况的一个新原因是:当您在可调整大小的模拟器中启动应用程序时,ApplicationIDBecMeactive:将被调用两次。它使用默认大小类启动应用程序,然后应用您上次使用的大小,即使您使用的是默认大小。任何时候应用大小类的更改时,都会调用ApplicationIDBecomeActive:。

如果希望在应用程序激活时只调用代码一次,请尝试从两个方法调用它。 1.使用选项完成启动 2.应用前景

而不是仅从ApplicationIDBecomeActive调用它。

关于:

  • 应用程序增量IDBECOMEACTIVE
  • 关闭时触发另一个ApplicationIDBecMeactive的权限请求或其他警报的回调事件递减

    • 当应用程序首次启动时 它按顺序调用

    • didfishlaunchingwithoptions
    • applicationIDBecomeActive
      两次)
    • 当我们打开它只调用

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

    • 应用程序将进入前台
    • applicationIDBECOMEACTIVE

    • 如果使用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()
          }
      

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

      我目前看到两个通知。这是因为我的AppDelegate的初始化代码被调用了两次。当main()执行[[NSBundle mainBundle]loadNibNamed:@“MainMenu”所有者:application topLevelObjects:&tl](即加载.XIB文件时)时,会调用一次该文件,因为.XIB文件正在设置自定义AppDelegate的第一响应程序,然后当main()调用[[myAppDelegate alloc]init]时会再次调用该文件

      addObserver调用的是init代码,因此为我关心的每个通知设置了两个观察者,这就是为什么我的通知会被调用两次


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

      我只是在
      applicationIDbecomeactive:
      的顶部检查请求是否真的发送了(我为此制作了一个函数,检查状态),如果是,我已经返回了。
      第二次在
      ApplicationIDBecomeActive:
      中,函数将状态读取为Deny或Allowed,因为这是在用户响应警报之后进行的。

      良好检查执行NSLog(@“%x”,(int)self);在该委托中,请确保它是同一个实例……即使是这种情况,应用程序对象本身也只能有一个委托,并且只能发送一次消息。@Grady:指针有一个格式说明符:
      NSLog(@“%p”,self)awakeFromNib
      init
      方法(在测试期间!)。我的答案与问题完全无关,我将在几秒钟内删除它。谢谢Iulius Cæsar。。。我认为在我的大脑中有一个格式说明符大小的洞,在这个洞里,一个漏掉了…在应用程序之间切换很好。我希望代码也能在那个时候执行。但是在第一次启动时,它会被调用两次?两个电话都一样吗?如果不是(也不应该是),那么这将导致您的问题。我们如何正确区分“真实”的应用程序IDBECOMEACTIVE:当我们的应用程序实际进入后台时,还是由于位置警报而强制进入后台时?我的应用程序每次激活时都需要身份验证。使用此位置警报,用户需要在警报弹出后立即输入密码。我需要避免这种情况发生。我的应用程序每次激活时都需要身份验证。使用此位置警报,用户需要输入pas