2013-06-21 12 views
6

Ich arbeite an einer iPhone und Mac OS X Anwendung, mit der Sie Ihren Mac über die Nähe sperren und entsperren können. Wenn die Signalstärke unter einem bestimmten Schwellenwert liegt oder die Verbindung verloren geht, wird der Mac gesperrt.CoreBluetooth - iPhone Werbung im Hintergrundmodus

Ich arbeite mit Apple CoreBluetooth Framework für BTLE, mit dem iPhone als Peripheriegerät und den Mac als zentrale. So weit, ist es gut. Es funktioniert auch sehr gut, aber wenn ich die App zum Hintergrund auf dem iPhone schicke, scheint sich die Werbung zu ändern. Das iPhone bewirbt sich immer noch, aber ohne das Dienstprofil und die Eigenschaften, die ich in der App verwende. Obwohl dies kein Problem ist, wenn das iPhone immer noch in Reichweite des Mac ist, weil es immer noch verbunden ist und die Eigenschaften nicht in der Mitte verwendet werden, wird es ein Problem, nachdem das iPhone aus dem Bereich verschoben wurde. Wie erwartet, sperrt der Mac und beginnt zu entdecken, das iPhone wieder zu verbinden und entsperren, wenn erfolgreich.

Bei dieser Ermittlung verwende ich jedoch das angegebene Serviceprofil und die Merkmale, um nur Geräte zu erhalten, auf denen meine App ausgeführt wird, und um die zum Entsperren zu identifizieren.

Ich probierte einen Workaround, indem ich ohne ein Dienstprofil entdeckte und das richtige Gerät über seine UUID identifizierte, die ich speicherte, als ich begann, dieses iPhone zum Sperren und Entsperren zu verwenden. Diese Problemumgehung funktioniert auch in einem kleinen Umfang, denn wenn ich Bluetooth auf dem iPhone ausschalte und wieder einschalte, erhält es eine andere UUID. Das ist eine Einschränkung, mit der ich leben könnte, aber es ändert auch die UUID nach ein paar Stunden und dann funktioniert das Entsperren nicht.

Vielleicht hat schon jemand an einer solchen App gearbeitet und weiß, wie man ein solches Problem beheben kann? Oder kennen Sie einen statischen Wert, mit dem ich das Gerät identifizieren kann?

Antwort

5

So scheint es, wie üblich, Apple hat einige seltsame und einzigartige Dinge in ihrem Rahmen. Wenn Sie von einem iOS-Gerät (z. B. Ihrem iPhone) aus werben, gibt es zwei "Speicherbereiche" für die Werbung - eine normale, die jedes scannende Gerät sehen kann, und eine "Überlauf", die nur von gesehen werden kann iOS-Geräte, die gezielt danach suchen. Wenn Ihre App im Hintergrund wirbt, werden alle UUIDs für Dienste, die Sie inserieren, in diesen Überlaufbereich geschaltet. Es sieht also so aus, als ob nur andere iOS-Geräte sie sehen können - und nicht Ihr Mac. Aus den CBPeripheralManager docs:

Jeder Dienst universell eindeutigen Kennungen (UUID) im Wert des CBAdvertisementDataServiceUUIDsKey Schlüssels enthalten ist, die in den zugewiesenen Raum passen nicht zu einem speziellen „Überlauf“ Bereich hinzugefügt werden; Sie können nur von einem iOS-Gerät erkannt werden, das explizit nach ihnen sucht. Während sich Ihre App im Hintergrund befindet, wird der lokale Name nicht angekündigt und alle Dienst-UUIDs werden im Überlaufbereich platziert.

Verwandte Themen