`
shappy1978
  • 浏览: 704420 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[trans] 关于获取IOS应用列表

 
阅读更多

当两天没事儿,突然想起这么一个命题:获取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"]);
}

这种方法是获取运行中的应用列表。如果应用没被运行过或不在后台,就得不到喽。

比起上面两个方法要靠谱一点儿的就是私有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;
}

不过这种方法需要机器已经越狱,还需要你的应用不在沙盒里,由于后一条笔者还不大会搞,所以没试成功:)

分享到:
评论

相关推荐

    transmac10.4

    transmac10.4 ios固件编辑工具

    TransMac 12.3.rar

    以下是关于TransMac的一些关键知识点: 1. **跨平台兼容性**:TransMac解决了Windows和Mac之间的文件系统兼容问题,使得Windows用户可以无缝地访问、复制、粘贴、移动、删除以及创建Mac格式的磁盘上的文件。 2. **...

    TransMac_14.4

    3. **刻录.dmg镜像**:软件的核心功能之一是刻录Mac OS的.dmg镜像到CD、DVD或闪存驱动器上,这在安装Mac应用或者恢复系统时尤为实用。 4. **转换磁盘格式**:TransMac还支持将非Mac格式的磁盘转换为HFS+或APFS格式...

    TransE算法代码实现.rar

    总之,TransE算法是一种有效的知识图谱表示学习方法,它的C++实现可以帮助开发者在实际项目中应用这一技术。通过学习和实践这样的代码,不仅可以提升对TransE的理解,还能掌握知识图谱处理的技能,这对于从事自然...

    TransMac11.4免安装版

    TransMac是一款专为Windows用户设计的软件,它允许用户轻松地与Apple的Mac OS系统进行交互,特别是处理与Mac相关的文件格式和磁盘操作。在标题"TransMac11.4免安装版"中,我们可以理解这个版本是11.4的TransMac,...

    TransMac.v10.4 好用的黑苹果软件

    5. **软件更新**:定期检查和安装新版本的TransMac可以确保软件的安全性和稳定性,同时获取任何新增的功能。 6. **开发者支持**:软件分享站点通常依赖用户的点击支持,这种链接可能是对提供软件的个人或团队的一种...

    TranSE算法实现及测试

    TranSE模型在知识图谱补全、问答系统、推荐系统等领域都有广泛应用。为进一步提升模型性能,后续研究者提出了许多改进版,如TransH、TransD等,它们引入了关系特定的向量空间或变换,增强了对复杂关系表达的能力。 ...

    IEEE trans期刊整理1

    IEEE Transactions on Energy Conversion是能源转换领域中最重要的期刊之一,涵盖了能源转换的研究、开发、设计、应用、构建、安装、操作、分析等多个方面。该期刊的主要焦点是能源转换的研究和开发,包括: * 能源...

    transMac.zip

    《transMac:跨越平台的苹果系统管理利器》 ...通过这个压缩包,用户可以一站式获取所有必要的资源,从而高效、安全地进行苹果系统的管理。对于那些对苹果系统感兴趣的Windows用户,transMac无疑是一款必备的软件。

    Laravel开发-trans

    `trans`函数用于获取翻译文件中的字符串,这些文件通常位于`resources/lang`目录下,每个语言都有一个单独的子目录,如`en`(英语)、`fr`(法语)等。翻译文件通常是以`.php`为扩展名,其中包含键值对,键是英文...

    黑苹果系统U盘制作工具TransMac121.zip

    关于“标签”,“TransMac”是软件的名字,表明了我们要讨论的主题;“黑苹果”则暗示了这个工具的主要用途,即帮助用户在非苹果硬件上安装macOS系统。 在“压缩包子文件的文件名称列表”中,我们只有一个条目:...

    trans-formas仪表操作

    在IT行业中,仪表通常指的是用户界面中用于显示实时数据、指标或性能的图形化组件,它们常用于监控系统状态、业务表现或应用程序性能。Trans-Formas可能是一个专门的软件平台,用于处理和可视化复杂的数据流。 在...

    Transmac 10.4

    - APFS(Apple File System)是苹果在2017年推出的新一代文件系统,具有加密、快照、空间共享等功能,适用于iOS、macOS以及watchOS等平台。 2. **Transmac 10.4 主要功能** - **读取Mac磁盘**:用户可以使用Trans...

    transmac 10.3 注册版

    transmac 10.3 注册版,在Win下访问Mac分区并操作的软件 高于这个版本的找不到序列号

    TransMac12.2破解版

    TransMAC12.2是一个在Windows下写入苹果镜像的软件,一般用于将原版MacOS原版镜像烧录到U盘,安装黑苹果必备,这个最新的12.2破解版,解压后替换主文件即可完成破解

    TransMac11破解版

    TransMac11破解版 黑苹果安装专用 小白们来下载

    TransMac.zip

    8. **兼容性**:TransMac与各种Windows版本兼容,包括最新的Windows 10,确保了广泛的应用场景。 在使用TransMac时,用户需要注意正确操作,避免数据丢失。同时,由于涉及到不同操作系统间的文件系统操作,可能需要...

    trans

    在IT中,字体是关于文本显示的重要组成部分,涉及到用户界面、网页设计、文本处理等多个方面。以下是一些与“字体”相关的知识点: 1. **字体类型**:字体可以分为衬线字体(如Times New Roman)、无衬线字体(如...

    TransMac win

    2. **详细报表.txt** - 这个文件可能是关于TransMac软件的详细使用报告、日志或者安装指南。".txt" 表示这是一个纯文本文件,通常用于记录信息,便于用户阅读和理解。 **TransMac相关知识点:** 1. **跨平台兼容性...

Global site tag (gtag.js) - Google Analytics