【问题标题】:Finding list of installed apps on iphone查找 iphone 上已安装应用程序的列表
【发布时间】:2011-06-04 14:55:32
【问题描述】:

是否可以通过编程方式找出我的 iOS 设备上安装的所有应用程序的名称? 是否有任何 API 可用?

感谢您的帮助

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    不,由于沙盒环境,iOS 应用程序无法访问其他应用程序的信息。

    【讨论】:

    • 我找到了一个可行的解决方案,不确定它是否会被苹果接受!!!想法???
    • 是的,该文件可供移动用户读取,但 Apple 可以(并且如果找到)拒绝此类应用程序,因为应用程序只能访问它自己的沙箱,而其他文件只能通过以下方式访问公共 SDK
    • iphone企业版可以用,appstore不一定用。
    【解决方案2】:

    是的,可以获取所有已安装应用的列表

    -(void) allInstalledApp
    {    
        NSDictionary *cacheDict;
    
        NSDictionary *user;
    
        static NSString *const cacheFileName = @"com.apple.mobile.installation.plist";
    
        NSString *relativeCachePath = [[@"Library" stringByAppendingPathComponent: @"Caches"] stringByAppendingPathComponent: cacheFileName];
    
        NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent: @"../.."] stringByAppendingPathComponent: relativeCachePath];
    
        cacheDict    = [NSDictionary dictionaryWithContentsOfFile: path];
    
        user = [cacheDict objectForKey: @"User"];
    
        NSDictionary *systemApp=[cacheDict objectForKey:@"System"];
    }   
    

    systemApp Dictionary 包含所有系统相关应用的列表 而user Dictionary 包含其他应用信息。

    【讨论】:

    【解决方案3】:

    不是来自设备。但是,您可以从桌面查看 iTunes 库。

    【讨论】:

    • 您是在谈论以编程方式进行吗?如果是,您能否提供更多详细信息?
    【解决方案4】:

    有一些方法可以在没有越狱设备的情况下执行此操作,并且不会让您的应用被拒绝。
    1. 获取当前正在运行的进程列表见this SO answer。您需要将进程名称转换为应用名称。
    2. 检查是否有任何应用程序向 UIApplicationDelegate canOpenURL 注册了唯一的 URL 方案。有一些网站对已知的 url 方案进行了编目,this 是最好的。

    如果应用当前未运行且未注册自定义 url 方案,则这些方法不会检测到它。我有兴趣听到一种在应用商店中允许使用的比这更好的方法。

    【讨论】:

      【解决方案5】:

      试试这个,它甚至可以在非越狱设备上工作:

      #include <objc/runtime.h>
      Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
      SEL selector=NSSelectorFromString(@"defaultWorkspace");
      
      NSObject* workspace = [LSApplicationWorkspace_class performSelector:selector];
      
      SEL selectorALL = NSSelectorFromString(@"allApplications");
      
      NSLog(@"apps: %@", [workspace performSelector:selectorALL]);//will give you all **Bundle IDS** of user's all installed apps
      

      【讨论】:

      • 如何从中解析应用名称和捆绑 ID?请帮帮我
      • @VikashRajput 我的答案已经过 100% 的测试。您将在上述代码的最后一行中获得所有应用程序(即 Bundle ID),但由于沙盒,您无法覆盖任何内容。但是,您可以谷歌搜索它。如果它对你有帮助,那么应该有一个upvote :) .
      • 它将给出一个 LSApplicationProxy 类型对象的数组,但我无法将包 ID 获取为 NSString。你能把bundle id解析为NSString吗?
      • [工作区 performSelector:selectorALL] objectAtIndexPath:0];打印这个你会得到第一个索引,然后使用这个使用for循环并分成字符串
      【解决方案6】:

      您可以通过canOpenURL方法检查是否安装了应用程序,或者通过检查后台进程并将它们与您感兴趣的应用程序的名称匹配。

      【讨论】:

        【解决方案7】:

        您可以使用运行时目标 c 来获取所有已安装应用程序的列表。它会给你一个 LSApplicationProxy 对象的数组。

        下面是一个代码 sn-p,它会打印您设备中安装的所有应用程序的名称。

        Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
        NSObject* workspace = [LSApplicationWorkspace_class performSelector:NSSelectorFromString(@"defaultWorkspace")];
        NSMutableArray *array = [workspace performSelector:NSSelectorFromString(@"allApplications")];
        
        NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
        for (id lsApplicationProxy in array) {
            if(nil != [lsApplicationProxy performSelector:NSSelectorFromString(@"itemName")]){
                [mutableArray addObject:[lsApplicationProxy performSelector:NSSelectorFromString(@"itemName")]];
            }
        }
        NSLog(@"********* Applications List ************* : \n %@",mutableArray);
        

        不要忘记包含&lt;objc/runtime.h&gt;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-17
          • 2011-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-08
          相关资源
          最近更新 更多