Использование GraphicsServices.h / GSEvent, а также компиляция инструментов CLI iPhone с помощью Xcode - PullRequest
3 голосов
/ 10 июня 2010

Я отправил это в KennyTM (у него есть все заголовки приватных фреймворков на GitHub), но я решил спросить и здесь на всякий случай, если у кого-нибудь есть какие-нибудь хорошие идеи или какой-либо способ помочь мне.

Я пытаюсь написать утилиту командной строки, которая отправляет GSEvents для управления клавиатурой, касания / перетаскивания элементов на экране и управления аппаратными кнопками (громкость, дом, сон и т. Д.)

Я взял код MouseSupport и попытался просмотреть его, но не смог найти самый простой способ отправить GSEvents. Я надеюсь, что кто-то здесь может мне помочь.

Во-первых, как проще всего объявить GSEvent и отправить его? Я посмотрел на вики разработки для iPhone, но документация была очень расплывчатой. Я понимаю, что есть фиолетовый порт событий (?), На который я должен отправлять эти события, но я не понимаю, как это сделать. Может ли кто-нибудь предложить примеры, скажем, касания координат, набора определенной клавиши или нажатия аппаратной кнопки?

Кроме того, мне нужно написать или сделать что-то особенное, если я хочу, чтобы эта утилита работала со всеми приложениями, а также со Springboard? Я не знаю, является ли это частным случаем, потому что я хочу это на уровне ОС. В идеале я бы запустил SSH в телефон, запустил программу и отправил бы GSEvents, который будет обрабатываться любым приложением, которое было открыто.

Что касается компиляции этого кода, есть ли способ сделать это в XCode? Я не знаю, какой шаблон проекта мне следует использовать (если есть), и это меня отталкивает. Мне не нужна поддержка "build and go", я более чем рад сообщить о программе на телефон. Я понимаю, что компиляция кода также возможна на телефоне. У меня есть все заголовки из SDK на моем телефоне вместе с iphone-gcc, но при компиляции некоторых тестовых программ я все еще получаю ошибки о том, что не могу найти заголовки mach и CoreFoundation. Есть ли более простой способ сделать это?

Наконец, есть ли другие руководства или литературные источники, на которые кто-нибудь может указать мне, чтобы я узнал об этом больше? Я взволнован, чтобы заняться разработкой открытого iPhone (у меня есть опыт работы с официальным SDK, но я хочу углубиться).

Спасибо за любую помощь, которую могут предложить люди!

1 Ответ

2 голосов
/ 10 июня 2010

Во-первых, какой самый простой способ объявить GSEvent и отправить его?

Это зависит от типа GSEvent.Некоторые события имеют удобные функции, которые можно создавать и отправлять за один шаг, например GSEventLockDevice().Но события HID (касания, нажатия клавиш и т. Д.) Не имеют этих простых функций.Причина, вероятно, заключается в том, что GSEventLockDevice() и т. Д. Должны отправляться из приложения в SpringBoard, а события HID отправляются из SpringBoard в приложение.Следовательно, только команда SpringBoard должна знать, как создать сложное GSEvent.

В любом случае, для создания события HID (например, событие акселерометра) вам не нужно создавать GSEvent.Просто используйте GSSendEvent():

// (not tested.)

GSAccelerometerInfo accel = {0.0f, 0.0f, 1.0f};
GSEventRecord header;
memset(&header, 0, sizeof(header));
header.type = kGSEventAccelerate;
header.infoSize = sizeof(accel);
header.timestamp = mach_absolute_time();
// fill in other members.

struct {
  GSEventRecord record;
  GSAccelerometerInfo info;
} record = {header, accel};

// ... see below ...

GSSendEvent(&record, thePortOfApp);

Но что такое «порт приложения»?К сожалению, нет функции, чтобы получить это.Начиная с версии 3.1 имя порта mach совпадает с идентификатором его пакета, поэтому вы можете использовать:

mach_port_t thePortOfApp = GSCopyPurpleNamedPort("com.unknown.appBundleID");
...
mach_port_deallocate(mach_task_self(), thePortOfApp); // remember to release the port.

Кроме того, нужно ли мне писать или делать что-то особенное, если яхотите, чтобы эта утилита работала со всеми приложениями так же, как и с Springboard?

Насколько я знаю, нет.


Для двух других, вероятно, вам следует разделить их на отдельныевопросы.

...