When programming with object-C for iOS, in some case, you may need to get list of installed apps on iOS device. Here we have a simple step to get that list which contains BundleURLSchemes.
BOOL isDir= NO;
static NSString *const cacheFileName = @"com.apple.mobile.installation.plist";
NSString *relativeCachePath = [[@"Library" stringByAppendingPathComponent: @"Caches"] stringByAppendingPathComponent: cacheFileName];
NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent: @"../.."] stringByAppendingPathComponent: relativeCachePath];
NSMutableArray *list;
if ([[NSFileManager defaultManager] fileExistsAtPath: path isDirectory: &isDir] && !isDir) // Ensure that file exists
{
cacheDict = [NSDictionary dictionaryWithContentsOfFile: path]; //cacheDict contains 3 key: System, Metadata, User
//get list System apps
list = [NSMutableArray arrayWithArray:[[cacheDict objectForKey: @"System"] allKeys]];
//get list user apps
[list addObjectsFromArray:[[cacheDict objectForKey: @"User"] allKeys]];
}
}
Each item in list contains some attribute as:
- CFBundleIdentifier
- CFBundleDisplayName
- CFBundleURLTypes (some apps don't have value in this attribute)
- CFBundleURLName
- CFBundleURLSchemes
- ...
Additional, you can filter list to delete some app which don't have BundleURL:
//remove app without having url
NSMutableArray *tmpList = [NSMutableArray arrayWithArray:list];
NSString *appType;
for (NSString *app in tmpList) {
if ([[cacheDict objectForKey:@"System"] objectForKey:app]) {
appType = @"System";
}
else {
appType = @"User";
}
if (!([[[cacheDict objectForKey:appType] objectForKey:app] objectForKey:@"CFBundleURLTypes"])) {
[list removeObject:app];
}
}
With the list, you can use item's CFBundleURLSchemes to run an iOS app by CFBundleURLSchemes.
That's all.
Wish succeed!
Comments
Post a Comment