方法一
 
 
1.获取手机中安装的所有App
  1.1.runtime中的方法,所以要导入
      #include <objc/runtime.h>
 
1.2.在 AppDelegate.m文件中的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中:
 
    

Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");

NSObject* workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];

NSArray *allApplications = [workspace performSelector:@selector(allApplications)];//这样就能获取到手机中安装的所有App

NSLog(@"设备上安装的所有app:%@",allApplications);

 
打印出来是这样的:          
          app = <LSApplicationProxy: 0x1566a3c50> com.apple.mobilesms.notification <file:///Applications/MessagesNotificationViewService.app>
          app = <LSApplicationProxy: 0x1566a5850> com.apple.mobilesms.compose <file:///Applications/MessagesViewService.app>
          app = <LSApplicationProxy: 0x1566a60e0> com.apple.Fitness <file:///Applications/Fitness.app>
          app = <LSApplicationProxy: 0x1566a6790> com.apple.Home.HomeUIService <file:///Applications/HomeUIService.app>
          app = <LSApplicationProxy: 0x1566a6d60> com.apple.StoreDemoViewService <file:///Applications/StoreDemoViewService.app>
          app = <LSApplicationProxy: 0x1566a7240> com.apple.videos <file:///Applications/Videos.app>
       
 
2.判断手机中是否安装了某个App
这就需要对我们获取到的allApplications做一下处理,这个数组中装的并不是常规的字符串,我们可以从打印结果看出,是一个LSApplicationProxy类型的,我们要把这个转换成字符串,而且我们可以从打印结果看出,这个字符串中不只包含了App的bundle ID,还包含了安装的路径,因为这个路径不唯一不确定,我们判断是否安装了某个App只需判断这个字符串中的bundle ID,所有我们还要对字符串做处理。
 

NSInteger zlConnt = 0;

for (NSString *appStr in allApplications) {

NSString *app = [NSString stringWithFormat:@"%@",appStr];//转换成字符串

NSRange range = [app rangeOfString:@"org.ios.appprojuct.jqb"];//是否包含这个bundle ID

if (range.length > 1) {

zlConnt ++;

}

}

if (zlConnt >= 1) {

NSLog(@"已经安装");

}

 

使用上述方式,首先要先知晓目标App的bundle ID。查bundle ID方法的是下载目标App的ipa安装包,将.ipa改成.zip,然后右键显示包内容,查找到info.plist文件,打开找到Bundle identifier对应的value值就是bundle ID了。

缺点:方法一消耗一定的性能(手机安装APP比较多的话),APP审核有可能被拒

优点:跳过了ios9.0对canOpenURL这个API使用限制

 
 
方法二
 

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"IOSDevApp://"]]){

//说明此设备有安装app

}else{

//说明此设备没有安装app

};

这个方法简单高效,也有使用前提,需要提前知晓目标APP的URL Schemes ,这个URL Schemes 查找方式跟上面 bundle ID一样,也在info.plist中,在URL types数组下。

同时也有缺点,ios9以上的系统,需要设置白名单,否则就是目标APP安装了,方法二也会返回NO。

白名单设置方式:在info.plist中添加(0和1 指的是微信,2指的是支付宝 ,3指的是头条,4指的是支付宝分享)

 
 
 
 

ios-判断手机上是否安装了某个App的更多相关文章

  1. [Android] 判断手机上是否安装了某个程序

    http://blog.csdn.net/xiaodongrush/article/details/9320135 1. 首先得到该程序的包名 这个连上手机ADB,看logcat就能看到.比如:QQ客 ...

  2. js判断移动端是否安装某款app的多种方法

    本文实例讲解了js判断移动端是否安装某款app的多种方法,分享给大家供大家参考,具体内容如下 第一种方法: 一:判断是那种设备 ? || u.indexOf(; //android终端或者uc浏览器 ...

  3. Android检查手机上是否安装了第三方软件的方法------本文以百度地图为例

    package com.example.myapi.thirdbaidumap; import java.net.URISyntaxException; import java.util.ArrayL ...

  4. Android 检查手机上是否安装了指定的软件(根据包名检测)

    Android检查手机上是否安装了指定的软件(根据包名检测) /** * 检查手机上是否安装了指定的软件 * @param context * @param packageName * @return ...

  5. app分享时判断手机是否已安装微信或QQ客户端

    /** * 判断 用户是否安装微信客户端 */ public static boolean isWeixinAvilible(Context context) { final PackageManag ...

  6. 利用私有的API获得手机上所安装的所有应用信息(包括版本,名称,bundleID,类型)

    MobileCoreService这个系统的库,里面有个私有的类LSApplicationWorkspace ,利用运行时可以获得私有类里面的方法,- (id)allInstalledApplicat ...

  7. 在多台手机上批量安装apk

    1.手机要打开adb调试 2.该程序可以实现台android手机的多个apk批量安装 1.getSeriaoNum.py模块,该模块获取已连接手机的序列号 import os import threa ...

  8. iOS和macOS上的Message-ID和Mail.app深度链接

    如何在iOS上通过电子邮件进行无缝的“无密码”身份验证. Apple平台上的邮件和日历集成 在macOS和iOS上查看电子邮件时,邮件会在[检测到的日期和时间]下划线 .您可以与他们互动以创建新的日历 ...

  9. 您的手机上未安装应用程序 android 点击快捷方式提示未安装程序的解决

    最近APP出现一个很奇怪的问题,在Android 4.4.2和android 4.4.3系统上点击应用的快捷方式,打不开应用,而且会提示未安装程序. 确认了应用的MainActivity中设置了and ...

随机推荐

  1. noip模拟赛 轰炸

    题目描述 C国和W国爆发了战争!YJC决定对W国的n个城市进行轰炸.每个城市都有一个重要度ai.设xi=‘重要度大于ai的城市数+1’,那么编号为i城市就是第xi个被轰炸的城市.显然这样能保证重要度大 ...

  2. 中庸之道(codevs 2021)

    题目描述 Description 给定一个长度为N的序列,有Q次询问,每次询问区间[L,R]的中位数. 数据保证序列中任意两个数不相同,且询问的所有区间长度为奇数. 输入描述 Input Descri ...

  3. D - Doing Homework 状态压缩 DP

    Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every ...

  4. Mybatis错误——Could not find parameter map java.util.Map

    错误信息 org.apache.ibatis.builder.IncompleteElementException: Could not find parameter map java.util.Ma ...

  5. angularjs中比较实用的multipleselect选择框

    一. HTML HTML中比较多逻辑代码,修改的时候要注意修改很多绑值的地方. <div class="form-group"> <label class=&qu ...

  6. Node: Updating npm's bundled node gyp

    Linux, Mac OS X, Solaris, etc. Unix is easy. Just run the following command. Use sudo if necessary. ...

  7. TCP/IP具体解释学习笔记--TCP的坚持和保活定时器

    TCP的坚持定时器 1.基本概念 TCP的接收方指名希望从发送方接收的数据字节(窗体大小)来进行流量控制,假设窗体大小为0.那么放送方就会阻止发送数据,直到接收方发来一个已跟新窗体大小的ACK为止,那 ...

  8. Android开发系列(二十四):Notification的功能与使用方法

    关于消息的提示有两种:一种是Toast,一种就是Notification.前者维持的时间比較短暂.后者维持的时间比較长. 并且我们寻常手机的应用比方网易.贴吧等等都有非常多的推送消息,就是用Notif ...

  9. hdu 2255奔小康赚大钱 KM算法模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=2255 一,KM算法:(借助这个题写一下个人对km的理解与km模板) KM算法主要是用来求解图的最优匹 ...

  10. Redis缓存数据库安全加固指导(一)

    背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一 ...