すべてのアプリケーションとスキームをスキャンし、プライベートAPIを使用して取得する必要があるプライベートアプリがありますLSApplicationWorkspace defaultWorkspace
privateURLSchemes
allInstalledApplications
などの他の関数メソッドを使用します。このアプリはうまく機能し、iOS 11より前のプライベートAPIから必要なものをすべて取得できますが、このバージョンでは、警告と空の配列しか表示されませんでした。 Appleは、開発者がiOS11のプライベートで使用できないプライベートAPIを制限しているようです。
だから私の質問は、iOS 11で私のニーズを達成するための代替方法は何ですか?
更新:この方法はiOS12では機能しません-資格が必要です
特定のアプリケーションがインストールされているかどうかを確認する方法があります。返されたallInstalledApplications
のようなすべてのアプリのリストではありませんが、特定のバンドルIDを照会するのに役立ちます。
次に例を示します。メソッドはバンドルIDを受け取り、デバイスにインストールされている場合はtrueを返します。
- (BOOL)checkIfAppInstalled: (NSString*)bundleID {
dlopen("/System/Library/PrivateFrameworks/MobileContainerManager.framework/MobileContainerManager",RTLD_NOW);
Class MBAppManager = NSClassFromString(@"MCMAppDataContainer");
NSError * error ;
id contentApp = [MBAppManager performSelector:@selector(containerWithIdentifier:error:) withObject:bundleID withObject:error];
return contentApp != nil;
}
企業では、Appleモバイルデバイス管理(MDM)プロトコルManagedApplicationListコマンドを使用して、管理対象アプリケーションのステータスを取得できます
から この投稿 。元の質問の下の@ovoのコメントから、それはうまくいくようです。
MobileContainerManager.framework
を使用すると、バンドルIDを使用してアプリがインストールされているかどうかを確認できます。
//If the device is iOS11
if ([[UIDevice currentDevice].systemVersion floatValue] >= 11.0) {
NSBundle *container = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/MobileContainerManager.framework"];
if ([container load]) {
Class appContainer = NSClassFromString(@"MCMAppContainer");
id test = [appContainer performSelector:@selector(containerWithIdentifier:error:) withObject:bundleId withObject:nil];
NSLog(@"%@",test);
if (test) {
return YES;
} else {
return NO;
}
}
return NO;
} else {
//Usual way
}
プライベートAPIはまさにそれです—プライベートAPI。これの使用は完全にサポートされていないため、OSの将来のバージョンで引き続き機能するプライベートAPIに依存することはできません。
さらに、プライベートAPIを使用するアプリがApp Storeにアクセスできたとしたら、それはAppleのレビュー担当者がスキャンするものの1つであるため、非常に驚きます。