質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

Q&A

解決済

1回答

6673閲覧

iOS、BLE接続でCBCentralManagerOptionRestoreIdentifierKeyを設定するとBLEと接続ができなくなる。

SatoTakeshiX

総合スコア113

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

1グッド

1クリップ

投稿2016/01/21 09:08

iOSでBLE接続をするアプリを作っております。
iOSアプリがBLE通信の受信側(セントラル)です。
アプリが停止したあとも自動でBLE機器の近くに来た時に通信させたいと思い、状態の保存と復元を実装しようとしました。
ところが、CBCentralManagerクラスの初期化のオプションCBCentralManagerOptionRestoreIdentifierKeyを追加したところ、アプリ側BLEの受信ができなくなってしまいました。

何か、接続方法で間違ってしまったのでしょうか。接続できるようにしたいと思っています。なにか情報があれば(確認すべき点)お伝えいただけると幸いです。

また不足している情報があればお伝え下さい。

Objective

1-(void)initPropertyWithUUIDs:(NSArray *)UUIDS 2{ 3 //BluetoothがOFFの場合にアラートを出す 4 NSDictionary *options = @{ 5 6 CBCentralManagerOptionRestoreIdentifierKey:@"myidentifierKey",//->追加して接続ができなくなってしまいました。 7 CBCentralManagerOptionShowPowerAlertKey:@YES 8 9 }; 10 11 self.centralManager = [[CBCentralManager alloc] initWithDelegate:self 12 queue:nil 13 options:options]; 14}

上記の初期化をしたところ、BLEの接続ができなくなってしまいました。
ちなみに下記のようにコメントアウトして、CBCentralManagerOptionShowPowerAlertKeyのみ指定したところ接続を確認しています。
CBCentralManagerOptionRestoreIdentifierKeyの追加だけでなぜ接続すらできなくなってしまったのかがわからい状態です。

Objective

1 //BluetoothがOFFの場合にアラートを出す 2 NSDictionary *options = @{ 3 4 // CBCentralManagerOptionRestoreIdentifierKey:@"myidentifierKey",//->追加して接続ができなくなってしまいました。 5 CBCentralManagerOptionShowPowerAlertKey:@YES 6 7 };

ちなみに、実際に接続させるメソッドはこちらです。

Objective

1-(void)connectStart 2{ 3 // 探索対象のデバイスが持つサービスを指定 4 NSArray *services = [NSArray arrayWithObjects:[CBUUID UUIDWithString:kUUIDforService],nil]; 5 // 単一デバイスの発見イベントを重複して発行させない 6 NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] 7 forKey:CBCentralManagerScanOptionAllowDuplicatesKey]; 8 //接続開始 9 [self.centralManager scanForPeripheralsWithServices:services 10 options:options]; 11}

また、状態の保存と復元を行うデリゲートメソッドも下記のように実装しています。

Objective

1-(void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary<NSString *,id> *)dict 2{ 3 4 NSLog(@"状態の保存と復元"); 5 6 NSString *msg = [NSString stringWithFormat:@"セントラル復元:%@", dict]; 7 8 //復元されたかどうかをみるためにローカル通知を発行させる 9 if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) { 10 11 UILocalNotification *localNotification = [UILocalNotification new]; 12 localNotification.alertBody = msg; 13 localNotification.fireDate = [NSDate date]; 14 localNotification.soundName = UILocalNotificationDefaultSoundName; 15 [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 16 17 } 18}

iPhone6 plus iOS9.2で開発しています。

ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

queueの指定をするとどうなるでしょうか?

objectivec

1dispatch_queue_t queue = dispatch_queue_create("hogehoge", 0); 2self.centralManager = [[CBCentralManager alloc] initWithDelegate:self 3 queue:queue 4 options:options];

投稿2016/01/21 09:33

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SatoTakeshiX

2016/01/21 09:56

@fuzzballさんありがとうございます。 お伝え頂いたとおり、queueを設定しました。しかし、まだBLEに接続されません。。 スレッドを変えたほうがいいのでしょうか。 `self.centralManager`などのBLEと通信する処理と`CBCentralManagerDelegate`デリゲートメソッドの実装はシングルトンで一つのクラスにまとめてつくっていますが、それが悪さをしていますかね?? ```Objective C self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:queue options:options]; ```
fuzzball

2016/01/21 10:45

CentralManagerのstateはPoweredOnになっていますか?
SatoTakeshiX

2016/01/21 11:03

>CentralManagerのstateはPoweredOnになっていますか? 実際接続を実行する下記のメソッドでself.centralManagerのステイタスを調べました。 ```Objective-C -(void)connectStart { // 探索対象のデバイスが持つサービスを指定 NSArray *services = [NSArray arrayWithObjects:[CBUUID UUIDWithString:kUUIDforService],nil]; // 単一デバイスの発見イベントを重複して発行させない NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:CBCentralManagerScanOptionAllowDuplicatesKey]; //接続開始 [self.centralManager scanForPeripheralsWithServices:services options:options]; switch (self.centralManager.state) { case CBCentralManagerStatePoweredOff: NSLog(@"CBCentralManagerStatePoweredOff"); break; case CBCentralManagerStatePoweredOn: NSLog(@"CBCentralManagerStatePoweredOn"); break; case CBCentralManagerStateResetting: NSLog(@"CBCentralManagerStateResetting"); break; case CBCentralManagerStateUnauthorized: NSLog(@"CBCentralManagerStateUnauthorized"); break; case CBCentralManagerStateUnknown: NSLog(@"CBCentralManagerStateUnknown"); break; case CBCentralManagerStateUnsupported: NSLog(@"CBCentralManagerStateUnsupported"); break; default: break; } } ``` するとNSLogの結果は以下のようになっていました。 ``` 2016-01-21 20:00:07.732 BLEAPP[592:219895] CBCentralManagerStateUnsupported ``` CBCentralManagerStateUnsupportedってどうゆう状態でしょうか? 返信ありがとうございます!
SatoTakeshiX

2016/01/21 11:05

あ、ちょっと私も調べます。。
SatoTakeshiX

2016/01/21 11:22

.BLE通信はバックグラウンドでも通信を許可しています
fuzzball

2016/01/21 11:33

スマホからなので手抜きコメントです。 Unsupportedについてですが、init直後はPoweredOnになっていません。 http://qiita.com/shu223/items/f67f1b0fb1840cf0bd63 この記事のトラブル1を参照して下さい。 これに該当していないでしょうか?
SatoTakeshiX

2016/01/21 16:41

ありがとうございます。明日確認します!
SatoTakeshiX

2016/01/22 06:21

centralManagerDidUpdateStateメソッドで、下記のように、ステータスを確認しつつ、スキャンしようとしたところ、始めに、CBCentralManagerStatePoweredOnの状態になったあとに、CBCentralManagerStateUnsupportedに変化してしまっておりました。 ``` #pragma mark - CBCentralManagerDelegate -(void)centralManagerDidUpdateState:(CBCentralManager *)central { //PowerdONになったらスキャンOK //初期化してそのままスキャンしたいときは、したの処理でスキャンメソッドを呼ぶ switch (central.state) { case CBCentralManagerStatePoweredOn: NSLog(@"CBCentralManagerStatePoweredOn:%s", __func__); self.sensorStatus = SENSOR_STATUS_POWERED_ON; //cause table of found peripherals to be updated if ([self.delegate respondsToSelector:@selector(statusChanged:)]) { [self.delegate statusChanged:SENSOR_STATUS_POWERED_ON]; } break; case CBCentralManagerStateUnsupported: NSLog(@"CBCentralManagerStateUnsupported:%s", __func__); break; case CBCentralManagerStateUnknown: NSLog(@"CBCentralManagerStateUnknown:%s", __func__); break; case CBCentralManagerStateUnauthorized: NSLog(@"CBCentralManagerStateUnauthorized:%s", __func__); break; case CBCentralManagerStateResetting: NSLog(@"CBCentralManagerStateResetting:%s", __func__); break; case CBCentralManagerStatePoweredOff: NSLog(@"CBCentralManagerStatePoweredOff:%s", __func__); break; default: break; } } ``` 実行時のログです。 ``` 2016-01-22 15:17:35.051 BLEAPP[2888:727006] CBCentralManagerStatePoweredOn:-[Sensor centralManagerDidUpdateState:] 2016-01-22 15:17:35.051 BLEAPP[2888:727006] CBCentralManagerStateUnsupported:-[Sensor centralManagerDidUpdateState:] ```
SatoTakeshiX

2016/01/22 06:55

現状のプロジェクトがCentralManagerの初期化がおかしい可能性があるので、新しくプロジェクト作って試してみます。
SatoTakeshiX

2016/01/22 08:27

fuzzballさん 新しいプロジェクトを作って、CBCentralManagerOptionRestoreIdentifierKeyを設定してBLE通信ができました。 また、プロセス切って、復元メソッドが呼ばれるところまで確認ができました! 何度も返信いただき感謝致します。 おそらく、現状のプロジェクトがCentralManagerのインスタンスを数回初期化してしまって、ステータスがおかしくなってしまっていたのかと思います。 自分ひとりではここまでたどり着けませんでした。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問