Search code examples
iosbluetootheaaccessory

Checking if external accessories in iOS can start an EASession


I'm trying to get a list of available connected peripherals on iOS. What I do first is grab everything that's connected from the sharedAccessoryManager.

But now I want to filter by accessories that are available for my specific protocol and are not currently in session with another app. The goal is to have multiple apps that can connect to the same kind of accessory, but I want to avoid attempting to start a session with accessories already in session with one of the apps in the background.

Would the best way to do this just open an EASession for each relevant device and immediately closing it, noting whether or not the initWithAccessory returns nil? e.g.

for (EAAccessory *accessory in [[EAAccessoryManager sharedAccessoryManager] connectedAccessories])
{
    EASession *session = [[EASession alloc] initWithAccessory:accessory forProtocol:@"myprotocol"];
    if (session) {
        // close the EASession
        session = nil;

       // do stuff to save the accessory and report 
       // to the user that it is available to have a session started

    }
}

Are there any problems that might arise from testing session opens for every device? Do I need to clean up the input/output streams too? The problem seems to be that I start communicating with the accessories, which I don't want to do, instead just check if they're available.


Solution

  • This is exactly what you should get by checking the protocolStrings list. Your Info.plist key will have already filtered out any accessories you don't support at all. But protocolStrings indicates the list of protocols the device is ready to support now:

    When deciding whether to connect to an accessory, you should always first check the accessory’s declared protocols in the protocolStrings array. This list indicates the types of data the accessory is capable of processing at that moment, which may not be the full list of protocols for which the accessory is designed. For example, an accessory that is connected but not yet authenticated will report no supported protocols until authentication is successful. Don't connect to the accessory unless and until the list includes the protocol you intend to use.

    It's up to the device to accurately report the list of protocols it currently supports. In my experience, constructing an EASession does not guarantee that the session is actually available. For example, if you try to create two sessions to the same device and the same protocol in the same process (which is invalid), the session will be created, but you'll see errors when you try to create the streams.