2013-03-31 2 views
2

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

Кто-нибудь знает, какой частный API следует использовать?

Мое приложение - это приложение-демон и работает в фоновом режиме, и оно должно иметь возможность принимать эти события.

ответ

1

iOS действительно делает это очень легким для вас.

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

Вы можете настроить запуск запуска для запуска только в случае обнаружения новых событий файловой системы. See the Apple docs on (OS X) Launch Daemons here

Ваш исполняемый демон демон запуска может быть просто простой программой main(). Он будет запущен системой при записи нового файла изображения, и затем вы можете использовать NSFileManager или ALAssetLibrary, чтобы проверить каталог для новейших файлов. Возможно, вы захотите сохранить предпочтение, указывающее, когда последний раз был запущен демон, чтобы вы отслеживали все новые файлы.

int main(int argc, char *argv[]) { 
    // if we're here, we know there's a new picture, so use 
    // NSFileManager to check for photos 
    // or, see something like http://stackoverflow.com/q/9730973/119114 ... 

    // and then we exit the process and let launchd start us 
    // again when there's more pictures 

    return 0; 
} 

Ключевым моментом здесь является использование /System/Library/LaunchDaemons/com.example.MyApp.plist файла, как это:

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE plist PUBLIC "-//Apple//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.MyApp</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>/Applications/MyApp.app/MyDaemonExecutable</string> 
     <string>optional_argument_one</string> <!-- passed to main() as argv[] --> 
     <string>optional_argument_two</string> <!-- passed to main() as argv[] --> 
    </array> 
    <key>WatchPaths</key> 
    <array> 
     <string>/private/var/mobile/Media/DCIM/100APPLE</string>     
     <string>/private/var/mobile/Media/DCIM/101APPLE</string> 
    </array> 
</dict> 
</plist> 
+0

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

+0

@gosho_ot_pochivka, боюсь, нет разумного способа обойти эту проблему. Вы не хотите, чтобы ваш демон прослушивал изменения в * каждом * файле в файловой системе. iOS постоянно пишет файлы, так как работает в фоновом режиме. Ваш демона будет вызван слишком часто, если он будет слушать все, поэтому указать нужную вам папку будет хорошей идеей, независимо от того, как вы решите эту проблему. – Nate

+0

спасибо, что это работает хорошо! У меня есть один следующий вопрос, прежде чем закрыть эту тему. Мой демон запускается после перезагрузки устройства и запускает повторяющуюся задачу, поэтому мне нужно, чтобы он продолжал работать. Затем, когда снимок сделан, демон запускается снова. Что происходит с предыдущим процессом после загрузки устройства? Is is kill или два отдельных процесса работают вместе? –