iOS 检测本机是否安装了某 App
2018-10-20 本文已影响506人
黑羽肃霜
前言
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
呢?
![](https://img.haomeiwen.com/i1180547/464777d6b0ac19cb.png)
可以看到,图中涂掉的部分,就是第三方平台提供并让我们配置的 URL Scheme
经过实测发现,这些 URL Scheme
确实可以用于打开/检测是否可以打开 对应的 App