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,即不生效。

如图下图,是打到安装包里的信息,会在安装包里的info.plist清单文件中

3、执行效果

4、此方法是否靠谱

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

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

1、自己的应用定义协议

在项目配置文件中加一个URL Scheme即可

最终在info.plist中显示如下:

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

通过上一步定义方法,可以看到定义协议是在项目清单文件中,类似Android的manifest中,故拿到目标应用的安装包就知道了它所定义的协议,以抖音为例:我们需要借助爱思助手拿到抖音安装包

通过借助爱思助手下载到抖音的ipa安装包,并解压得到如下抖音安装包的清单文件:

通过搜索关键字【CFBundleURLSchemes】可以看到抖音其实自身注册了很多协议

3、用抖音的协议做测试判断是否安装

我们选取一个和抖音关系不那么大的协议协议【snssdk1128luckydogsocial】试试看:

最终发现,当抖音安装时,返回是,当卸载抖音时,发挥否。试了其他抖音注册的协议发现也都是可行的,但不确保这些协议是否仅抖音注册,其他应用是否也同样注册。

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

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

  • 如果一个应用有其特点的协议,比如微信的协议有【weixin】,支付宝的协议有【alipay】,这些比较有特性的协议判断应用是否安装问题应该不大
  • 但如果像【snssdk141】这类看起来是sdk里面的协议,用这种协议肯定是没法去判断某个应用是否安装的

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

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

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

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

附件:

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

### iOS 获取安装应用列表的方法 在 iOS 平台上,由于其严格的安全性和隐私保护机制,开发者无法直接获取设备上所有已安装应用程序列表。然而,在某些特定情况下,可以通过间接方式实现部分功能。 #### 使用 `canOpenURL` 方法检测特定应用是否存在 iOS 提供了一个 API——`UIApplication.shared.canOpenURL(url)`,可以用来检测当前设备是否能够打开指定 URL Scheme 的应用程序。如果返回值为 `true`,则表示该 URL Scheme 对应的应用可能已经安装;反之,则未安装。这种方法仅能用于检测支持公开 URL Schemes 的第三方应用,并不能全面列举所有已安装应用程序[^1]。 ```swift import UIKit func isAppInstalled(appScheme: String) -> Bool { let canOpen = UIApplication.shared.canOpenURL(URL(string: appScheme)! ) return canOpen } // 调用示例 let weChatInstalled = isAppInstalled(appScheme: "weixin://") ? "WeChat Installed" : "WeChat Not Found" print(weChatInstalled) ``` 需要注意的是,自 iOS 9 开始,Apple 引入了 `LSApplicationQueriesSchemes` 配置项限制可用的 URL schemes 列表长度,因此需要提前声明所要查询的服务提供商及其对应的 scheme 值于 Info.plist 文件中。 #### 私有库 LSApplicationWorkspace (越狱环境专用) 对于非官方渠道发布或者运行于越狱环境下开发的应用而言,存在一种利用私有框架的方式访问更深层次的信息。例如调用 `objc_getClass("LSApplicationWorkspace")` 来尝试枚举系统中的所有 bundle identifiers 和其他元数据[^3]。但是这种方式违反 Apple Store 上架规定并可能导致被拒审风险极高,不推荐实际项目采用此方案除非确实处于特殊需求场景下才考虑使用。 综上所述,常规手段下我们只能借助有限数量预定义好的 url schemas 进行逐一排查确认目标 APP 是否存在于用户的 iDevice 当前状态之中而不可能得到完整的清单记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值