I've tested the described caching behavior and can very that it works on iOS 6.1.3 but does not on Mac OS 10.8.3.
As mentioned above, caching happens only for paired devices. To pair, you need to respond to a write request with an insufficient authorization error. For example, for an iOS peripheral you would write something like:
- (void)peripheralManager:(CBPeripheralManager *)peripheralManager didReceiveWriteRequests:(NSArray *)requests {
...
[peripheralManager respondToRequest:request withResult:CBATTErrorInsufficientAuthorization];
...
}
That will pop up a pairing dialog on the iOS peripheral, after which point you will be paired. Other than that you don't have to change your code – just call discoverServices etc as normal and they will respond more quickly (ie instantly).
William
On Wed, Apr 17, 2013 at 3:17 AM, Etan Kissling <
email@hidden> wrote:
>
> John,
>
> nope, i haven't tested caching / encryption yet.
>
> Etan
>
> On 17.04.2013, at 09:48, John Earl <
email@hidden> wrote:
>
> Etan,
>
> This discussion seems to imply that discovered services and characteristics can be cached across disconnect/reconnect pairs if the application runs continuously in the background, so long as CBCentralManager does not power down.
>
> Have you tried this and/or do you use this functionality yourself?
>
> John
>
> On 17 Apr 2013, at 08:14, Etan Kissling wrote:
>
> Jack,
>
> In the mentioned session they explained that characteristics are only cached when encryption is on. I haven't tested whether this is true, but may be worth trying.
>
> To speed up characteristic discovery, consider lowering the connection interval for the first 30 seconds or so from your peripheral. You can do this by sending a connection parameter update request.
>
> Also ensure that all your services with 16-bit uuids are grouped at the beginning of your peripheral gatt database. This allows to read up to four 16-bit uuid services at a time with the default MTU of 23 bytes.
>
> Regarding serialization of cb* objects: it's not possible with public apis and even if you could serialize them for nsuserdefaults storage, you would still run into problems as the documentation clearly states that all peripherals etc are invalidated when the cbcentralmanager state falls below a certain level. When you create a new manager, state defaults to "unknown" which is the lowest level ;-)
>
> Cheers
> Etan
>
> On 17.04.2013, at 08:34, "Jack Phan" <
email@hidden> wrote:
>
> Thank you very much for all your comments.
>
> Jack
>
> On Apr 16, 2013, at 11:28 PM, Andras Kovi <
email@hidden> wrote:
>
> Well, if you retrieve or discover a peripheral, then its services will be nil. Those are read only from our perspective so there is not even a theoretical way to save and then restore the characteristics. Maybe they come up with some caching this year (WWDC 2013 hasn't happened yet to my best knowledge :) ) but I doubt that as that would introduce a whole bunch of issues. Rediscovery is not a big deal, you just have to plan for it.
>
> Cheers,
> Andras
>
> On 2013.04.17., at 8:09, Jack Phan <
email@hidden> wrote:
>
>
> I may be wrong but I remember that in Advanced Core Bluetooth session from this years WWDC, they said we could catch the characteristics.
>
> Jack
>
>
> On Apr 16, 2013, at 11:06 PM, Andras Kovi <
email@hidden> wrote:
>
> Yes, Khaos is right. You cannot save neither the characteristics or the services. They must be rediscovered every time.
>
> Andras
>
> On 2013.04.17., at 7:44, Khaos Tian <
email@hidden> wrote:
>
> It seems you had to re-discover characteristics every time you established a new connection.
>
> Here are threads that discussed this problem previously.
>
>
http://prod.lists.apple.com/archives/bluetooth-dev/2013/Mar/msg00032.html
>
> Best Wishes,
> Khaos Tian
>
> On Apr 17, 2013, at 1:25 PM, Jack Phan <
email@hidden> wrote:
>
> The reason is that I don't want to scan again. I would like to reconnect but don't want to discover characteristics again because it takes too long.
> So when the user opens the app, I reconnect, no discover characteristics, but send characteristic values that I had saved to Peripheral.
>
> Jack
>
> On Apr 16, 2013, at 10:14 PM, Khaos Tian <
email@hidden> wrote:
>
> sorry for the typo.
>
> I mean why don't you perform a discover characteristics action and then use that CBCharacteristic to perform action you want?
>
> Best Wishes,
> Khaos Tian
>
> On Apr 17, 2013, at 1:06 PM, Jack Phan <
email@hidden> wrote:
>
>
> Hi Khaos,
>
> Yes. I would like to save CBCharacteristic *myChar into NSUserDefauts and then load it when user open the app.
> Thanks,
>
> Jack
>
>
> On Apr 16, 2013, at 10:02 PM, Khaos Tian <
email@hidden> wrote:
>
> May I ask why would you like to say CBCharacteristic into NSUserDefaults?
>
> Best Wishes,
> Khaos Tian
>
> On Apr 17, 2013, at 12:56 PM, Jack Phan <
email@hidden> wrote:
>
> Hi Group,
>
> I'm working on a project for iPhone (Central) with TI CC2541 (Peripheral) and would like to save a CBCharacteristic *myChar to NSUserDefaults but I don't know how.
> Please give me a way to solve this. It's great if you could share your code for it.
>
> Thanks a lot,
>
> Jack
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
>
> This email sent to
email@hidden>
>
>
>
>
>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
>
> This email sent to
email@hidden>
>
>
>
>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
>
> This email sent to
email@hidden>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
>
> This email sent to
email@hidden>
>
>
>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
>
> This email sent to
email@hidden>
--
William
Sent from my iPhone