当两天没事儿,突然想起这么一个命题:获取IOS应用安装列表。
研究来研究去最后也没有得出个所以然来。这不今天上网,发现这篇儿文章。晾这说有三种方法。也就顺便总结一下,边转载边补充。
ok,说是三种方法,靠谱的两种:
1.openURL
我们知道可以给应用设置URL Scheme,这样别的应用就可以通过这个地址打开咱们的应用。其实还有一个api叫canOpenURL.这样如果咱们知道要检查的IOS应用列表的URL Scheme的话,就可以用canOpenURL检查一下。
2.获取运行程序列表
// .h
@interface UIDevice (ProcessesAdditions)
- (NSArray *)runningProcesses;
@end
// .m
#import <sys/sysctl.h>
@implementation UIDevice (ProcessesAdditions)
- (NSArray *)runningProcesses {
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
size_t miblen = 4;
size_t size;
int st = sysctl(mib, miblen, NULL, &size, NULL, 0);
struct kinfo_proc * process = NULL;
struct kinfo_proc * newprocess = NULL;
do {
size += size / 10;
newprocess = realloc(process, size);
if (!newprocess){
if (process){
free(process);
}
return nil;
}
process = newprocess;
st = sysctl(mib, miblen, process, &size, NULL, 0);
} while (st == -1 && errno == ENOMEM);
if (st == 0){
if (size % sizeof(struct kinfo_proc) == 0){
int nprocess = size / sizeof(struct kinfo_proc);
if (nprocess){
NSMutableArray * array = [[NSMutableArray alloc] init];
for (int i = nprocess - 1; i >= 0; i--){
NSString * processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid];
NSString * processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm];
NSDictionary * dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:processID, processName, nil]
forKeys:[NSArray arrayWithObjects:@"ProcessID", @"ProcessName", nil]];
[processID release];
[processName release];
[array addObject:dict];
[dict release];
}
free(process);
return [array autorelease];
}
}
}
return nil;
}
@end
// Example usage.
NSArray * processes = [[UIDevice currentDevice] runningProcesses];
for (NSDictionary * dict in processes){
NSLog(@"%@ - %@", [dict objectForKey:@"ProcessID"], [dict objectForKey:@"ProcessName"]);
}
@interface UIDevice (ProcessesAdditions)
- (NSArray *)runningProcesses;
@end
// .m
#import <sys/sysctl.h>
@implementation UIDevice (ProcessesAdditions)
- (NSArray *)runningProcesses {
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
size_t miblen = 4;
size_t size;
int st = sysctl(mib, miblen, NULL, &size, NULL, 0);
struct kinfo_proc * process = NULL;
struct kinfo_proc * newprocess = NULL;
do {
size += size / 10;
newprocess = realloc(process, size);
if (!newprocess){
if (process){
free(process);
}
return nil;
}
process = newprocess;
st = sysctl(mib, miblen, process, &size, NULL, 0);
} while (st == -1 && errno == ENOMEM);
if (st == 0){
if (size % sizeof(struct kinfo_proc) == 0){
int nprocess = size / sizeof(struct kinfo_proc);
if (nprocess){
NSMutableArray * array = [[NSMutableArray alloc] init];
for (int i = nprocess - 1; i >= 0; i--){
NSString * processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid];
NSString * processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm];
NSDictionary * dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:processID, processName, nil]
forKeys:[NSArray arrayWithObjects:@"ProcessID", @"ProcessName", nil]];
[processID release];
[processName release];
[array addObject:dict];
[dict release];
}
free(process);
return [array autorelease];
}
}
}
return nil;
}
@end
// Example usage.
NSArray * processes = [[UIDevice currentDevice] runningProcesses];
for (NSDictionary * dict in processes){
NSLog(@"%@ - %@", [dict objectForKey:@"ProcessID"], [dict objectForKey:@"ProcessName"]);
}
这种方法是获取运行中的应用列表。如果应用没被运行过或不在后台,就得不到喽。
比起上面两个方法要靠谱一点儿的就是私有API了。
BOOL APCheckIfAppInstalled(NSString *bundleIdentifier){
static NSString *const cacheFileName = @"com.apple.mobile.installation.plist";
NSString *relativeCachePath = [[@"Library" stringByAppendingPathComponent: @"Caches"] stringByAppendingPathComponent: cacheFileName];
NSDictionary *cacheDict = nil;
NSString *path = nil;
NSLog(@"relativeCachePath:%@",relativeCachePath);
// Loop through all possible paths the cache could be in
for (short i = 0; 1; i++) {
switch (i) {
case 0: // Jailbroken apps will find the cache here; their home directory is /var/mobile
path = [NSHomeDirectory() stringByAppendingPathComponent: relativeCachePath];
break;
case 1: // App Store apps and Simulator will find the cache here; home (/var/mobile/) is 2 directories above sandbox folder
path = [[NSHomeDirectory() stringByAppendingPathComponent: @"../.."] stringByAppendingPathComponent: relativeCachePath];
break;
case 2: // If the app is anywhere else, default to hardcoded /var/mobile/
path = [@"/var/mobile" stringByAppendingPathComponent: relativeCachePath];
break;
default: // Cache not found (loop not broken)
return NO;
break;
}
BOOL isDir = NO;
NSLog(@"path:%@",path);
// Ensure that file exists
if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir] && !isDir){
cacheDict = [NSDictionary dictionaryWithContentsOfFile: path];
}
// If cache is loaded, then break the loop. If the loop is not "broken," it will return NO later (default: case)
if (cacheDict){
NSLog(@"cacheDict:%@",cacheDict);
break;
}
}
NSLog(@"gggg");
// First check all system (jailbroken) apps
NSDictionary *system = [cacheDict objectForKey: @"System"];
NSLog(@"system:%@",system);
if ([system objectForKey: bundleIdentifier]){
return YES;
}
// Then all the user (App Store /var/mobile/Applications) apps
NSDictionary *user = [cacheDict objectForKey: @"User"];
NSLog(@"user:%@",user);
if ([user objectForKey: bundleIdentifier]){
return YES;
}
// If nothing returned YES already, we'll return NO now
return NO;
}
static NSString *const cacheFileName = @"com.apple.mobile.installation.plist";
NSString *relativeCachePath = [[@"Library" stringByAppendingPathComponent: @"Caches"] stringByAppendingPathComponent: cacheFileName];
NSDictionary *cacheDict = nil;
NSString *path = nil;
NSLog(@"relativeCachePath:%@",relativeCachePath);
// Loop through all possible paths the cache could be in
for (short i = 0; 1; i++) {
switch (i) {
case 0: // Jailbroken apps will find the cache here; their home directory is /var/mobile
path = [NSHomeDirectory() stringByAppendingPathComponent: relativeCachePath];
break;
case 1: // App Store apps and Simulator will find the cache here; home (/var/mobile/) is 2 directories above sandbox folder
path = [[NSHomeDirectory() stringByAppendingPathComponent: @"../.."] stringByAppendingPathComponent: relativeCachePath];
break;
case 2: // If the app is anywhere else, default to hardcoded /var/mobile/
path = [@"/var/mobile" stringByAppendingPathComponent: relativeCachePath];
break;
default: // Cache not found (loop not broken)
return NO;
break;
}
BOOL isDir = NO;
NSLog(@"path:%@",path);
// Ensure that file exists
if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir] && !isDir){
cacheDict = [NSDictionary dictionaryWithContentsOfFile: path];
}
// If cache is loaded, then break the loop. If the loop is not "broken," it will return NO later (default: case)
if (cacheDict){
NSLog(@"cacheDict:%@",cacheDict);
break;
}
}
NSLog(@"gggg");
// First check all system (jailbroken) apps
NSDictionary *system = [cacheDict objectForKey: @"System"];
NSLog(@"system:%@",system);
if ([system objectForKey: bundleIdentifier]){
return YES;
}
// Then all the user (App Store /var/mobile/Applications) apps
NSDictionary *user = [cacheDict objectForKey: @"User"];
NSLog(@"user:%@",user);
if ([user objectForKey: bundleIdentifier]){
return YES;
}
// If nothing returned YES already, we'll return NO now
return NO;
}
不过这种方法需要机器已经越狱,还需要你的应用不在沙盒里,由于后一条笔者还不大会搞,所以没试成功:)
相关推荐
transmac10.4 ios固件编辑工具
以下是关于TransMac的一些关键知识点: 1. **跨平台兼容性**:TransMac解决了Windows和Mac之间的文件系统兼容问题,使得Windows用户可以无缝地访问、复制、粘贴、移动、删除以及创建Mac格式的磁盘上的文件。 2. **...
3. **刻录.dmg镜像**:软件的核心功能之一是刻录Mac OS的.dmg镜像到CD、DVD或闪存驱动器上,这在安装Mac应用或者恢复系统时尤为实用。 4. **转换磁盘格式**:TransMac还支持将非Mac格式的磁盘转换为HFS+或APFS格式...
总之,TransE算法是一种有效的知识图谱表示学习方法,它的C++实现可以帮助开发者在实际项目中应用这一技术。通过学习和实践这样的代码,不仅可以提升对TransE的理解,还能掌握知识图谱处理的技能,这对于从事自然...
TransMac是一款专为Windows用户设计的软件,它允许用户轻松地与Apple的Mac OS系统进行交互,特别是处理与Mac相关的文件格式和磁盘操作。在标题"TransMac11.4免安装版"中,我们可以理解这个版本是11.4的TransMac,...
5. **软件更新**:定期检查和安装新版本的TransMac可以确保软件的安全性和稳定性,同时获取任何新增的功能。 6. **开发者支持**:软件分享站点通常依赖用户的点击支持,这种链接可能是对提供软件的个人或团队的一种...
TranSE模型在知识图谱补全、问答系统、推荐系统等领域都有广泛应用。为进一步提升模型性能,后续研究者提出了许多改进版,如TransH、TransD等,它们引入了关系特定的向量空间或变换,增强了对复杂关系表达的能力。 ...
IEEE Transactions on Energy Conversion是能源转换领域中最重要的期刊之一,涵盖了能源转换的研究、开发、设计、应用、构建、安装、操作、分析等多个方面。该期刊的主要焦点是能源转换的研究和开发,包括: * 能源...
《transMac:跨越平台的苹果系统管理利器》 ...通过这个压缩包,用户可以一站式获取所有必要的资源,从而高效、安全地进行苹果系统的管理。对于那些对苹果系统感兴趣的Windows用户,transMac无疑是一款必备的软件。
`trans`函数用于获取翻译文件中的字符串,这些文件通常位于`resources/lang`目录下,每个语言都有一个单独的子目录,如`en`(英语)、`fr`(法语)等。翻译文件通常是以`.php`为扩展名,其中包含键值对,键是英文...
关于“标签”,“TransMac”是软件的名字,表明了我们要讨论的主题;“黑苹果”则暗示了这个工具的主要用途,即帮助用户在非苹果硬件上安装macOS系统。 在“压缩包子文件的文件名称列表”中,我们只有一个条目:...
在IT行业中,仪表通常指的是用户界面中用于显示实时数据、指标或性能的图形化组件,它们常用于监控系统状态、业务表现或应用程序性能。Trans-Formas可能是一个专门的软件平台,用于处理和可视化复杂的数据流。 在...
- APFS(Apple File System)是苹果在2017年推出的新一代文件系统,具有加密、快照、空间共享等功能,适用于iOS、macOS以及watchOS等平台。 2. **Transmac 10.4 主要功能** - **读取Mac磁盘**:用户可以使用Trans...
transmac 10.3 注册版,在Win下访问Mac分区并操作的软件 高于这个版本的找不到序列号
TransMAC12.2是一个在Windows下写入苹果镜像的软件,一般用于将原版MacOS原版镜像烧录到U盘,安装黑苹果必备,这个最新的12.2破解版,解压后替换主文件即可完成破解
TransMac11破解版 黑苹果安装专用 小白们来下载
8. **兼容性**:TransMac与各种Windows版本兼容,包括最新的Windows 10,确保了广泛的应用场景。 在使用TransMac时,用户需要注意正确操作,避免数据丢失。同时,由于涉及到不同操作系统间的文件系统操作,可能需要...
在IT中,字体是关于文本显示的重要组成部分,涉及到用户界面、网页设计、文本处理等多个方面。以下是一些与“字体”相关的知识点: 1. **字体类型**:字体可以分为衬线字体(如Times New Roman)、无衬线字体(如...
2. **详细报表.txt** - 这个文件可能是关于TransMac软件的详细使用报告、日志或者安装指南。".txt" 表示这是一个纯文本文件,通常用于记录信息,便于用户阅读和理解。 **TransMac相关知识点:** 1. **跨平台兼容性...