iOS守护程序应用程序不会启动(越狱) - 如何调试



我正在为越狱的iPhone构建一个守护程序应用程序,并按照stackoverflow和Chris alvares的网页上的几个问题和答案所述遵循指南,网址为http://chrisalvares.com/blog/38/create-an-iphone-daemon-part-4/

Xcode和该项目由监狱编码器修补,以使其在我的设备上运行。

这里的一篇文章指出,如今不再需要使用开放式工具链模板。将应用程序上传到/应用程序DIR,并在/System/Library/LaunchDaemons中添加PLIST文件就足够了。

我已经执行了上述步骤,但是没有启动守护程序,或者至少在检查时没有运行。在Xcode组织者中可用的设备日志中,该应用程序的名称或其捆绑ID在任何地方都找不到。我至少会期望发生错误,原因是它不会启动的原因。

PLIST文件的内容复制到/system/library/lunaineDaemons:

    <?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>

问题:有没有办法调试为什么它不会启动守护程序应用?或者,除了将应用程序上传到/应用程序并将PLIST文件添加到启动Daemons Dir?

之外,我是否错过了一步。

编辑:

我的主要例程的内容:

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在设备上运行它时,该应用程序确实没有问题。

事件尽管守护程序无法手动启动,这是内特问题的答案:

1)pluenhdaemons中的plist文件确实被命名为dmn.nouidaemon.plist

2)我犯了一个"错误",即忘记了标签内容中的.plist部分,因此我尝试了这两个值,而在最后,没有差异。

没有差异。

3)我使用重新启动命令

同时安装了应用程序和PLIST文件后重新启动了设备

4)我确保所有权限都是相同的(0775)

5)当解决不良的CPU问题解决并且仍然不起作用时,将尝试此操作

最终编辑:

要在跳板上隐藏守护程序应用图标,请在.App中添加以下内容。

<key>SBAppTags</key>
<array>
    <string>hidden</string>
</array>

正如我在评论中所说的那样,

,首先尝试确保您的守护程序可执行文件是可行的:

  1. 通过ssh登录到您的设备,以CC_2
  2. 在命令行中执行命令/Applications/NoUIDameon.app/NoUIDaemon
  3. 检查它是否使用ps -Aef | grep NoUIDaemon
  4. 运行

如果它不运行,我会检查以确保您的构建过程是假代码签名NoUIDaemon可执行文件。越狱电话不需要有效的签名,但它们仍然需要签名。另外,如果它不运行(或保持运行),则可能有助于您从守护程序的主程序(例如main.m)中发布代码:

int main(int argc, char *argv[]) {
   // what's in here?
}

如果确实有效,并且在您启动时运行(但不是自动),请检查:

  1. 上面的plist文件命名为 dmn.NoUIDaemon.plist
  2. 我认为这实际上是Chris博客中的错误,但是您的PLIST中的Label值应为<string>dmn.NoUIDaemon</string>,而不是<string>dmn.NoUIDaemon.plist</string>。我认为这不会阻止您的守护程序跑步,我认为这与系统启动守护者的命名惯例是一致的。
  3. 我不认为仅在root0中安装PLIST文件就足以启动守护程序。您可能需要重新启动手机,或者使用launchctl load -w /System/Library/LaunchDaemons/dmn.NoUIDaemon.plist
  4. 手动启动守护程序
  5. 检查以确保您的dmn.nouidaemon.plist的文件权限和所有权与/System/Library/LaunchDaemons中的另一个启动守护程序相同。
  6. 我不确定是否有必要,但是我认为守护程序的名称(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。这应该是一个背景过程,对吗?如果您在克里斯(Chris)博客的第1页上查看,则显示一个示例。这是我的一个例子:

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>

最新更新