我正在为越狱的 iPhone 构建一个守护程序应用程序,并遵循了 stackoverflow 上的几个问题和答案中描述的指南,当然还有 Chris Alvares 的网页 http://chrisalvares.com/blog/38/creating-an-iphone-daemon-part-4/。
Xcode 和项目由 Jailcoder 修补以使其在我的设备上运行。
这里的一篇帖子说现在不再需要使用开放工具链模板。将应用程序上传到/Applications 目录并在/System/Library/LaunchDaemons 中添加一个 plist 文件应该就足够了。
我已经执行了上述步骤,但是守护进程没有启动,或者至少在我检查时没有运行。在 Xcode Organizer 中可用的设备日志中,应用程序的名称或其捆绑 ID 无法在任何地方找到。我至少希望出现错误,并说明它无法启动的原因。
复制到/System/Library/LaunchDaemons 的 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>Disabled</key>
<false/>
<key>Label</key>
<string>dmn.NoUIDaemon.plist</string>
<key>OnDemand</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/Applications/NoUIDaemon.app/NoUIDaemon</string>
<string></string>
<string></string>
</array>
<key>StandardErrorPath</key>
<string>/dev/null</string>
</dict>
</plist>
问题:有没有办法调试为什么它不会启动守护程序应用程序?或者除了将应用程序上传到/Applications 并将 plist 文件添加到 LaunchDaemons 目录之外,我是否错过了一个步骤?
编辑:
我的主要例程内容:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
启动/Applications/NoUIDaemon.app/NoUIDaemon 时出错:
R-iPod:/ root# /Applications/NoUIDaemon.app/NoUIDaemon
-sh: /Applications/NoUIDaemon.app/NoUIDaemon: Bad CPU type in executable
请注意,当我从 Xcode 在我的设备上运行该应用程序时,它确实可以正常运行。
尽管无法手动启动守护程序,但 Nate 问题的答案:
1) LaunchDaemons中的plist文件确实是dmn.NoUIDaemon.plist
2) 我犯了一个“错误”,忘记了 Label 内容中的 .plist 部分,所以我尝试了两个值,最后有和没有 .plist,当然没有区别。
3) 在使用重启命令安装应用程序和 plist 文件后,我重启了设备
4) 我已确保所有权限都相同 (0775)
5) 将在 Bad CPU 问题解决后尝试此操作,但仍然无法正常工作
最终编辑:
要在跳板上隐藏您的 Daemon 应用程序图标,请将以下内容添加到您的 .app 中的 Info.plist:
<key>SBAppTags</key>
<array>
<string>hidden</string>
</array>
最佳答案
正如我在评论中所说,首先尝试确保您的守护程序可执行文件可运行:
- 以
root
登录您的设备, 通过ssh
- 执行命令
/Applications/NoUIDameon.app/NoUIDaemon
在命令行 - 检查它是否正在运行
ps -Aef | grep NoUIDaemon
如果它没有运行,我会检查以确保您的构建过程是伪代码签名 NoUIDaemon
可执行。越狱手机不需要有效 签名,但它们仍然需要签名。此外,如果它没有运行(或保持运行),它可能会帮助您从守护程序的主程序(例如 main.m)发布代码:
int main(int argc, char *argv[]) {
// what's in here?
}
如果它确实有效,并且在您手动启动它时运行(但不是自动运行),则检查:
- 是上面的 plist 文件,名为
dmn.NoUIDaemon.plist
? - 我认为这实际上是 Chris 博客中的一个错误,但是
Label
plist 中的值应该是<string>dmn.NoUIDaemon</string>
, 不是<string>dmn.NoUIDaemon.plist</string>
.我认为这不会阻止您的守护进程运行,我认为这只是为了与系统启动守护进程的命名约定保持一致。 - 我不认为只在
/System/Library/LaunchDaemons
中安装 plist 文件足以启动守护进程。您可能需要重启手机,或使用launchctl load -w /System/Library/LaunchDaemons/dmn.NoUIDaemon.plist
手动启动守护程序。 - 检查以确保您的 dmn.NoUIDaemon.plist 的文件权限和所有权与
/System/Library/LaunchDaemons
中的其他启动守护程序 plist 相同。 . - 我不确定这是否有必要,但我认为守护进程的名称(
Label
和 plist 文件的名称)应该与您的 NoUIDaemon-Info.plist 文件中指定的包 ID 相匹配.所以,Info.plist 应该有:
<key>CFBundleExecutable</key>
<string>NoUIDaemon</string>
<key>CFBundleIdentifier</key>
<string>dmn.${PRODUCT_NAME:rfc1034identifier}</string>
或
<key>CFBundleExecutable</key>
<string>NoUIDaemon</string>
<key>CFBundleIdentifier</key>
<string>dmn.NoUIDaemon</string>
更新:
另外,我认为你的守护进程的主程序不应该调用 UIApplicationMain
.它不应该是一个 UIApplication。它应该是一个后台进程,对吧?如果你看on Page 1 of Chris's blog , 它显示了一个例子。这是我的一个例子:
int main(int argc, char *argv[]) {
@autoreleasepool {
SignalMonitor* daemon = [[SignalMonitor alloc] init];
// start a timer so that the process does not exit.
NSTimer* timer = [[NSTimer alloc] initWithFireDate: [NSDate date]
interval: 1.0
target: daemon
selector: @selector(setup:)
userInfo: nil
repeats: NO];
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer: timer forMode: NSDefaultRunLoopMode];
[runLoop run];
}
return 0;
}
此外,这是我的守护进程的 plist 文件 (Info.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>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>NoUIDaemon</string>
<key>CFBundleIdentifier</key>
<string>dmn.NoUIDaemon</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0-0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>LSApplicationCategoryType</key>
<string></string>
</dict>
</plist>
关于iphone - iOS Daemon 应用程序无法启动(越狱)——如何调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13345686/