Соединение с аксессуаром

Аксессуары не видимы через Внешнее Вспомогательное платформа, пока они не были соединены системой и приготовлены для использования. Когда аксессуар действительно становится видимым, Ваше приложение может получить надлежащее вспомогательное объект и открыть сеанс с помощью один или больше протоколов, поддерживаемых аксессуаром.

Совместно используемое EAAccessoryManager объект обеспечивает основную точку входа для приложений, надеющихся связываться с аксессуарами. Этот класс содержит массив уже связанных объектов аксессуара, что можно перечислить, чтобы видеть, существуют ли поддержки приложений. Большая часть информации в EAAccessory объект (такой как имя, производитель и информация модели) предназначается в целях дисплея только. Чтобы определить, может ли Ваше приложение соединиться с аксессуаром, необходимо смотреть на протоколы аксессуара и видеть, существуют ли поддержки приложений.

Для данного объекта аксессуара только один сеанс за один раз позволяется для определенного протокола. protocolStrings свойство каждого EAAccessory объект содержит словарь, ключи которого являются поддерживаемыми протоколами. При попытке создать сеанс с помощью протокола, уже использующегося, Внешнее Вспомогательное, платформа закрывает существующий сеанс прежде, чем открыть новый.

Перечисление 1 показывает метод, проверяющий список связанных аксессуаров и захватывающий первый что поддержки приложений. Это создает сеанс для указанного протокола и конфигурирует потоки ввода и вывода сеанса. К тому времени, когда этот метод возвращает объект сеанса, он подключен к аксессуару и готовый начать отправлять и получать данные.

Перечисление 1  , Создающее сеанс связи для аксессуара

- (EASession *)openSessionForProtocol:(NSString *)protocolString
{
    NSArray *accessories = [[EAAccessoryManager sharedAccessoryManager]
                                   connectedAccessories];
    EAAccessory *accessory = nil;
    EASession *session = nil;
 
    for (EAAccessory *obj in accessories)
    {
        if ([[obj protocolStrings] containsObject:protocolString])
        {
            accessory = obj;
            break;
        }
    }
 
    if (accessory)
    {
        session = [[EASession alloc] initWithAccessory:accessory
                                 forProtocol:protocolString];
        if (session)
        {
            [[session inputStream] setDelegate:self];
            [[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]
                                     forMode:NSDefaultRunLoopMode];
            [[session inputStream] open];
            [[session outputStream] setDelegate:self];
            [[session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]
                                     forMode:NSDefaultRunLoopMode];
            [[session outputStream] open];
            [session autorelease];
        }
    }
 
    return session;
}

После того, как потоки ввода и вывода сконфигурированы, последний шаг должен обработать связанные с потоком данные. Перечисление 2 показывает фундаментальную структуру потокового кода обработки делегата. Этот метод реагирует на события от обоих потоков ввода и вывода аксессуара. Поскольку аксессуар отправляет данные в Ваше приложение, событие поступает, указывая, что существуют байты, доступные, чтобы быть считанными. Точно так же, когда аксессуар готов получить данные от Вашего приложения, события поступают, указывая тот факт. (Конечно, Ваше приложение должно не всегда ожидать события для поступления, прежде чем оно сможет записать байты в поток. Это может также вызвать поток hasBytesAvailable метод, чтобы видеть, в состоянии ли аксессуар все еще получить данные.) Для получения дополнительной информации о потоках и обработке связанных с потоком событий, см. Потоковое Руководство по программированию.

Перечисление 2  , Обрабатывающее потоковые события

// Handle communications from the streams.
- (void)stream:(NSStream*)theStream handleEvent:(NSStreamEvent)streamEvent
{
    switch (streamEvent)
    {
        case NSStreamHasBytesAvailable:
            // Process the incoming stream data.
            break;
 
        case NSStreamEventHasSpaceAvailable:
            // Send the next queued command.
            break;
 
        default:
            break;
    }
 
}