iOS Daemon 应用程序无法启动(越狱)- 如何调试?

2024-01-18

我正在为越狱的 iPhone 构建一个守护程序应用程序,并遵循 stackoverflow 上的几个问题和答案中描述的指导原则,当然还有 Chris Alvares 的网页:http://chrisalvares.com/blog/38/creating-an-iphone-daemon-part-4/ http://chrisalvares.com/blog/38/creating-an-iphone-daemon-part-4/

Jailcoder 对 Xcode 和项目进行了修补,使其可以在我的设备上运行。

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

我已执行上述步骤,但守护进程未启动,或者至少在我检查时未运行。在 Xcode 管理器中提供的设备日志中,在任何地方都找不到应用程序的名称或其捆绑 ID。我至少预计会出现错误并给出无法启动的原因。

将 plist 文件的内容复制到 /System/Library/LaunchDaemons:

    <?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 目录之外,我是否可能错过了一个步骤?

EDIT:

我的主要日常内容:

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)我犯了一个“错误”,忘记了标签内容中的 .plist 部分,所以我尝试了这两个值,最后有和没有 .plist,当然没有区别。

3)我使用reboot命令安装应用程序和plist文件后重新启动了设备

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

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

最终编辑:

要在跳板上隐藏守护程序应用程序图标,请将以下内容添加到 .app 中的 Info.plist:

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

正如我在评论中所说,首先尝试确保您的守护进程可执行文件可运行:

  1. 登录您的设备root, via ssh
  2. 执行命令/Applications/NoUIDameon.app/NoUIDaemon在命令行
  3. 检查它是否正在运行ps -Aef | grep NoUIDaemon

如果它没有运行,我会检查以确保您的构建过程是假的代码签名NoUIDaemon可执行的。越狱手机不需要valid签名,但它们仍然需要签名。另外,如果它没有运行(或保持运行),发布守护程序主程序(例如 main.m)中的代码可能会对您有所帮助:

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

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

  1. 是上面命名的plist文件dmn.NoUIDaemon.plist?
  2. 我认为这实际上是克里斯博客中的一个错误,但是Label你的plist中的值应该是<string>dmn.NoUIDaemon</string>, not <string>dmn.NoUIDaemon.plist</string>。我不认为这会阻止您的守护进程运行,我认为这只是与系统启动守护进程的命名约定保持一致。
  3. 我不认为只是安装 plist 文件/System/Library/LaunchDaemons足以启动守护进程。您可能需要重新启动手机,或者手动启动守护程序launchctl load -w /System/Library/LaunchDaemons/dmn.NoUIDaemon.plist
  4. 检查以确保 dmn.NoUIDaemon.plist 的文件权限和所有权与其他启动守护程序 plist 相同/System/Library/LaunchDaemons.
  5. 我不确定这是否有必要,但我认为守护进程的名称(Label和 plist 文件的名称)应该与 NoUIDaemon-Info.plist 文件中指定的包 ID 匹配。所以,Info.plist 应该有:
    <key>CFBundleExecutable</key>
    <string>NoUIDaemon</string>
    <key>CFBundleIdentifier</key>
    <string>dmn.${PRODUCT_NAME:rfc1034identifier}</string>

or

    <key>CFBundleExecutable</key>
    <string>NoUIDaemon</string>
    <key>CFBundleIdentifier</key>
    <string>dmn.NoUIDaemon</string>

Update:

另外,我不认为你的守护进程的主程序应该调用UIApplicationMain。它不应该是 UIApplication。它应该是一个后台进程,对吧?如果你看在 Chris 博客的第 1 页上 http://chrisalvares.com/blog/7/creating-an-iphone-daemon-part-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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS Daemon 应用程序无法启动(越狱)- 如何调试? 的相关文章

  • iOS 以编程方式撤销位置服务权限

    有没有一个功能CLLocationManager or UIApplication撤销位置权限类似功能unregisterForRemoteNotifications撤销推送通知权限 The stopUpdatingLocationCLLo
  • RestKit链接器错误

    我一直遵循 RestKit 安装说明 但现在在尝试构建应用程序时出现错误 这是针对 ios iPad 的 我收到 命令 Developer Platforms iPhoneSimulator platform Developer usr b
  • 如果部署目标 < 基础 sdk,如何检查是否使用了不可用的方法?

    我想知道当部署目标低于基础 SDK 时 您如何检查代码是否不调用不可用的方法 可以在 SDK 等于部署目标的设备上运行应用程序 但我搜索一种更 自动 的方式 任何想法 问候 昆汀 最简单的方法是使用 IPHONE OS VERSION MA
  • 我无法在剃刀视图中设置断点

    我知道可以在 MVC Razor 视图中设置断点 但出了点问题 它不再工作了 我尝试重新启动 Visual Studio 2013 并更改调试的一些选项 你有什么建议吗 感谢弗拉基米尔 我能找到解决方案 我必须清理并重建整个解决方案 我之前
  • 可以禁用“应用程序错误”对话框吗?

    我使用 Hudson 作为持续集成服务器来测试 C C 代码 不幸的是 我在某个地方有一个错误导致内存损坏 因此在某些 Windows 计算机上我有时会收到一个 应用程序错误 对话框 解释一条指令引用了无法读取的内存 弹出此对话框并基本上挂
  • 我如何知道我的 iOS 应用程序的蜂窝网络访问是否被禁用?

    我有一个 iOS 应用程序 它在应用程序启动时发出一些小型网络请求 资源更新等 如果用户在 iOS 设置中关闭应用程序的蜂窝网络访问 他们每次启动时都会收到 iOS 的有关网络使用情况的提示 有没有办法以编程方式知道此应用程序的蜂窝数据已被
  • 为什么使用自动布局时视图的框架宽度始终为 600 x 600

    我正在制作一个基本的扫雷应用程序 用于快速练习 娱乐 我想让板的尺寸 10 个图块宽 适应任何 iOS 屏幕 为此 我通过获取tileContainer view frame width和 10来设置每个图块的大小 我的问题是 tileCo
  • 使用 facebook connect for iPhone 上传照片的记录流程

    看完之后 我确实在 Facebook 论坛上看到了这篇文章 link http forum developers facebook com viewtopic php id 30467 他们正在向 facebook 对象提供 UIImage
  • 从核心数据存储创建 .sqlite 文件?

    我在书籍和提供 sqlite 文件下载的网站上看到过教程 sqlite 文件用于核心数据 如何获取 sqlite 文件FROM应用程序或核心数据存储TO我的桌面 如果您要创建一个预填充的 sqlite 文件以与 Core Data 一起使用
  • 多次显示admob插页式广告怎么办?

    我有一个小型游戏应用程序 它有一个故事板 里面创建了像开始菜单 游戏区域 分数这样的场景 我在其中添加了 admob 横幅视图和插页式广告 我的横幅视图工作正常 但我的插页式广告只能工作一次 我在 viewdidload 上加载插页式广告
  • 如何在托管应用程序的框架代码中调试 System.ExecutionEngineException

    我有一个作为服务运行的应用程序 该应用程序有时会崩溃 该应用程序是用 vb net 编写的 并在新线程 一次一个 上运行其任务 我已经收集了故障转储并开始分析 从应用程序创建的日志文件的分析 转储分析支持它 看来 当没有任务正在运行并且应用
  • 无法发出桥接标头的预编译标头

    我从 GitHub 下载了一个项目 然后 pod 了以下文件 其中一些文件是由 OBJ C 编写的 我使用了桥接头 pod SnapKit pod MJRefresh pod Alamofire pod Kingfisher pod MBP
  • 如何使用编译时间作为自动版本控制信息?

    当程序被编译以获得一种自动版本信息时 是否有任何常量或 pragma来获取时间和日期 DATE and TIME 是预定义的宏 将分别扩展到当前日期和时间
  • 如何使用自定义布局跳转到 UICollectionView 中的任何 Cell?

    我的水平 UICollectionView 中有 40 个单元格和一个按钮 当我点击按钮时 我可以从 5 号单元格跳转到 10 号单元格 但是一旦我想要转到另一个单元格 例如从 5 到 25 它不起作用 而是变为 0 code func s
  • Swift 中的自定义输入视图

    我花了几个小时试图弄清楚如何创建 然后定制inputView上班 我有一个网格TextInputs 想想拼字板 按下时应该加载自定义inputView插入文本 我创建了一个 xib文件包含UI elements为定制inputView 我能
  • 如何在 Swift 编程中获得基于导航的模板功能

    我的项目需要一个导航控制器 并且我的应用程序最初有一个社交登录 一旦验证通过 用户将被推送到另一个视图 我在其中显示一个具有 2 个选项卡的选项卡控制器 我不知道如何在 Swift 编程中做到这一点 我已将视图控制器嵌入到导航控制器中 一旦
  • Xcode 4 Core Data:如何使用在数据模型编辑器中创建的获取属性

    如何在 Xcode 4 中实现获取的属性 Here is an example of two entities a book and a page 我按照此处的指南创建了一个获取的属性 该属性使用变量 FETCH SOURCE 引用来自源实
  • phonegap 插件,用于从库中选择视频

    我需要能够从库中选择视频并将其上传到我的服务器 我可以录制新视频 captureVideo 并上传 文件传输 没问题 但我似乎找不到任何方法来打开视频库并选择视频然后上传 有什么办法可以做到这一点吗 以某种方式更改 MediaType na
  • 从 iOS 中的 App Delegate 调用当前视图控制器中的方法

    我有两个视图控制器 BuildingsViewController 和 RoomsViewController 它们都使用应用程序委托中名为上传的函数 上传函数基本上执行一个 HTTP 请求 如果成功或不成功 都会触发 uialertvie
  • 从 Xcode 更改按钮文本?

    我有一个 IBAction 连接到 Interface Builder 中的一个按钮 是否可以在运行时从我的代码中更改按钮 在 IB 中 上的文本 如果您的代码中有一个连接到某个操作的按钮 则无需实例变量即可更改标题 例如 如果按钮设置为以

随机推荐