Bluetooth peripheral does not pair - ios

I have written an apple watch app to try to communicate with a bluetooth peripheral which has implemented some custom encryption and pairing process I already managed to implement correctly.
The device seems not to conform to standards and as such does not indicate that it needs encryption through its chatacteristic properties. After going through the pairing I can write values to it and recieve notifications.
The problem is that when I disconnect and connect again I have to go through the pairing process again. Also I have noticed that after pairing via other apps the device does a long beep sound which seems missing when I pair it through my app.
Is there any way to force pairing/binding in CoreBluetooth?

Related

iOS: Does a pairing window always display when connecting to a BLE device?

I want to avoid the BLE pairing pop up window on iOS when connecting to a small disposable device. The device will only be used once. If the device is advertising for its lifetime (no more than a few minutes) and does not require encrypted communication. Will an app that I develop be able to directly communicate with the device without displaying a pairing popup?
The pairing pop up is only shown if a characteristic specifies that encryption is required. If no encryption is specified by the peripheral then no pairing dialog is shown.
If you aren't getting the behaviour you desire, you need to change your peripheral or not access the encrypted characteristic from your central.
If you pair the devices, then the user must accept that. But if you just connect and communicate with GATT characteristics that don't need pairing, you don't need to pair and hence no popup.

Handling multiple Bluetooth Pairing Request Dialogs at once

I have an app that integrates with BLE devices. I can connect to any number of devices. When initiating a pairing from the app to the device via [CBCentralManager connectPeripheral:options:] the system bluetooth pairing request alert will fire if no previous pairing information is found. This all works great.
However, I am implementing a functionality that discovers, pairs, and reads characteristics from multiple devices at once. This also works great if the devices have been paired previously. But if this is the first pairing for more than one of the devices, only one of the pairing request alert controllers is displayed. What makes this even more difficult is that I also don't receive a failed connection error from CB for the other devices waiting for response from the pairing dialog.
Is there any way I can elegantly handle situations where there are multiple pairing requests needing attention? It would be helpful if at least one of these was possible:
The ability to complete the outstanding pair requests sequentially
Notification of failed pairing for other devices
Knowledge of whether a pairing request dialog will be fired before initializing the pairing so I can pair one at a time
There are no APIs in CoreBluetooth that lets you interact with the pairing.
Are you in control of the firmware of the peripherals you want to be able to pair with? If so, you can enable notifications and send events how the pairing process is going. That way you know in the app the current status of a pairing process.
For some examples, by looking at status and error codes (details depends on your peripheral BLE stack), you will be able to identify when iOS shows the pair dialog, when the user presses cancel and when pairing succeeds. It will also be possible to identify when iOS didn't put up the pair dialog.

iOS Bluetooth BLE security and "Just works" association model

According to this document and this whitepaper, there are security measures designed to prevent passive eavesdropping a Bluetooth BLE connection. Is there a way to implement the secure connection between an iOS central manager and a peripheral device?
Specifically, I'm looking to implement "Just works association model". I want to know if it is possible with an iPhone.
For BLE connections, iOS supports "Just Works" and also "PIN" based pairing.
For Out-of-band (OOB) pairing, there is no public iOS API (albeit a private one that Apple uses itself for Handoff amongst other things, to seamlessly pair two Apple devices without user interaction.)
Note that both "Just Works" and "PIN" pairing is somewhat broken. If an eavesdropper were to listen in on the initial pairing process, it could brute force the exchanged keys easily.
iOS 8.2 added support for BT 4.2, which includes various improvements for BLE pairing and security in general. I haven't looked what parts iOS 8.2 supports though.
To kick off pairing:
an app that is using the peripheral needs to be in the foreground (this can be iOS' Settings)
after connecting,
send the "Slave Security Request" command from peripheral side (see the Bluetooth Specification),
or,
access a "protected" characteristic on a service implemented either by the peripheral or by the app -- this will make iOS automagically initiate the pairing process if the device was not yet bonded. This is what Apple recommends.
EDITED:
According to the table under Step 4 in this link, because your Central (smartphone) has both Keyboard and Display, the only way to perform Just Works pairing is if the sensor has no input and no output capabilities.
So, to do that, you must configure the sensor to send a Pairing Response with the IO Capabilities set to NoInputNoOutput.
That will force the Central (your iOS device) to perform Just Works pairing.

Objective-C Disabled iOS BLE Pairing Message

Is there anyway to disable the pairing message in iOS for a bluetooth device? The device I'm connecting to does not require any security and there is no pairing mechanism in place so having the message pop up is not needed. Any suggestions?
To confirm Paulw11's comment above a Pairing prompt will be displayed in iOS when a device is connected and any type of encryption is requested during the connection or encryption is required when writing to a characteristic.
If the user clicks "Cancel" the encryption will not be enabled for the connection, but the connection will not be terminated. If you click "Pair" encryption will be enabled and the connection will also persist.
There is no way to listen or interact with the pairing prompt via the base iOS configuration through the CoreBluetooth Framework. I've talked with Apple about this and done lots of digging. There may be a way to do this through the MFI program, but obviously we can't talk about that.

ios Core BlueTooth Pairing to External BLE Device

I am making an BLE based application.
As I know Bluetooth Pairing is handling ios internally.
Is there any possiblity to get access over bluetooth pairing request in ios . I am getting pairing request from external BLE Device but i am not able to know whether user is paired or cancelled.
Apps like TI SensorTag and Multitool apps are handling the pairing request when user clicks cancel then these apps disconnects the peripheral.
I am not getting any clue how they are handling the pairing.
Please help me in getting this solved.
Thanks
The BLE devices are more then likely handling the cancel on their side. When you click cancel through iOS it does not pair and does not enable encryption. At this point the BLE devices are probably issuing a disconnect because encryption has not been started.
The only time you will see that pairing message is when encryption is being requested.

Resources