2

iPhoneで現在実行されているすべてのバックグラウンドアプリのリストを取得しようとしています。私はそうすることができますが、実際に得られるのは、すべてのバックグラウンドアプリのPIDのリストです。

だから私は2つの質問があります、

まず、バンドルIDを使用してアプリを起動できますが、PIDを使用してアプリを起動することはできません。PIDでアプリを起動することは可能ですか?

2番目に私が持っているのがそのPIDだけである場合、アプリバンドルIDにアクセスする方法はありますか?

私はこれがMacでできることを理解しています

[[NSRunningApplication runningApplicationWithProcessIdentifier:pid] bundleIdentifier]

しかし、それはiPhoneで行うことができますか?

4

1 に答える 1

4

iOS(パブリックまたはプライベート)5.0ヘッダーで見つかりませんでしNSRunningApplicationた(どこでもチェックしたと確信していますが、間違っている可能性があります...)

これを行うにはおそらく複数の方法がありますが、そのうちの1つが機能するはずです...

まず、実行中のプロセスに関する情報を取得します。バンドルIDを取得できなくても、アプリへのパスを取得できる場合は、それで十分です。あなたはいくつかの方法の1つでそれを行うことができます:

1) スタックオーバーフローまたは多分これでこの答えを参照してください。これらの手法で実行可能パスが使用できるかどうかはわかりません...詳細には調べませんでした。

2)シェルコマンドを使用してプロセス情報を取得できます。psたとえばps -Aef、コマンドラインでコマンドを使用すると、次のようになります。

iPhone4:~/Applications/8AA99EA8-9CFC-4C17-9BD1-7C2812EDAAD4/Starbucks.app mobile$ ps -Aef
  UID   PID  PPID   C     STIME TTY           TIME CMD

  501   281     1   0   0:00.00 ??         1:02.39 /Applications/MobilePhone.app/MobilePhone
  501   282     1   0   0:00.00 ??         2:26.40 /Applications/MobileMail.app/MobileMail
  501   479     1   0   0:00.00 ??         5:45.01 /Applications/MobileSafari.app/MobileSafari
  501   490     1   0   0:00.00 ??         0:45.62 /Applications/Music~iphone.app/Music~iphone
  501   912     1   0   0:00.00 ??         0:17.65 /var/mobile/Applications/8AA99EA8-9CFC-4237-9BD1-7C2812AAAAD4/Starbucks.app/Starbucks
  501  1933     1   0   0:00.00 ??         0:51.72 /var/mobile/Applications/9962D9AE-087C-4D2E-A6AB-151230DBCDB09/Skype.app/Skype
  501  2106     1   0   0:00.00 ??         1:11.68 /var/mobile/Applications/20DCED79-B1EE-48F4-B3E1-75E9C25A0908C/Netflix.app/Netflix
  501  2259     1   0   0:00.00 ??         0:03.83 /Applications/Stocks.app/Stocks
  501  2292     1   0   0:00.00 ??         0:07.05 /var/mobile/Applications/33713030-9D3D-4BAC-8182-282973B2E5E0/ZillowMap.app/ZillowMap
  501  2568     1   0   0:00.00 ??         0:12.91 /var/mobile/Applications/55216130-10D8-498C-B477-AD18A4982E18/eBay.app/eBay
  501  2587     1   0   0:00.00 ??         0:05.10 /var/mobile/Applications/2A8DEAAD-8244-45C0-BEA9-20DA290B0117/Moviefone.app/Moviefone

一部の出力を削除しましたが、実行中のアプリの一部を確認できます(* .app)。

そのため、アプリでは、または呼び出しを使用して実行"ps -Aef >> /var/mobile/Library/MyAppName/ps.txt"し、出力を一時ファイルに送信できます。次に、そのファイルを解析して結果を取得します。systemexec

3)また、Darwinオープンソースのコピーをオンラインで見つけ、それを少しハッキングして、この種のデータをプログラムで解析できるC文字列バッファーに収集しました。ここでヘッダーと.cファイルを取得します。

darwin.c

darwin.h

これらの2つのファイルをXcodeプロジェクトに含めます#include "darwin.h"。次に、次のように使用します。

OS_initialize();
size_t buffSize = 20000;  // you may need to increase this!
char buffer[buffSize];

int bytes = OS_get_table(buffer, buffSize);
if (bytes > 0) {
    self.textView.text = [NSString stringWithCString: buffer encoding: NSASCIIStringEncoding];
}

アプリのインストール場所がわかったので、それらのディレクトリの下にあるInfo.plistsを開きます

NSString* filename = @"/var/mobile/Applications/8AA99EA8-9CFC-4237-9BD1-7C2812EDAAD4/Starbucks.app/Info.plist";
NSDictionary* dict = 
    [[NSDictionary alloc] initWithContentsOfFile: filename];
NSString* bundleID = [dict valueForKey: @"CFBundleIdentifier"];

バンドルIDを読み取ります。

これを機能させるには、アプリのroot権限を取得する必要がある場合があります。

その方法については、こちらをご覧ください

于 2012-07-20T07:38:39.533 に答える