前言
iOS中,检测安装了某种 App 的文章有很多。这里只介绍方法,和一些实际用的技巧。
综述
实际上有两种东西可以用来检测 APP 是否安装:
-
bundle ID—— 包名,是每个应用的唯一识别码(换言之,这个值是一定会有的) -
URL Scheme—— 供APP 之间跳转(打开应用)使用,需要在下面的配置中去手动添加(换言之,如果我没有配置他,他也没有默认值,实际上我是无法通过外部应用打开的)
Bundle ID
- 缺点:方法一消耗一定的性能(手机安装APP比较多的话),
APP审核必备拒 - 优点:跳过了
ios9.0对canOpenURL这个API使用限制
一些安卓的应用,通过动态下发的方式,获取到每个游戏的package ID,检测是否安装。
在iOS中实际上是用到了OC Runtime中的方法去实现。因为一定会被拒,这里就不引用代码了
URL Scheme
- 必须要提前知道打开
APP的列表,也就是白名单,并配置到工程的info.plist中去。 - 无法动态更新列表(每次新增都需要去更改这个列表)
配置的方法:
-
用
source code的方式打开工程的info.plist, 找到(如果没有就添加)LSApplicationQueriesSchemes,加入对应的URL Scheme<key>LSApplicationQueriesSchemes</key> <array> <string>wechat</string> <string>weixin</string> <string>twitter</string> </array> -
假设我们要检测微信是否已安装,那么通过下面这段代码(
swift为例). 务必在string的末尾加上://func detectInstalled(URLString: String?) -> URL? { if let URLString = URLString, let exsistURL = URL(string: URLString), UIApplication.shared.canOpenURL(exsistURL) { return exsistURL } else { return nil } } detectInstalled(URLString: "weixin://")
碰到的问题
有一种情况,团队发布了 N 款 App,这时候我需要写一个工具 APP 去检测哪些发布的包是否安装。鉴于上文提到的,URL Scheme并不是一个App 上架时候的必备项,那怎么办呢,我们是不是就没有可以参考的依据了?
如果是下面这种情况,应该还有得救:
如果你之前发布的 App,对接过需要提供 URL Scheme 的第三方平台,那么可以使用这个
URL Scheme作为检测或打开的依据。
举个例子
说具体一些,假设我对结果微信或 Facebook,在对接平台的时候,这些 平台一定会提供一个唯一识别本 App的 ID 用来作识别。
因为当你实现了:
MyApp --> 微信/Facebook --> 跳回 MyApp
这个步骤,他一定是需要知道你的 URL Scheme,不然他怎么知道跳回到哪一个 App 呢?
工程中的截图
可以看到,图中涂掉的部分,就是第三方平台提供并让我们配置的 URL Scheme
经过实测发现,这些 URL Scheme确实可以用于打开/检测是否可以打开 对应的 App









网友评论