我需要能夠在發生新的文件系統事件時接收通知。例如,當添加新圖片時。我需要能夠接收整個文件系統的通知,而不僅僅是我的應用所在的沙箱。這是針對越獄的設備嗎?文件系統事件通知(越獄設備)
有誰知道我應該使用哪一個私有API?
我的應用程序是一個守護程序並在後臺運行,它必須能夠接收這些事件。
我需要能夠在發生新的文件系統事件時接收通知。例如,當添加新圖片時。我需要能夠接收整個文件系統的通知,而不僅僅是我的應用所在的沙箱。這是針對越獄的設備嗎?文件系統事件通知(越獄設備)
有誰知道我應該使用哪一個私有API?
我的應用程序是一個守護程序並在後臺運行,它必須能夠接收這些事件。
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>
這看起來很酷!唯一的缺點是我不得不手動添加所有我想觀看的路徑,但因爲我只想觀看視頻,圖像和音頻,所以這不應該成爲一個障礙。只要我測試它會盡快回復你! –
@gosho_ot_pochivka,恐怕沒有合理的方法來解決*那個問題。您不希望守護進程監聽文件系統中* every *文件的更改。 iOS正在不斷編寫文件,因爲它在後臺工作。如果聽守所有事情,你的守護進程會被頻繁地調用,所以無論你如何解決這個問題,指定你想要的文件夾都是一個好主意。 – Nate
感謝這似乎工作得很好!在關閉此線程之前,我有一個跟進問題。我的守護進程在設備重啓後啓動一次,並啓動重複任務,因此我需要它繼續運行。然後,當拍攝一張照片時,守護進程會再次啓動。設備啓動後啓動的前一個過程會發生什麼?死亡或兩個獨立的進程一起運行? –