iOS 检测本机是否安装了某 App

前言

iOS中,检测安装了某种 App 的文章有很多。这里只介绍方法,和一些实际用的技巧。

综述

实际上有两种东西可以用来检测 APP 是否安装:

  • bundle ID —— 包名,是每个应用的唯一识别码(换言之,这个值是一定会有的)
  • URL Scheme —— 供APP 之间跳转(打开应用)使用,需要在下面的配置中去手动添加(换言之,如果我没有配置他,他也没有默认值,实际上我是无法通过外部应用打开的)

Bundle ID

  • 缺点:方法一消耗一定的性能(手机安装APP比较多的话),APP 审核必备拒
  • 优点:跳过了ios9.0canOpenURL这个API使用限制

一些安卓的应用,通过动态下发的方式,获取到每个游戏的package ID,检测是否安装。
在iOS中实际上是用到了OC Runtime中的方法去实现。因为一定会被拒,这里就不引用代码了

URL Scheme

  • 必须要提前知道打开APP的列表,也就是白名单,并配置到工程的 info.plist中去。
  • 无法动态更新列表(每次新增都需要去更改这个列表)

配置的方法:

  • source code 的方式打开工程的 info.plist, 找到(如果没有就添加)LSApplicationQueriesSchemes ,加入对应的 URL Scheme

    LSApplicationQueriesSchemes
      
          wechat
          weixin
          twitter
      
    
  • 假设我们要检测微信是否已安装,那么通过下面这段代码(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,在对接平台的时候,这些 平台一定会提供一个唯一识别本 AppID 用来作识别。
因为当你实现了:

MyApp --> 微信/Facebook --> 跳回 MyApp

这个步骤,他一定是需要知道你的 URL Scheme,不然他怎么知道跳回到哪一个 App 呢?

工程中的截图

可以看到,图中涂掉的部分,就是第三方平台提供并让我们配置的 URL Scheme

经过实测发现,这些 URL Scheme确实可以用于打开/检测是否可以打开 对应的 App

你可能感兴趣的:(iOS 检测本机是否安装了某 App)