Как касание на iPhone становится кликом на Mac
Отправить один клик просто. Отправить тысячи кликов по плохому соединению, по порядку и без отставания курсора, вот где удалённое управление становится интересным.
Позиции это доли, а не пиксели
Когда вы касаетесь картинки, iPhone отправляет не «пиксель 812, 640». Он отправляет точку от 0 до 1 по каждой оси относительно показываемого источника. Mac превращает её в настоящие координаты дисплея или окна, которое он захватывает. Поэтому касание попадает в нужное место, подогнана ли картинка под экран или увеличена, в вертикальной или горизонтальной ориентации, на экране Retina или на виртуальном дисплее по форме iPhone. Ни одной стороне не нужно согласовывать разрешение.
Не все сообщения равны
Ввод идёт короткими командами JSON по зашифрованному управляющему соединению, и приложение обращается с каждым видом по-своему:
- Из движений мыши остаётся только последнее. Если во время затора в сети накопилось три движения, первые два бесполезны. Новейшее заменяет их, а частота движений ограничена примерно 60 в секунду.
- Прокрутки складываются. Два события прокрутки, стоящие в очереди вместе, становятся одним событием с суммой, так что расстояние не теряется.
- Клики и клавиши никогда не отбрасываются и не переставляются. Отпускание кнопки мыши раньше нажатия было бы багом, который видно.
Эта небольшая политика составляет большую часть разницы между курсором, который плавно скользит, и курсором, который дёргается после сбоя. Она же означает, что плохое соединение превращается в менее плавный указатель и никогда в неверное действие.
Клавиши это коды клавиш macOS
Нажатие клавиши это виртуальный код клавиши macOS плюс биты модификаторов для Shift, Control, Option и Command. Приложение на Mac превращает его в настоящее событие клавиатуры и отправляет в систему, поэтому ему и нужно разрешение «Универсальный доступ». Сочетания клавиш следуют за приложением, в котором вы находитесь: панель выше показывает команды для редактора на переднем плане, а не фиксированный список.
У попыток заставить клавиши вести себя как на физической клавиатуре есть неожиданные тонкости. У настоящей клавиши со стрелкой есть два дополнительных флага, флаг функциональной клавиши и флаг цифровой клавиатуры, которые наивное синтетическое событие опускает. Без них Control и стрелка вверх на Mac не делали ничего вместо того, чтобы открыть Mission Control, хотя правильный код клавиши приходил. Теперь Peering выставляет оба флага, как настоящая клавиатура.
Текст это не нажатия клавиш
Эмодзи, диакритические знаки и нелатинские алфавиты не сопоставляются с кодами клавиш. Для них iPhone отправляет сами символы как текст, а Mac их набирает. Поэтому клавиатура работает на любом языке и поэтому некоторые сочетания клавиш Mac в этом режиме не работают. Это компромисс, который можно переключить в настройках приложения.
Синхронность
iPhone пингует Mac каждую секунду, а Mac отвечает, возвращая пинг, что заодно служит живым измерением задержки. Если iPhone уходит в фон, он сообщает об этом заранее, потому что iOS может заморозить приложение, не закрывая его соединений, и тогда Mac перестаёт слать ему видео до возвращения. Сеанс можно также перевести в режим наблюдения: тогда Mac игнорирует ввод, пока картинка продолжает идти.
Обратная сторона этой петли описана в статье как картинка попадает на iPhone. Вместе они определяют, насколько отзывчивой кажется вся система.
Вопросы
Поддерживает ли Peering эмодзи и неанглийские клавиатуры?
Да. Текст, который не является нажатием клавиши, отправляется символами и набирается на Mac, поэтому работают эмодзи и любой язык. Сочетания клавиш Mac отправляются только в режиме, который передаёт коды клавиш.
Почему курсор остаётся плавным при слабом соединении?
Движения мыши объединяются, и остаётся только последняя позиция, а прокрутки суммируются. Клики и клавиши всегда доставляются по порядку.