2013-10-17 12 views
10

Ich arbeite an einer iOS App, die für iBeacon Regionen überwacht. Wenn die App im Hintergrund ausgeführt wird, möchte ich eine lokale Benachrichtigung senden, wenn sie auf eine bestimmte iBeacon-Region trifft. Alles funktioniert gut, bis auf eine Sache: locationManager: didEnterRegion wird offenbar erst aufgerufen, wenn der Benutzer den Sperrbildschirm anzeigt. Selbst wenn das Gerät eine iBeacon-Region durchlaufen hat, während sich die App im Hintergrund befand, erhalten sie die Benachrichtigung erst, wenn sie den Sperrbildschirm anzeigen.iBeacons: Wenn App im Hintergrund ist, locationManager: didEnterRegion: wird nur aufgerufen, wenn der Sperrbildschirm angezeigt wird

Ich habe auch versucht mit startMonitoringForRegion, und diese Art von funktioniert - wenn die App im Hintergrund ausgeführt wird, wird locationManager: didDetermineState: ausgelöst, wenn das Gerät die iBeacon-Region eintritt. Dies geschieht jedoch nur einmal. Wenn der Benutzer anschließend die iBeacon-Region verlässt und wieder einkehrt, wird locationManager: didDetermineState nicht erneut ausgelöst.

Ich betreibe ein iPhone 5s und benutze ein iPhone 4s als iBeacon, wenn das einen Unterschied macht.

Korrektur: Dieses Phänomen tritt offensichtlich nur dann auf, wenn ich ein iPhone 4s als Client verwende. Wenn ich eine 5s verwende, wird die Benachrichtigung sofort geliefert.

Antwort

5

Ich versuche nur, mehr Informationen zu bekommen. Haben Sie notifyEntryStateOnDisplay in der CLBeaconRegion auf YES gesetzt? Es hört sich so an.

Aus Dokumentation:

Wenn auf YES gesetzt, sendet der Positionsmanager Leuchtfeuer-Benachrichtigungen, wenn der Benutzer auf dem Display schaltet sich das Gerät ist bereits in der Region. Diese Benachrichtigungen werden gesendet, selbst wenn Ihre App nicht ausgeführt wird. In diesem Fall startet das System Ihre App in den Hintergrund, sodass sie die Benachrichtigungen verarbeiten kann. In beiden Situationen ruft der Standortmanager die Methode locationManager: didDetermineState: forRegion: des zugehörigen Delegate-Objekts auf.

Der Standardwert für diese Eigenschaft ist NO.

+0

notifyEntryStateOnDisplay wird auf YES gesetzt. Wenn ich die App starte, schalte iBeacon ein, didDetermineState wird unabhängig davon ausgelöst, ob sich die App im Vordergrund oder im Hintergrund befindet, und alles ist gut. Wenn ich dann den iBeacon ausschalte, warte eine Minute und schalte ihn dann wieder ein, didDetermineState zündet nicht mehr, wenn die App im Vordergrund oder im Hintergrund ist. Ich habe überprüft, und ich stopMonitoringForRegion nicht überall anrufen. Es scheint fast so, als wäre es nur einmal zu feuern. –

+0

Ich glaube ich habe es - ich ging davon aus, dass alles in Echtzeit passieren würde, aber laut dem folgenden Link muss man manchmal ein paar Minuten zwischen dem Ausschalten und dem erneuten Einschalten eines iBeacon warten. Als ich fünf Minuten gewartet habe, fingen die Delegiertenmethoden wieder an zu feuern. –

+0

http: // Stapelüberlauf.com/questions/19670513/local-notifications-only-received-once-ibeacons –

1

Ich hatte ein ähnliches Problem und versuchte verschiedene Code-Level-Änderungen oben (und andere Beiträge). Ranging funktionierte, aber die Erkennung der Enter- und Exit-Zone nicht.

Es stellte sich heraus, dass ich App Hintergrundaktualisierung ausgeschaltet hatte. Sobald ich die Hintergrund-App aktiviert hatte, funktionierte das Eingeben und Verlassen der Zonen korrekt.

+0

Kannst du bitte erklären, wie du App Background Refresh aktiviert hast? – fvisticot

+0

Sicher Sache. Öffnen Sie die Einstellungen-App und klicken Sie dann auf Allgemein -> Hintergrund-App-Aktualisierung -> Hintergrund-App-Aktualisierung aktivieren – draftalyzer

+2

FYI, die Anforderung zum Aktualisieren der Hintergrund-App wurde für Beacon- und Geofence-Updates entfernt. Es war eine Voraussetzung in iOS 7, aber nicht länger für iOS 8. Ihre App wird nicht in der Liste der Apps für BAR in iOS 8 angezeigt. –

0

Ich hatte genau das gleiche Problem. Ich war mir sicher, dass ich alles in Ordnung gebracht habe.

Die Lösung war sehr einfach: Entfernen Sie einfach die App vom Gerät und führen Sie sie erneut in Xcode . Es hat für mich wie ein Zauber funktioniert.