その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

インストールされているアプリの一覧をログ出力する "iOSInstalledApps"

以前、『デバイスにインストールされているアプリ一覧を取得する』という記事を書いたのですが、ここに書いた

  1. アプリのプロセス名一覧を持っておいて、そのプロセスが存在すればインストールされていると判断する
  2. アプリのカスタムURLスキーム一覧を持っておいて、そのカスタムURLスキームが使用可能であればインストールされていると判断する

この2つの方法を実装しているOSSがありました。


(リポジトリURL)
https://github.com/arg0s/iOSInstalledApps


ビルドして実機で実行すると、コンソールにわらわらとログが出てきます。



自分の実機で試してみた結果がこちら。

2012-09-28 17:25:53.668 iOSInstalledApps[837:907] Process List: (
"kernel_task",
launchd,
UserEventAgent,
wifid,
timed,
syslogd,
powerd,
lockdownd,
installd,
deleted,
mediaserverd,
mDNSResponder,
locationd,
imagent,
iaptransportd,
fseventsd,
"fairplayd.N94",
AppleIDAuthAgent,
configd,
backboardd,
kbd,
CommCenter,
BTServer,
notifyd,
itunesstored,
(以下略)
)
2012-09-28 17:25:53.704 iOSInstalledApps[837:907] Installed apps: {
"fb:" = 1;
instagram = 0;
"mailto:" = 1;
"sms:" = 1;
"tel:" = 1;
"twitter:" = 0;
}


このログをみると、"Process List" の方は、アプリではないプロセス名がたくさん見受けられます。どうやら、プロセス名一覧を出力してるだけで、アプリのプロセスかどうか、の判断はしてないようです。


また、"Installed apps" の方は、"fb:", "twitter:" 他、6行しか出てきていません。
おや?と思いコードをみると、

NSArray* schemes = @[ @"tel:", @"sms:", @"mailto:",@"mailto:",@"fb:",@"twitter:",@"instagram"];

となっていて、上記配列で定義されたカスタムURLスキームを持つアプリがあるかどうか判定してるだけのようです。


プロセス名とアプリ名、スキームとアプリ名の対応リストが plist 形式か何かでリポジトリに入ってることを期待したのですが・・・


LLInstalledApps クラス

前述した通り判定用のデータはあまり充実してなかったのですが、そちらはあくまでデモプロジェクトで、本体は LLInstalledApps クラス、という位置づけのようです。


で、このクラスは、この用途において使い回しやすいようにつくられていて、

+ (NSArray *) runningApps;
- (BOOL) appsInstalledWithScheme:(NSString *)applicationScheme;
+ (NSDictionary *) appsInstalledWithSchemes:(NSArray *)applicationSchemes;

こんな感じでプロセス一覧を返してくれたり、スキーム一覧の配列を渡せばインストールされてるかどうかの判定結果をNSDictionary型で返してくれたりするメソッドを備えています。



(参考記事)
iOSに何がインストールされているのか調べる「iOSInstalledApps」