iBeacon: App im Background nach Device scannen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • iBeacon: App im Background nach Device scannen

    Hallo zusammen :)

    Ich habe ein kleines Problem:
    Laut Appe solles möglich sein, nach BLE-Devices zu scannen (CBCentralManager), selbst wenn die App im Hintergrund läuft.
    Klappt bei mir auch soweit. Jetzt möchte ich aber einen Scanvorgang anwerfen, wenn ein iBeacon gefunden wurde, nach welchen ich scanne. Sprich das Delegate

    Quellcode

    1. - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
    bzw.

    Quellcode

    1. - (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region

    In einer der beiden Methoden möchte ich einen BLE-Scan anwerfen, mit

    Quellcode

    1. [centralManager scanForPeripheralsWithServices:services options:nil];

    Leider wird der Scan erst gestartet, wenn ich die App in den Foreground-State hole- vorher passiert ich Background nix.
    Ich hab als UIBackgroundMode "Uses Bluetooth LE accessories" gesetzt, klappt aber nicht.

    Zum besseren Verständnis:
    Ich möchte nicht zu dem gefundenen iBeacon connecten (was ja auch bekanntlicherweise nicht funktioniert), sonder dieses arbeitet nur als Trigger, um dann mit einem vollwertigem BLE-Device eine Verbindung einzugehen.
    Sollte doch möglich sein, oder?

    LG

    Der Tele :thumbsup:
    Loves Metal :evil:
  • Telecaster95 schrieb:

    Jetzt möchte ich aber einen Scanvorgang anwerfen, wenn ein iBeacon gefunden wurde, nach welchen ich scanne.

    Ich verstehe nicht.
    Dein Scanvorgang läuft. Dein Scanvorgang findet einen iBeacon. Dann möchtest Du nach iBeacons scannen?
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ah, fein. Jetzt verstehe auch ich es einigermaßen. ;)
    Also in dem Fall gibt es mindestens folgende zwei Möglichkeiten:

    1) Apple lügt
    2) Die Delegate Methoden werden erst aufgerufen, wenn die App aus dem Hintergrund aufgetaucht ist

    Ich persönlich vermute Letzteres. Hast Du das geprüft?
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Warum willst du das so umständlich machen und scannst du nicht gleich mit CB im Hintergrund? Spätestens beim Verbindungsaufbau wirst du allerdings Probleme bekommen, der geht meines Wissens nicht im Hintergrund.

    Edit: Die CL-Delegates kommen im Hintergrund rein, aber einen CB-Scan zu starten geht nur im Vordergrund. Das stimmt schon.
    Multigrad - 360°-Produktfotografie für den Mac
  • @Marco Feltmann
    Die Delegates zum Erkennen von iBeacons werden perfekt im Background aufgerufen.
    Die Delegates fürs Scannen, die werden erst aufgerufen wenn die App geöffnet wird.

    @mattik
    Das sind Vorgaben die ich beachten muss, und ich denke auch dass das permanente Scannen nach BLE-Devices mehr Batterieleistung verbraucht, als das nach iBeacons.
    Ich denke nicht, dass der Verbindungsaufbau Probleme machen dürfte:
    While your app is in the background you can still discover and connect to peripherals, and explore and interact with peripheral data.

    Quelle: Apple Documentation Core Bluetooth
    Loves Metal :evil:
  • Verbindungsaufbau im Hintergrund muss ich nochmal checken, beim letzten Mal gab's da irgend einen Haken, deshalb hate ich das noch im Hinterkopf. Kann aber gut sein, dass der an einer anderen Stelle war.

    Das Scannen selbst dürfte nicht mehr verbrauchen, es ist der gleiche Vorgang. Um die Scanintervalle kümmert sich Apple, da hat man eh keine Aktien drin. Aber auf Senderseite verbraucht es doppelt so viel, zwei Announcements in die Luft zu pusten...

    Edit: Wenn das wirklich so Vorgabe ist (eine ziemlich unsinnige), dann würde ich beide Scans parallel starten und dann im Hintergrund die Callbacks zusammenfummeln. Das kostet auch nicht mehr Strom - das Gerät hat nur ein BLE-Radio, während der Scanintervalle hört es auf alles.
    Multigrad - 360°-Produktfotografie für den Mac
  • Diese Vorgabe macht Sinn:
    Ich werde selbst bei geschlossener App darüber informiert, ob mein gewünschtes iBeacon in Reichweite ist. Das ist für normale BLE-Devices nicht möglich. Bzw. wird die App die permanent im Hintergrund scannt, irgendwann terminiert (hab was von max. 10min. im Kopf).
    Meine Frage ist jetzt: Muss der Scanvorgang im Vordergrund gestartet werden, damit man Callbacks auch im Hintergrund bekommt (das funktioniert nämlich), oder kann die App den Scanvorgang auch im Hintergrund starten?
    Bringt es denn eventuell das in einen anderen Thread auszulagern? Vllt. blockiert der GUI-Thread das ja? Keine Ahnung..
    Loves Metal :evil:
  • Ich habe den Vorgang mit GDC in einen eigenen Thread gepackt und dabei festgestellt, dass das Delegate welches aufgerufen wird wenn ein BLE-Device gefunden wurde trotztdem über dem Mainthread läuft.
    Alles was davor passiert, Deklarieren und Initialisieren von Variablen, etc. läuft über GDC..

    Ich denke dass da der Fehler liegt
    Loves Metal :evil:
  • Ich habe das Problem gefunden:
    Wenn im Background nach BLE-Devices gescannt werden soll, dann darf als Parameter für die Services nicht nil übergeben werden.
    Nämlich

    Quellcode

    1. [centralManager scanForPeripheralsWithServices:services options:nil];

    und nicht

    Quellcode

    1. [centralManager scanForPeripheralsWithServices:nil options:nil];

    Ist der Parameter nil (um nach allen Devices zu scannen), wird im Background kein Delgate getriggert. Wird als Parameter ein NSArray mit den Service UUID´s übergeben, dann wird das Delegate getriggert. Seltsam..

    Danke trotztem für Eure Hilfe!

    LG,

    Tele
    Loves Metal :evil: