一般的 iOS 应用不能运行在后台,只要用户点击 Home 键,在前台的应用所有线程会被挂起,只有 daemon 程序才能保持在后台运行。下面我们写一个 daemon 程序进程测试,具体代码如下,功能是每隔 5 秒会输出一条信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <stdio.h> #include <UIKit/UIKit.h> int main(){ int i=0; while(1){ NSLog(@"Daemon test %d", i); i++; sleep(5); } return 0; } |
编译:
1 |
clang -arch armv7 -isysroot $(xcrun --sdk iphoneos -show-sdk-path) -framework Foundation -o daemonTest main.m |
签名:
1 |
codesign -s - --entitlements ~/ent.plist -f daemonTest |
再编写描述 daemon 的 plist 文件,具体内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?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>KeepAlive</key> <true/> <key>Label</key> <string>net.exchen.daemonTest</string> <key>ProgramArguments</key> <array> <string>/usr/bin/daemonTest</string> </array> <key>RunAtLoad</key> <true/> <key>SessionCreate</key> <true/> <key>StandardErrorPath</key> <string>/dev/null</string> <key>inetdCompatibility</key> <dict> <key>Wait</key> <false/> </dict> </dict> </plist> |
将 daemonTest 上传到 /usr/bin 目录,再将 plist 文件上传到 /Library/LaunchDaemons/ 目录,然后设置相应的权限,命令如下:
1 2 3 |
chown root:wheel /usr/bin/daemonTest chmod 755 /usr/bin/daemonTest chown root:wheel /Library/LaunchDaemons/net.exchen.daemonTest.plist |
使用 launchctl load 命令启动 daemon:
1 |
launchctl load /Library/LaunchDaemons/net.exchen.daemonTest.plist |
打开控制台查看日志,可以看到每隔 5 秒输出信息,并且在锁屏状态下,代码也能执行,是真正的后台程序,如下图所示:
使用 launchctl unload 命令可以停止 daemon:
1 |
launchctl unload /Library/LaunchDaemons/net.exchen.daemonTest.plist |
转载请注明:exchen's blog » [iOS Hacker] 编写 Root 权限的 daemon 后台守护程序