【问题标题】:Notifications for file system events (Jailbreak devices)文件系统事件通知(越狱设备)
【发布时间】:2013-03-31 09:50:07
【问题描述】:

当有新的文件系统事件时,我需要能够接收通知。 例如,添加新图片时。我需要能够接收整个文件系统的这些通知,而不仅仅是我的应用所在的沙箱。这是针对越狱的设备吗?

有人知道我应该使用哪个私有 API 吗?

我的应用程序是一个守护程序应用程序并在后台运行,它必须能够接收这些事件。

【问题讨论】:

    标签: ios file filesystems jailbreak cydia


    【解决方案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> 
    

    【讨论】:

    • 这看起来很酷!唯一的缺点是我必须手动添加我想要观看的所有路径,但由于我只想观看视频、图像和音频,这不应该成为一个障碍。我测试后会尽快回复您!
    • @gosho_ot_pochivka,恐怕没有合理的方法可以解决那个问题。你不希望你的守护进程监听文件系统中每个文件的变化。 iOS 不断写入文件,因为它在后台运行。如果你的守护进程监听所有内容,它会被过于频繁地调用,所以无论你如何解决这个问题,只指定你想要的文件夹都是一个好主意。
    • 感谢这似乎运作良好!在关闭此线程之前,我有一个后续问题。我的守护程序在设备重新启动后启动一次,它会启动一个重复任务,所以我需要它继续运行。然后,当拍摄照片时,守护程序会再次启动。设备启动后启动的前一个进程会发生什么?是被杀死还是两个单独的进程一起运行?
    • @gosho_ot_pochivka,您可能会同时运行两个独立的进程。我说可能是因为我不知道你的守护进程还能做什么。如果您的守护程序启动,并尝试获取资源(文件、知名端口等),如果无法获得独占访问权限则退出,那么第二个实例将死亡。但是,如果您没有这样编码,我希望看到两个守护进程。如果您需要让一个真正的守护进程始终处于活动状态以进行其他工作,也许您应该创建两个可执行文件:一个永远在线的守护进程,以及第二个刚刚被调用的小型可执行文件...
    • 如果您想尝试将几乎所有逻辑保留在始终保持开启的守护进程中,那么您的第二个可执行文件可能只是一个单行主程序,除了转发自定义内容之外什么都不做守护进程收到的通知。例如:int main(int argc, char *argv[]) { notify_post("com.mycompany.filesystemnotification"); return 0; } 守护进程将为com.mycompany.filesystemnotification 事件注册一个回调处理程序,并使用它来决定何时执行其工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2016-09-19
    相关资源
    最近更新 更多