2013-11-21 9 views
7

Ich verwende das Beispiel für die Luftortung und die Überwachung von iBeacons nur mit uuid. Wenn ich das Ereignis "Region betreten" erhalte, kann ich nicht das Major und Minor von der Beacon/Region, die das Ereignis ausgelöst hat, bekommen, wenn ich nur nach der UUID suche (ich kann, wenn ich auf eine UUID mit überwache) spezifizierte Dur und Moll) - weiß jemand einen Weg dies zu tun/fehle ich etwas?iBeacon: Major und Minor erhalten - nur nach Uuid suchen

Ich will nicht wirklich hin beginnen - scheint nicht, wie ich brauchen sollte ..

(Der Anwendungsfall für viele Geschäfte alle mit Baken mit derselben UUID sagen, dann eine erteilende OS-Benachrichtigung mit den relevanten Informationen zu diesem Speicher (erhalten durch die Haupt- und Neben Abfrage))

Hier ist im Grunde, was ich tun:

CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid 
identifier:@"blah"]; 
region.notifyOnEntry = YES; 
region.notifyOnExit = YES; 
region.notifyEntryStateOnDisplay = YES; 

[self.locationManager startMonitoringForRegion:region]; 

Dann in der AppDelegate:

- (void) locationManager:(CLocationManager*)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion*)region { 

    // assume for now its the iBeacon 
    CLBeaconRegion *beaconRegion = (CLBeaconRegion*) region; 

    beaconRegion.major // hasn't been set... 

} 

Vielen Dank!

Antwort

19

Sie machen nichts falsch. So überraschend es auch erscheinen mag, die Überwachungs-API gibt Ihnen nicht die spezifischen Beacons, die den Regionswechsel ausgelöst haben.

Der Grund dafür, dass das Majoritätsobjekt nicht auf dem CLBeaconRegion-Objekt festgelegt ist, liegt darin, dass genau das gleiche Objekt zum Starten der Überwachung verwendet wurde und Sie dieses Feld auf null setzen (oder gar nicht gesetzt haben). . Was Sie suchen, ist eine zusätzliche Reihe von CLBeacon-Objekten. Und wie Sie vorschlagen, ist dies nur auf den Ranging-APIs vorhanden.

Es ist wirklich keine große Sache zu beginnen, zu rangieren. Einfach einstellen auf die exakt gleiche Zeit wie Sie die Überwachung starten:

CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid 
identifier:@"blah"]; 
region.notifyOnEntry = YES; 
region.notifyOnExit = YES; 
region.notifyEntryStateOnDisplay = YES; 

[self.locationManager startMonitoringForRegion:region]; 
[self.locationManager startRangingBeaconsInRegion:region]; 

Und wenn Sie nur über den ersten Bereich Anruf kümmern, können Sie ein Flag verwenden, um weitere Updates zu ignorieren:

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { 
    if (!_firstOneSeen) { 
     // Do something with beacons array here 
    } 
} 

Und zurücksetzen, die Flagge, wenn Sie die Region

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { 
    _firstOneSeen = NO; 
} 

Als Bonus verlassen, wird dies auch Ihre Überwachung Reaktionszeiten wesentlich schneller machen, wenn Ihre Anwendung im Vordergrund steht. Siehe: http://developer.radiusnetworks.com/2013/11/13/ibeacon-monitoring-in-the-background-and-foreground.html

+0

Vielen Dank David, das ist wirklich hilfreich. Danke auch für Ihre anderen SO Antworten, die von unschätzbarem Wert waren. – Matthew

+3

Guter Beitrag. Eine kleine Korrektur jedoch. Das Regionsobjekt, das Sie in den Aufrufen didEnterRegion/didExitRegion erhalten, ist nicht dasselbe CLBeaconRegion-Objekt, das Sie für die Registrierung verwendet haben - es handelt sich um eine Kopie. Ich weiß das, weil ich zuerst versucht habe, den Code der Form if (region == regionImTracking) zu verwenden und der Vergleich fehlgeschlagen ist. Ich loggte die beiden Regionen und ihre Adressen waren unterschiedlich, während alle ihre Einstellungen übereinstimmten. –

+0

Ah, wichtig zu wissen, danke! – davidgyoung

4

Leider ist die Bestimmung der Haupt- und Nebenwerte nur in der iBeacon-Ranging-API und nicht in der iBeacon-Überwachungs-API verfügbar, wenn Sie nur über UUID überwacht werden. Darüber hinaus

1) iBeacon Ranging funktioniert nicht, während Ihre App im Hintergrund ist. Das bedeutet, wenn Ihre App im Hintergrund ist (was für diese Art von Apps meistens der Fall ist), können Sie den Haupt- und Nebenaspekt eines iBeacon nicht bestimmen, es sei denn, Sie haben anhand von UUID, Major und Minor, überwacht.

2) Sie können nur maximal 20 iBeacons gleichzeitig überwachen. Dies bedeutet, dass Sie, wenn Sie auf UUID, Major und Minor zurückgreifen (um die Rangfolge in der Hintergrundausgabe zu umgehen), auf nur 20 iBeacons beschränkt sind (eine große Einschränkung in den meisten praktischen Fällen).

3) Für maximale Skalierbarkeit (da Sie nur 20 iBeacons gleichzeitig überwachen können) wäre es am besten, nur mit UUID zu überwachen, den Benutzer zu benachrichtigen, wenn ein iBeacon dieser UUID erkannt wird und nach Benachrichtigung den Benutzer bestätigen könnte App in den Vordergrund.Sobald die App im Vordergrund ist, kann eine Rangfolge auftreten, um den Haupt- und Nebenbereich des iBeacon zu bestimmen.

All dies führt mich zu der Frage, warum Apple nicht das Array von iBeacons enthalten, die den Eingang/Ausgang in der Überwachungs-API überhaupt auslösen. Ich überlasse dies Apple für einen Kommentar. Der folgende Beitrag geht sehr ins Detail zu diesem IBeacon Verhalten/Einschränkungen - iBeacon in the background - Use cases

+0

Sie können die Kommentare zum Bereich im Hintergrund bei der Frage, die Sie verknüpfen, überprüfen. –

0
  • CLBeaconRegion die Filterkriterien sind Baken zu finden. Was Sie also weitergeben, ist, was Sie zurückbekommen werden, wenn "didEnterRegion" Delegate feuert. Keine Überraschungen dort.

  • CLBeacon ist der individuelle Beacon, der die Filterkriterien erfüllen muss, um den didEnterRegion-Delegaten auszulösen. Hier finden Sie die wichtigsten, untergeordneten Werte. Um das Beacon zu erhalten, das gefeuert wurde, müssen Sie die ranging API startRangingBeaconsInRegion aufrufen und eine Anzahl von 5 angeben, bevor Sie die Entfernungsmessung stoppen. Tun Sie dies, nachdem Sie den Rückruf didEnterRegion erhalten haben. Dies ist für die Hintergrundüberwachung von Beacons vorgesehen, wenn Sie Ihre App nicht starten möchten. Notieren Sie sich jedoch, wenn ein Benutzer an einem Beacon vorbeifliegt, um auf dem Server Informationen für eine zielgerichtetere Kampagne zu sammeln.

Manchmal reichen keine Baken, die beaconRegion in dem Rückruf in diesem Fall finden könnte verwenden für startRangingBeaconsInRegion nach unten zu beachten, dass jemand ein Leuchtfeuer Region eingetragen.