2012-04-24 2 views
18

Мой метод делегирования приложения applicationDidBecomeActive: получает вызов дважды в первый раз при запуске приложения. У меня есть часть кода, которую я хочу выполнить только один раз &, который я положил в applicationDidBecomeActive:applicationDidBecomeActive получение вызова дважды

Что мне делать?

+2

Что трассировки стека выглядеть, когда вы установили точку останова на applicationDidBecomeActive :? Это то же самое для обоих вызовов? Если нет (и этого не должно быть), то это должно привести вас к вашей проблеме. –

ответ

35

У меня проблема. Я использую службы местоположения. При первом запуске после того, как я нажимаю «OK» на предупреждении службы местоположения, приложение applicationDidBecomeActive вызывается еще раз, что является обычным поведением iOS.

+0

Мое приложение требует аутентификации каждый раз, когда оно становится активным. При этом предупреждении о местоположении пользователю необходимо ввести пароль для ввода пароля сразу после появления предупреждения. Мне нужно избегать такой ситуации. –

+0

@LocPham: Мое предложение состояло в том, чтобы сохранить переменную экземпляра в файле реализации делегата приложения и приращение при вызове applicationDidBecomeActive. Не выполняйте свой код входа в систему, если эта переменная имеет значение> 1. Не забудьте перезагрузить его. Кроме того, это предложение чисто основано на ваших требованиях, не видя ваш код. Может быть, лучший способ. – Abhinav

0

Возможно, вы создали экземпляр своего класса в Interface Builder и в вашем коде AppDelegate?

+0

хорошая проверка делает NSLog (@ "% x", (int) self); в этом делейтете, убедитесь, что это один и тот же экземпляр ... –

+0

Даже если это так, сам объект приложения может иметь только один делегат и будет отправлять сообщение только один раз. –

+0

@Grady: существует спецификатор формата для указателей: 'NSLog (@"% p ", self);' –

0

Если у вас есть код, который вы хотите назвать только один раз, когда приложение запускается, а затем использовать

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

вместо этого.

В противном случае приложениеDidBecomeActive будет вызываться всякий раз, когда ваше приложение снова станет активным, так что это не просто означает дважды, как в вашем случае, но каждый раз, когда пользователь переключается обратно в ваше приложение после переключения на другое.

+0

Переключение между приложениями в порядке. Я хочу, чтобы код тоже выполнялся. Но при первом запуске, его называют дважды. – Abhinav

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 сообщает те же сообщения журнала дважды.

В моем случае я смог предотвратить это, отключив все Behaviors для Running -> Generate Output.

9

Это связано с расположением или уведомлением о предупреждении.

После того, как исходное местоположение/push-уведомление было отклонено, будет вызываться applicationDidBecomeActive.

+2

Как мы правильно различаем «истинное» приложениеDidBecomeActive: когда наше приложение действительно ушло на задний план и насильно ушло в фон из-за предупреждения о местоположении? –

+0

Мое приложение требует аутентификации каждый раз, когда оно становится активным. При этом предупреждении о местоположении пользователю необходимо ввести пароль для ввода пароля сразу после появления предупреждения. Мне нужно избегать такой ситуации. –

2

С Xcode 6 возникает новая причина: при запуске приложения в изменяемом по размеру симуляторе applicationDidBecomeActive: вызывается дважды. Он запускает приложение с классом размера по умолчанию, а затем применяет использованный вами размер, даже если вы использовали настройки по умолчанию. Каждый раз, когда применяется изменение класса размера, вызывается applicationDidBecomeActive:.

7

Если вы хотите позвонить своему коду только один раз, когда приложение станет активным, попробуйте называть его двумя способами. 1. didFinishLaunchingWithOptions 2. applicationWillEnterForeground

вместо того, чтобы называть его только с помощью приложенияDidBecomeActive.

+1

Это должен быть принятый ответ. – Darko

0

насчет:

  • Increment на applicationDidBecomeActive
  • декремента на обратного вызова событий разрешений запросов или других предупреждений, которые вызывают еще applicationDidBecomeActive при закрытии.
0

Когда приложение запускает первый время вызывается последовательно,

  1. didFinishLaunchingWithOptions
  2. applicationDidBecomeActive (Дважды)

Когда мы открываем Control Center это вызывает только

applicationDidBecomeActive 

Когда приложение приходят от фона на передний план его называет последовательно

  1. applicationWillEnterForeground
  2. applicationDidBecomeActive
Смежные вопросы