第一次启动应用程序时,我的应用程序委托方法applicationDidBecomeActive:
被调用了两次。我有一部分代码我只想执行一次并且我已经放入applicationDidBecomeActive:
我该怎么办?
第一次启动应用程序时,我的应用程序委托方法applicationDidBecomeActive:
被调用了两次。我有一部分代码我只想执行一次并且我已经放入applicationDidBecomeActive:
我该怎么办?
我得到了这个问题。我正在使用定位服务。在我点击位置服务警报上的“确定”后第一次启动时,我的 applicationDidBecomeActive 被再次调用一次,这是正常的 iOS 行为。
如果您只想在应用程序激活时调用您的代码一次,请尝试通过两种方法调用它。
didFinishLaunchingWithOptions
applicationWillEnterForeground
而不是只从applicationDidBecomeActive
.
这是因为位置或推送通知警报。
在本地位置/推送通知被解除后,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:
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 两次报告相同的日志消息。
就我而言,我可以通过关闭所有运行行为 -> 生成输出来防止这种情况。
使用 Xcode 6 有一个新的原因会发生这种情况:当您在可调整大小的模拟器中启动应用程序时,applicationDidBecomeActive
: 将被调用两次。
它使用默认大小类启动应用程序,然后应用您上次使用的大小——即使您使用的是默认值。任何时候应用大小类的变化,applicationDidBecomeActive
: 都会被调用。
关于什么:
applicationDidBecomeActive
applicationDidBecomeActive
减少权限请求的回调事件或关闭时触发另一个警报的其他警报。当应用程序第一次启动时,它会按顺序调用,
didFinishLaunchingWithOptions
applicationDidBecomeActive
(两次)当我们打开控制中心时,它只会调用,
applicationDidBecomeActive
当应用程序从后台到前台时,它会按顺序调用
applicationWillEnterForeground
applicationDidBecomeActive
我目前看到双重通知。
这是因为我的 AppDelegate 的初始化代码被调用了两次。
它在执行时(即加载 .XIB 文件时)被调用一次main()
,[[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:application topLevelObjects:&tl]
因为 .XIB 文件正在将 FirstResponder 设置为我的自定义 AppDelegate,然后在 main() 调用时再次调用它[[myAppDelegate alloc] init]
。
初始化代码是addObserver
调用的内容,因此为我关心的每个通知设置了两个观察者,这就是为什么我的通知被调用两次的原因。
我是一个新手 OS X 程序员,所以我还不确定解决这两个问题的最佳方法,但想在这里发布它以防它对其他人有帮助,另一个地方可以查看。
您是否可能在 Interface Builder 和 AppDelegate 代码中创建了您的类的实例?
如果您的代码只希望在应用程序启动时调用一次,请使用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
反而。
否则,每当您的应用程序再次激活时,都会调用 applicationDidBecomeActive ,因此这不仅意味着您的情况的两倍,而且每次用户在切换到另一个应用程序后切换回您的应用程序时。
如果您使用 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 上。
我只是检查applicationDidBecomeActive:
请求是否真的发送(我为此创建了一个函数,检查状态),如果是,我已经返回。第二次applicationDidBecomeActive:
,函数读取状态为拒绝或允许,因为这是在用户回答警报之后。