2013-06-21 5 views
6

iPhoneとMac OS Xのアプリケーションで作業しています。これにより、近接してMacをロックしたりロック解除したりすることができます。信号の強さが決められたしきい値を下回っている場合、または接続が失われた場合は、Macをロックします。CoreBluetooth - backgrundモードでのiPhone広告

iPhoneをペリフェラル、Macをセントラルとして使用して、Apple CoreBluetoothフレームワークのBTLEを使用しています。ここまでは順調ですね。それも非常に良いwokrsしかし、私はiPhoneの背景にアプリを送信すると、広告が変化するようだ。 iPhoneはまだアドバタイズしているが、私がアプリで使っているサービスプロファイルや特性はない。 iPhoneがまだMacの範囲内にあるときは、まだ接続されていて特性が中央で使用されていないため、これは問題ではありませんが、iPhoneを範囲外に移動した後に問題になります。 Macがロックして、iPhoneの再接続が検出され、成功した場合はロックが解除されます。

しかし、この発見では、指定したサービスプロファイルと特性を使用して、アプリケーションを実行しているデバイスを取得し、ロックを解除するデバイスを特定するだけです。

サービスプロファイルなしで発見し、このiPhoneをロックとロック解除に使用したときに保存したUUIDで正しいデバイスを特定することで回避策を試しました。この回避策は小さな範囲でも機能します。なぜなら、iPhoneのBluetoothをオフにして再びオンにすると、別のUUIDが取得されるからです。それは私が暮らすことができる制約だが、数時間後にUUIDも変わってロック解除がうまくいかない。

誰かが既にそのようなアプリで作業していて、そのような問題を解決する方法を知っているのでしょうか?または、デバイスを識別するために使用できる静的な値を知っていますか?

答えて

5

だから、いつものように、Appleはフレームワーク内で奇妙でユニークなことをしているようです。 iOSデバイス(iPhoneなど)から広告を出すと、広告のための2つの「記憶領域」があります。通常のデバイスでは、スキャンしているデバイスはすべて見ることができ、「オーバーフロー」は、特にそれをスキャンしているiOSデバイスあなたのアプリがバックグラウンドで広告を出すと、あなたが宣伝しているすべてのサービスUUIDが残念ながらこのオーバーフローエリアに入ります。そのため、あなたのMacではなく他のiOSデバイスだけが見ることができます。 CBPeripheralManager docsから:

に割り当てられたスペースに合わないCBAdvertisementDataServiceUUIDsKeyキーの 値に含まれる任意のサービス汎用一意識別子(UUIDには)特殊な「オーバーフロー」領域に追加されます。明示的にスキャンしているiOSデバイスによってのみ検出される になる可能性があります。 アプリがバックグラウンドの場合、ローカル名は であると宣言されず、すべてのサービスUUIDがオーバーフロー領域に配置されます。

関連する問題