2013-03-31 99 views
2

我需要能夠在發生新的文件系統事件時接收通知。例如,當添加新圖片時。我需要能夠接收整個文件系統的通知,而不僅僅是我的應用所在的沙箱。這是針對越獄的設備嗎?文件系統事件通知(越獄設備)

有誰知道我應該使用哪一個私有API?

我的應用程序是一個守護程序並在後臺運行,它必須能夠接收這些事件。

回答

1

iOS實際上讓你真的很容易。

我不知道什麼其他你可能想要你的守護進程做,但如果你只是想讓它保持活着不斷觀看新的圖片文件,那麼你有另一種選擇。

您可以配置一個啓動守護進程來啓動,當檢測到新的文件系統事件,只有當。然後See the Apple docs on (OS X) Launch Daemons here

你啓動守護進程可執行文件可以只是一個簡單的main()程序。當新的圖片文件被寫入時,它將由系統啓動,然後您可以使用NSFileManagerALAssetLibrary來檢查最新文件的目錄。您可能希望保存一個首選項,以指示上次運行守護程序的時間,以確保跟蹤所有新文件。

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,恐怕沒有合理的方法來解決*那個問題。您不希望守護進程監聽文件系統中* every *文件的更改。 iOS正在不斷編寫文件,因爲它在後臺工作。如果聽守所有事情,你的守護進程會被頻繁地調用,所以無論你如何解決這個問題,指定你想要的文件夾都是一個好主意。 – Nate

+0

感謝這似乎工作得很好!在關閉此線程之前,我有一個跟進問題。我的守護進程在設備重啓後啓動一次,並啓動重複任務,因此我需要它繼續運行。然後,當拍攝一張照片時,守護進程會再次啓動。設備啓動後啓動的前一個過程會發生什麼?死亡或兩個獨立的進程一起運行? –