[JB]iOS用公式Twitterクライアントに追加された端末インストールアプリ一覧取得機能の調査と無効化
価値ある情報をユーザー視点で発信するブログ
公式Twitterクライアントに、端末にインストールされたアプリリストを取得する機能が追加されました。
Twitterがスマホにインストールされたアプリ一覧の取得を開始予定、設定解除も可能 – GIGAZINE
別に大したアプリを入れているわけじゃないけれど、デフォルトで有効にされていてイヤな感じ。早速高木先生がアップを始めたようです。
.@TwitterJP こんにちわ〜o(^^)o 人が電子計算機を使用するに際してその意図に反する動作をさせるべき不正な指令を与える公式アプリのアプデ、すごいですね\(^o^)/
— Hiromitsu Takagi (@HiromitsuTakagi) November 27, 2014
「以下の小さな変更」は何を隠蔽したのですか(・_・)?pic.twitter.com/vrmkhViFAb
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タイトルのみ。
app_store_app_data.jsonってファイルに2551個のURLスキームが書いてあるからそれを元にcanOpenURL:をするのかな。
— kishikawa katsumi (@k_katsumi) November 27, 2014
設定でオフにできますが、何か嫌な感じなので、TwitterAppGraphPatcherという、TFNTwitterAppGraphを無効化するJailbreak Tweakを作りました。(続きは[Read More]から)
TwitterAppGraphPatcherは無保証、無サポートです。自己責任でお使いください。
適当に作ったので、何かおかしかったらすいません。
iOS 8.1 / iPhone 5s
いつもの New野良リポジトリ をCydiaに登録後、以下のリンクをタップしてインストールしてください。
TwitterAppGraphPatcherをCydiaからインストールする