渣渣兔 发表于 2025-3-8 20:39:17

IOS如何判断一个应用是否已安装以及获取已安装列表

一、如何判断一个应用是否已安装

网上给出最多的方案为根据应用的协议判断是否可以启动应用从而判断某应用是否已安装
1、示例代码

如下代码可通过协议判断某应用是否已安装,传入对应的协议即可
    ///检测应用是否被安装
    func isAppInstalled(scheme: String) -> Bool {
      if let url = URL(string: scheme) {
            return UIApplication.shared.canOpenURL(url)
      }
      return false
    }  如下代码为点击按钮判断是否安装了微信、淘宝、微博的代码:
               
                Button("判断是否安装了微信"){
                  if isAppInstalled(scheme: "weixin://") {
                        log = "是否安装了微信:是"
                  } else {
                        log = "是否安装了微信:否"
                  }
                        
                }.padding()
                  .background(.blue)
                  .foregroundColor(.white)
                  .cornerRadius(40)
               
                Button("判断是否安装了淘宝"){
                  if isAppInstalled(scheme: "taobao://") {
                        log = "是否安装了淘宝:是"
                  } else {
                        log = "是否安装了淘宝:否"
                  }
                        
                }.padding()
                  .background(.blue)
                  .foregroundColor(.white)
                  .cornerRadius(40)
               
                Button("判断是否安装了微博"){
                  if isAppInstalled(scheme: "sinaweibo://") {
                        log = "是否安装了微博:是"
                  } else {
                        log = "是否安装了微博:否"
                  }
                        
                }.padding()
                  .background(.blue)
                  .foregroundColor(.white)
                  .cornerRadius(40)
                2、利用前提

利用以上方法有个前提是必须要现在项目的清单文件里配置跳转协议url白名单才行:如下图,如果要想查微信、淘宝、微博是否安装,必须增加白名单,否则直接调用isAppInstalled(scheme: "weixin://")一定会返回false,即不生效。
https://i-blog.csdnimg.cn/direct/24d9035d98184acb91e9b8fb3047692a.png
如图下图,是打到安装包里的信息,会在安装包里的info.plist清单文件中
https://i-blog.csdnimg.cn/direct/42b7a7e4a8f84568a0f105bb4938bcad.png
3、执行结果

https://i-blog.csdnimg.cn/direct/b7787cf16c2249b8b98992bc2c66ec3d.png
4、此方法是否靠谱

可以看到这个方法本质是通过目标应用所特有的协议去判断目标应用是否已安装,并非直接通过报名判断。这就要确保协议的唯一性,而如果有多个应用界说了相同的协议,则此方法大概会不正确。

二、如何界说一个自己的协议以及如何知道某个目标应用的协议

1、自己的应用界说协议

在项目配置文件中加一个URL Scheme即可
https://i-blog.csdnimg.cn/direct/d116c701cec84f68a95c4b132550e596.png
最终在info.plist中表现如下:
https://i-blog.csdnimg.cn/direct/b5e296cada754a628cc8022c4aa05e48.png

2、如何获取某个应用界说的协议,抖音为例

通过上一步界说方法,可以看到界说协议是在项目清单文件中,类似Android的manifest中,故拿到目标应用的安装包就知道了它所界说的协议,以抖音为例:我们需要借助爱思助手拿到抖音安装包
https://i-blog.csdnimg.cn/direct/c95dea90ce35465b9f05d57d30c96703.png
https://i-blog.csdnimg.cn/direct/ae0bc692145841b19e0b6e35b5f9a5e8.png
https://i-blog.csdnimg.cn/direct/3473784f49594f9aa408d64894ae44e3.png
通过借助爱思助手下载到抖音的ipa安装包,并解压得到如下抖音安装包的清单文件:
通过搜刮关键字【CFBundleURLSchemes】可以看到抖音实在自身注册了很多协议
https://i-blog.csdnimg.cn/direct/a2dd110ee8954fcea30b04197d109279.png
3、用抖音的协议做测试判断是否安装

我们选取一个和抖音关系不那么大的协议协议【snssdk1128luckydogsocial】试试看:
最终发现,当抖音安装时,返回是,当卸载抖音时,发挥否。试了其他抖音注册的协议发现也都是可行的,但不确保这些协议是否仅抖音注册,其他应用是否也同样注册。
https://i-blog.csdnimg.cn/direct/a0c4d6f66323403085af5bcb7b6a357c.png

4、抖音对哪些协议加了白名单?抖音是否有通过这些协议判断某应用是否安装呢?

如下图,通过搜刮关键字【LSApplicationQueriesSchemes】可以看到抖音给120个协议加了白名单,即抖音大概会通过这120个协议吊起某些应用,但是否用这些协议来判断某应用是否已安装就不得为之,由于差别的应用是可以注册相同的协议的。


[*]如果一个应用有其特点的协议,比如微信的协议有【weixin】,支付宝的协议有【alipay】,这些比力有特性的协议判断应用是否安装题目应该不大
[*]但如果像【snssdk141】这类看起来是sdk内里的协议,用这种协议肯定是没法去判断某个应用是否安装的
https://i-blog.csdnimg.cn/direct/b93f03cc2f5449679c8a94dddb001096.png

三、能否获取手机上的已安装列表

1、能否用循环的UIApplication.shared.canOpenURL(url)方法来获取手机上的大概已安装列表?

如果用这个方法实现需要做事情:

[*]拿到市面上top1000的安装包,并且需要从其安装包中提取出这个包所特有的协议
[*]在自己APP清单文件中将这1000个协议加白名单
[*]循环调用IApplication.shared.canOpenURL(url)方法判断这些应用是否已安装

附件:
 demo源码:https://github.com/kh896424665/push/tree/master/PushDemo

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: IOS如何判断一个应用是否已安装以及获取已安装列表