2012-04-24 18 views
18

Meine App Delegate Methode applicationDidBecomeActive: wird zweimal beim ersten Start der Anwendung aufgerufen. Ich habe einen Teil des Codes, die ich nur einmal ausführen möchte &, die ich in applicationDidBecomeActive: setzenapplicationDidBecomeActive wird zweimal aufgerufen

Was soll ich tun?

+2

Was wie sich die Stack-Trace aussehen, wenn Sie einen Haltepunkt auf applicationDidBecomeActive gesetzt :? Ist es bei beiden Anrufen identisch? Wenn nicht (und es sollte nicht sein), dann sollte das Sie zu Ihrem Problem führen. –

Antwort

35

Ich habe das Problem. Ich verwende Location Services. Beim ersten Start nach dem Tippen auf "OK" in der Standortdienste-Warnung wird mein applicationDidBecomeActive noch einmal aufgerufen, was dem normalen iOS-Verhalten entspricht.

+0

Meine App erfordert bei jeder Aktivierung eine Authentifizierung. Bei dieser Standortwarnung muss der Benutzer direkt nach dem Aufrufen der Warnung ein Kennwort eingeben. Ich muss vermeiden, dass diese Situation passiert. –

+0

@LocPham: Mein Vorschlag wäre, eine Instanzvariable in der Anwendungsdelegatenimplementierungsdatei zu behalten, und increment ist, wenn applicationDidBecomeActive aufgerufen wird. Führen Sie Ihren Anmeldealarmcode nicht aus, wenn diese Variable einen Wert> 1 hat. Vergessen Sie nicht, sie zurückzusetzen. Außerdem basiert dieser Vorschlag ausschließlich auf Ihrer Anforderung, ohne Ihren Code zu sehen. Könnte auch ein besserer Weg sein. – Abhinav

0

Haben Sie möglicherweise eine Instanz Ihrer Klasse im Interface Builder UND in Ihrem AppDelegate-Code erstellt?

+0

good check mache einen NSLog (@ "% x", (int) self); Stellen Sie in diesem Delegat sicher, dass es dieselbe Instanz ist ... –

+0

Auch wenn dies der Fall ist, kann das Anwendungsobjekt selbst nur einen Delegaten haben und würde die Nachricht nur einmal senden. –

+0

@Grady: Es gibt einen Formatbezeichner für Zeiger: 'NSLog (@"% p ", selbst);' –

0

Wenn Sie Code haben Sie nur einmal aufgerufen werden soll, wenn die App gestartet wird, verwenden Sie dann

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

statt.

Andernfalls wird applicationDidBecomeActive immer dann aufgerufen, wenn Ihre App wieder aktiv wird. Dies bedeutet nicht nur doppelt so viel wie in Ihrem Fall, sondern jedes Mal, wenn der Benutzer nach dem Wechsel zu einer anderen App zurückwechselt.

+0

Wechsel zwischen Anwendungen ist in Ordnung. Ich möchte, dass Code auch zu dieser Zeit ausgeführt wird. Aber beim ersten Start selbst wurde es zweimal aufgerufen. – Abhinav

1

Ich weiß nicht, ob das hilft, aber ich hatte gerade das gleiche Problem mit einer ganz einfachen App, die keine Location Services verwendet, und ich fand heraus, es ist eine Illusion. Schauen Sie sich die Log-Meldungen Ich habe:

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: 

Blick eng. Schauen Sie sich die mal. Die erste und dritte Nachricht haben die gleiche Zeit. Die zweite und vierte Nachricht haben die gleiche Zeit. Sie sind die gleichen Nachrichten! Es ist ein Xcode-Bug; Es hat nichts mit meinem Code zu tun. Xcode meldet dieselben Protokollnachrichten zweimal.

In meinem Fall konnte ich dies verhindern, indem ich alle Behaviors für Running -> Generates Output abstellte.

9

Dies liegt an der Standort- oder Push-Benachrichtigungswarnung.

Nachdem die systemeigene Position/Push-Benachrichtigung zurückgewiesen wurde, wird applicationDidBecomeActive aufgerufen.

+2

Wie unterscheiden wir richtig zwischen einer "echten" AnwendungDidBecomeActive: Wenn unsere App tatsächlich in den Hintergrund trat oder aufgrund eines Standortalarms zwangsweise in den Hintergrund geriet? –

+0

Meine App erfordert bei jeder Aktivierung eine Authentifizierung. Bei dieser Standortwarnung muss der Benutzer direkt nach dem Aufrufen der Warnung ein Kennwort eingeben. Ich muss vermeiden, dass diese Situation passiert. –

2

Mit Xcode 6 gibt es einen neuen Grund dafür: Wenn Sie eine App in einem skalierbaren Simulator starten, wird applicationDidBecomeActive: zweimal aufgerufen. Es startet die App mit der Standardgrößenklasse und wendet dann die Größe an, die Sie zuletzt verwendet haben - auch wenn Sie die Standardwerte verwenden. Immer wenn eine Größenklasse geändert wird, wird applicationDidBecomeActive: aufgerufen.

7

Wenn Sie Ihren Code nur einmal aufrufen möchten, wenn die App aktiv wird, versuchen Sie, ihn von zwei Methoden aus aufzurufen. 1. didFinishLaunchingWithOptions 2. applicationWillEnterForeground

anstatt es nur von applicationDidBecomeActive aufrufen.

+1

Dies sollte die akzeptierte Antwort sein. – Darko

0

Was:

  • Erhöhungsschritte auf applicationDidBecomeActive
  • Decrement auf Callback-Ereignisse von Berechtigungen Anfragen oder andere Warnungen, die eine andere applicationDidBecomeActive auslösen, wenn sie geschlossen.
0

Wenn App startet erste Zeit es nacheinander aufruft,

  1. didFinishLaunchingWithOptions
  2. applicationDidBecomeActive (Zweimal)

Wenn wir die Control Center öffnen es nur Anrufe,

applicationDidBecomeActive 

Wenn App Hintergrund kommen, um es in den Vordergrund ruft der Reihe nach

  1. applicationWillEnterForeground
  2. applicationDidBecomeActive
Verwandte Themen