Подключение нескольких клавиатур в iOS 14 Objective-C

#objective-c #ios14

#objective-c #ios14

Вопрос:

iOS 14 введено GCKeyboard . Я смог успешно подключить a BlueTooth NumberPad в своем приложении, но мне нужно иметь возможность подключать две из них в тандеме. Не мог бы кто-нибудь указать мне пример кода?

В GCController классе есть controllers метод «», который возвращает массив всех подключенных контроллеров, но для него нет ничего подобного GCKeyboard .

Вот мой код:

 - (void)viewDidLoad {
    [super viewDidLoad];
    
    [[UIApplication sharedApplication]setIdleTimerDisabled:YES];

    // notifications for keyboard (dis)connect
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWasConnected:) name:GCKeyboardDidConnectNotification object:nil];
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWasDisconnected:) name:GCKeyboardDidDisconnectNotification object:nil];
}

GCKeyboard *leftKeyboard;
GCKeyboard *rightKeyboard;

- (void)keyboardWasConnected:(NSNotification *)notification {
    
    if (!self.leftKeyboard) {
        leftKeyboard = (GCKeyboard *)notification.object;
        NSLog(@"Left Keyboard connected: %@n", leftKeyboard.description);
        NSString *keyboardStatus = [NSString stringWithFormat:@"Left Keyboard CONNECTED:n%@", leftKeyboard.description];
        self.statusLabel.text = keyboardStatus;
        
        self.leftKeyboard = leftKeyboard;
        [self reactToKeyboardInput];
    }
    else if (!self.rightKeyboard) {
        NSLog(@"Right Keyboard connected: %@n", rightKeyboard.description);
        rightKeyboard = (GCKeyboard *)notification.object;
        NSString *keyboardStatus = [NSString stringWithFormat:@"Right Keyboard CONNECTED:n%@", rightKeyboard.description];
        self.statusLabel.text = keyboardStatus;
        
        self.rightKeyboard = rightKeyboard;
        [self reactToKeyboardInput];
    }
}

- (void)keyboardWasDisconnected:(NSNotification *)notification {
    
    if (self.leftKeyboard) {
        GCKeyboard *keyboard = (GCKeyboard *)notification.object;
        NSString *status = [NSString stringWithFormat:@"Left Keyboard DISCONNECTED:n%@", keyboard.description];
        self.statusLabel.text = status;
    
        self.leftKeyboard = nil;
    }
    else if (self.rightKeyboard) {
        GCKeyboard *keyboard = (GCKeyboard *)notification.object;
        NSString *status = [NSString stringWithFormat:@"Right Keyboard DISCONNECTED:n%@", keyboard.description];
        self.statusLabel.text = status;
    
        self.rightKeyboard = nil;
    }
}
  

При подключении клавиатуры или цифровой клавиатуры я получаю сообщение:

 2020-09-18 13:09:15.845943-0700 Controller[1653:351628] Left Keyboard connected: GCController 0x280bb8dd0 ('Keyboard' - 0x27c3dc28cec4d818)
 
  

Ответ №1:

«Перенесите игры с клавиатуры и мыши на iPad», — говорится в видеозаписи WWDC:

В случае клавиатур вы не можете различать несколько клавиатур, и вместо этого все события клавиатуры с нескольких клавиатур объединяются для вас. Таким образом, хотя вы можете использовать уведомления, чтобы заметить, когда клавиатура отключается, и, возможно, приостановить игру, чтобы запросить другой ввод, в общем, вы обнаружите, что просто с помощью GCKeyboard-Device.coalesced для проверки состояния клавиши, когда значение не равно нулю является правильным путем.

Таким образом, хотя у вас может быть подключено несколько клавиатур, похоже, что все они объединяются в один GCKeyboard экземпляр, и вы не можете их различить. Вот почему нет никакого [GCKeyboard keyboards] метода. Вместо этого есть [GCKeyboard coalescedKeyboard]

Комментарии:

1. Спасибо, Зорг. К сожалению, то же самое верно и для мыши. Невозможно определить, подключено ли более одной мыши Bluetooth. Странно то, что GCKeyboard каким-то образом связан с GCController, как видно из свойства GCKeyboard.description «GCController 0x280bb8dd0 (‘Keyboard’ — 0x27c3dc28cec4d818)», а для gcccontroller есть свойство PlayerIndex, для которого можно задать значение GCControllerPlayerIndex1. Интересно, можно ли каким-то образом преобразовать GCKeyboard в gcccontroller, чтобы я мог использовать это свойство. Есть предложения?

2. Мыши не объединяются в соответствии с документацией. Вы должны уметь различать несколько мышей с помощью обработчиков уведомлений или [GCMouse mice] . GCKeyboard и GCController являются частью одной и той же платформы и соответствуют GCDevice протоколу. Их входные свойства являются подклассами GCPhysicalInputProfile . GCKeyboard не имеет свойства PlayerIndex, потому что это не имеет особого смысла — на клавиатуре нет такого светодиодного индикатора для отображения индекса проигрывателя.

3. Спасибо, что указали [мыши GCMouse], @Zorg. Я попробовал, и он отлично работает для различения нескольких парных мышей, как описано в документации. Что касается [GCKeyboard coalescedKeyboard], мне интересно, есть ли способ получить доступ к исходному коду GCContoller.framework, чтобы я мог изменить GCKeyboard и добавить свойство «клавиатуры» и перекомпилировать его локально. Я знаю, что в большинстве случаев различать клавиатуры не имеет особого смысла, но это имеет смысл для моего приложения:-) Делает ли Apple такие источники общедоступными? Если да, то откуда я могу их загрузить?

4. Нет, это принятие желаемого за действительное. Вы также не можете использовать частные API, если хотите получить одобрение App Store. Вы можете проверить API UIKit для работы с физическими клавиатурами (я там не знаком), если это позволяет их различать. Существует приличная вероятность объединения GCKeyboard из-за else в стеке iOS.