Запустить приложение в Mac OS X при подключении USB-устройства определенного типа? - PullRequest
14 голосов
/ 30 августа 2011

Мне нужно реализовать приложение Mac OS X. В моем приложении мне нужно сделать две вещи:

  1. Выполнить / открыть приложение, когда к системе подключено USB-устройство определенного типа.
  2. Считать данные с USB и загрузить их на веб-сервер.

У меня нет большого опыта разработки под Mac OS X. Кто-нибудь может предложить лучшие документы для достижения моих целей?

Ответы [ 5 ]

25 голосов
/ 04 сентября 2012

Вы можете использовать launchd.Попробуйте man launchd и man launchd.plist.

Кажется, что launchd может работать с событиями USB, хотя эта функция плохо документирована.Я нашел это на: man xpc_set_event_stream_handler

Вот пример.Если вы введете следующее: ~/Library/LaunchAgents/com.example.plist, ваша программа должна запуститься, когда подключено устройство USB.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.example.program</string>
    <key>ProgramArguments</key>
    <array>
    <string>/path/to/program</string>
    </array>
    <key>LaunchEvents</key>
    <dict>
            <key>com.apple.iokit.matching</key>
            <dict>
                    <key>com.apple.device-attach</key>
                    <dict>
                            <key>idProduct</key>
                            <integer>1234</integer>
                            <key>idVendor</key>
                            <integer>1337</integer>
                            <key>IOProviderClass</key>
                            <string>IOUSBDevice</string>
                            <key>IOMatchLaunchStream</key>
                            <true/>
                    </dict>
            </dict>
    </dict>
</dict>
</plist>
4 голосов
/ 14 сентября 2011

В зависимости от типа устройства вы можете настроить автоматическое открытие приложения с помощью настроек iPhoto / Image Capture.Это будет работать только для ограниченного класса устройств, для приложения, уже присутствующего на компьютере, и потребует изменения настроек на компьютере вручную.

В общем, нет никакого способа автоматически запускать произвольные приложения на CD /Вставка DVD / USB, потому что это проблема безопасности.

3 голосов
/ 12 февраля 2014

Ответ Жюльена Пилета сработал для меня. Однако, чтобы заставить его не перезапускать приложение постоянно, когда устройство все еще подключено при закрытии приложения, мне пришлось:

  • вызов xpc_set_event_stream_handler() в моем приложении делегата applicationDidFinishLaunching:
    xpc_set_event_stream_handler("com.apple.iokit.matching", NULL, ^(xpc_object_t event) {     
        // Every event has the key XPC_EVENT_KEY_NAME set to a string that
        // is the name you gave the event in your launchd.plist.
        const char *name = xpc_dictionary_get_string(event, XPC_EVENT_KEY_NAME);

        // IOKit events have the IORegistryEntryNumber as a payload.
        uint64_t id = xpc_dictionary_get_uint64(event, "IOMatchLaunchServiceID");
        // Reconstruct the node you were interested in here using the IOKit
        // APIs.
        NSLog(@"Received event: %s: %llu",name,id);
    });
  • добавление пары KeepAlive / false key / value к списку
  • добавьте пару IOMatchLaunchStream/true ключ / значение к com.apple.device-attach в списке. Это в дополнение к клавише IOMatchStream, которая уже есть. Не уверен, почему это должно быть там, я нашел ссылку на это здесь: http://asciiwwdc.com/2013/sessions/702

Также не забудьте зарегистрировать plist в системе, используя

launchctl load <path to your plist>

Обратите внимание, что это похоже на работу, но я никогда не получаю сообщение NSLog от обработчика потока xpc.

1 голос
/ 19 сентября 2011

Это действительно зависит от того, какое приложение вы просматриваете.

Похоже, что нет способа сделать это подобным образом Удев например.

Чтобы спорные решения были бы:

  • Напишите специальный драйвер для вашего устройства
  • Используйте libusb и даемон для ожидания определенного устройства.

И на самом деле можно написать программу с libusb , которая будет обрабатывать такого рода задачи в соответствии с заданным файлом конфигурации, это также было бы кроссплатформенным, так как libusb поддерживает довольно много платформ.

1 голос
/ 17 сентября 2011

Возможно, вы сможете настроить действия с папками для запуска команды при монтировании.Это предполагает, что устройство всегда монтируется в одном и том же месте, т.е. / Volumes / My \ Device / - если периферийные устройства были добавлены или удалены между монтировками, точка монтирования может измениться.Вы можете узнать больше о действиях с папками, щелкнув правой кнопкой мыши каталог и выбрав «Настройка действий с папками».Хитрость заключается в том, чтобы убедиться, что устройство всегда монтируется в одном и том же месте.

Кроме того, вы можете использовать launchd для запуска команды при монтировании. Эта ссылка может помочь. Lingon - отличное приложение для редактирования демонов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...