ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

[JB]iOS用公式Twitterクライアントに追加された端末インストールアプリ一覧取得機能の調査と無効化

   

公式Twitterクライアントに追加されたイヤな感じの機能

公式Twitterクライアントに、端末にインストールされたアプリリストを取得する機能が追加されました。

Twitterがスマホにインストールされたアプリ一覧の取得を開始予定、設定解除も可能 – GIGAZINE

別に大したアプリを入れているわけじゃないけれど、デフォルトで有効にされていてイヤな感じ。早速高木先生がアップを始めたようです。

iOS用の公式Twitterクライアントでは、TFNTwitterAppGraphというクラスがその辺りの機能を司っているようです。

インストールされているアプリの調査のために、定期的にバックグラウンドタスクが走る作りになっているようですね。

@interface TFNTwitterAppGraph : NSObject {
@private
	BOOL _optinPromptSeenInCurrentSession;
	TFNTwitterAccount* _account;
	NSString* _optOutStatus;
	int _batchSize;
	int _batchInBetweenDelay;
	unsigned _backgroundTask;
	double _longestBatchExecutionDuration;
	double _longestBatchbatchExecutionStartTime;
	double _longestBatchbatchExecutionEndTime;
}
@property(assign, nonatomic) double longestBatchbatchExecutionEndTime;
@property(assign, nonatomic) double longestBatchbatchExecutionStartTime;
@property(assign, nonatomic) double longestBatchExecutionDuration;
@property(assign, nonatomic) unsigned backgroundTask;
@property(assign, nonatomic) int batchInBetweenDelay;
@property(assign, nonatomic) int batchSize;
@property(assign, nonatomic) BOOL optinPromptSeenInCurrentSession;
@property(copy, nonatomic) NSString* optOutStatus;
@property(assign, nonatomic) __weak TFNTwitterAccount* account;
-(void).cxx_destruct;
-(void)updateOptInStatus:(BOOL)status responseBlock:(id)block;
-(void)optOutStatusWithResponseBlock:(id)responseBlock;
-(void)_recordInstalledApps:(id)apps responseBlock:(id)block;
-(void)_logLongestBatchExecution;
-(void)_checkLongestBatchExecutionWithStartTime:(double)startTime endTime:(double)time;
-(void)_endBackgroundTask;
-(void)_startBackgroundTask;
-(BOOL)_cacheExpired;
-(void)_updateLastDetectionDate;
-(void)_optInAndDetectInstalledApps;
-(void)_handleBatchWithEmbeddedAppsDictionary:(id)embeddedAppsDictionary appIds:(id)ids index:(int)index installedApps:(id)apps;
-(void)_detectAppsInBackground;
-(void)_readEmbeddedFileWithCompletionBlock:(id)completionBlock;
-(void)handleOptInPromptImpression;
-(void)detectInstalledAppsIfNecessary;
-(void)start;
-(id)initWithAccount:(id)account;
@end

iOSの公開APIではインストールされているアプリリストを取得する方法はなく、UIApplicationのcanOpenURL:というメソッドでアプリの持つURL Schemeが使用可能かどうかでアプリがインストールされているかどうかを間接的に判断します。(非公開APIとしては、LSApplicationWorkspaceのinstalledApplicationsというものがSpringBoard内に存在します)

「-(void)_handleBatchWithEmbeddedAppsDictionary:〜」というメソッドから、URL Schemeのデータベースを使って総当たりでスキャンするのが分かりますね。

現状では、調査のメソッドが走るたびに2551回UIApplicationのcanOpenURL:が実行されるのでしょう。

この手法で調査できるのは、URL Schemeを持っているアプリ、URL Schemeのデータベースにリストされているアプリのみ。

URL Schemeを持っていないアプリは調査不能。データベースにリストアップされていないアプリも調査対象外となります。

つまり現時点ではURL Schemeのデータベースに登録された2551タイトルのみ。

設定でオフにできますが、何か嫌な感じなので、TwitterAppGraphPatcherという、TFNTwitterAppGraphを無効化するJailbreak Tweakを作りました。(続きは[Read More]から)


免責

TwitterAppGraphPatcherは無保証、無サポートです。自己責任でお使いください。

既知の不具合

適当に作ったので、何かおかしかったらすいません。

動作確認環境

iOS 8.1 / iPhone 5s

履歴

  • 0.0.1-1 2014.11.28 初版

インストール

いつもの New野良リポジトリ をCydiaに登録後、以下のリンクをタップしてインストールしてください。

TwitterAppGraphPatcherをCydiaからインストールする

 - iOS, iPad, iPhone, Jailbreak, Twitter