6

私はジェイルブレイクされたiPhone用のデーモンアプリを構築しており、stackoverflowともちろんChris AlvaresのWebページ(http://chrisalvares.com/blog/38/creating-an-iphone- )でいくつかの質問と回答に記載されているガイドラインに従いました。デーモン-パート-4/

Xcodeとプロジェクトは、Jailcoderによってパッチが適用され、デバイスで実行できるようになります。

ここでの投稿の1つは、現在、オープンツールチェーンテンプレートを使用する必要がなくなったと述べています。アプリを/Applicationsディレクトリにアップロードし、/ System / Library/LaunchDaemonsにplistファイルを追加するだけで十分です。

上記の手順を実行しましたが、デーモンが起動していないか、確認しても少なくとも実行されていません。Xcodeオーガナイザーで利用可能なデバイスログでは、アプリの名前またはそのバンドル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からデバイスで実行すると、アプリは問題なく動作することに注意してください。

デーモンを手動で起動することはできませんが、ネイトの質問に対する回答は次のとおりです。

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

1 に答える 1

7

コメントで述べたように、最初にデーモンの実行可能ファイルが実行可能であることを確認してください。

  1. root経由でデバイスにログインしますssh
  2. /Applications/NoUIDameon.app/NoUIDaemonコマンドラインでコマンドを実行します
  3. で実行されているかどうかを確認してくださいps -Aef | grep NoUIDaemon

実行されていない場合は、ビルドプロセスが実行可能ファイルに偽のコード署名をしていることを確認しますNoUIDaemon。ジェイルブレイクされた電話には有効な署名は必要ありませんが、それでも署名は必要です。また、実行されない(または実行を継続する)場合は、デーモンのメインプログラム(例:main.m)からコードを投稿すると役立つ場合があります。

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

それが機能し、手動で(自動ではなく)起動したときに実行される場合は、次を確認してください。

  1. 上記のplistファイルの名前はdmn.NoUIDaemon.plist
  2. これは実際にはChrisのブログのエラーだと思いますがLabel、plistの値は、ではなく、である必要があり<string>dmn.NoUIDaemon</string>ます<string>dmn.NoUIDaemon.plist</string>。これによってデーモンの実行が妨げられることはないと思います。システム起動デーモンの命名規則と一致しているだけだと思います。
  3. /System/Library/LaunchDaemonsデーモンを起動するには、plistファイルをインストールするだけでは不十分だと思います。おそらく、電話を再起動するか、デーモンを手動で起動する必要があります。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>

また

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

アップデート:

また、デーモンのメインプログラムでを呼び出す必要はないと思いますUIApplicationMain。UIApplicationではありません。それはバックグラウンドプロセスであるはずですよね?クリスのブログの1ページを見ると、例が示されています。これが私の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>
于 2012-11-13T12:12:29.860 に答える