前言
iOS
中敏晤,檢測安裝了某種 App
的文章有很多私植。這里只介紹方法官边,和一些實(shí)際用的技巧艘蹋。
綜述
實(shí)際上有兩種東西可以用來檢測 APP
是否安裝:
-
bundle ID
—— 包名锄贼,是每個(gè)應(yīng)用的唯一識(shí)別碼(換言之,這個(gè)值是一定會(huì)有的) -
URL Scheme
—— 供APP 之間跳轉(zhuǎn)(打開應(yīng)用)使用女阀,需要在下面的配置中去手動(dòng)添加(換言之宅荤,如果我沒有配置他,他也沒有默認(rèn)值浸策,實(shí)際上我是無法通過外部應(yīng)用打開的)
Bundle ID
- 缺點(diǎn):方法一消耗一定的性能(手機(jī)安裝APP比較多的話)冯键,
APP
審核必備拒 - 優(yōu)點(diǎn):跳過了
ios9.0
對canOpenURL
這個(gè)API使用限制
一些安卓的應(yīng)用,通過動(dòng)態(tài)下發(fā)的方式庸汗,獲取到每個(gè)游戲的package ID
惫确,檢測是否安裝。
在iOS中實(shí)際上是用到了OC
Runtime
中的方法去實(shí)現(xiàn)蚯舱。因?yàn)橐欢〞?huì)被拒改化,這里就不引用代碼了
URL Scheme
- 必須要提前知道打開
APP
的列表,也就是白名單枉昏,并配置到工程的info.plist
中去陈肛。 - 無法動(dòng)態(tài)更新列表(每次新增都需要去更改這個(gè)列表)
配置的方法:
-
用
source code
的方式打開工程的info.plist
, 找到(如果沒有就添加)LSApplicationQueriesSchemes
,加入對應(yīng)的URL Scheme
<key>LSApplicationQueriesSchemes</key> <array> <string>wechat</string> <string>weixin</string> <string>twitter</string> </array>
-
假設(shè)我們要檢測微信是否已安裝兄裂,那么通過下面這段代碼(
swift
為例). 務(wù)必在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://")
碰到的問題
有一種情況句旱,團(tuán)隊(duì)發(fā)布了 N 款 App,這時(shí)候我需要寫一個(gè)工具 APP
去檢測哪些發(fā)布的包是否安裝晰奖。鑒于上文提到的谈撒,URL Scheme
并不是一個(gè)App
上架時(shí)候的必備項(xiàng),那怎么辦呢匾南,我們是不是就沒有可以參考的依據(jù)了港华?
如果是下面這種情況,應(yīng)該還有得救:
如果你之前發(fā)布的 App午衰,對接過需要提供 URL Scheme 的第三方平臺(tái)立宜,那么可以使用這個(gè)
URL Scheme
作為檢測或打開的依據(jù)。
舉個(gè)例子
說具體一些臊岸,假設(shè)我對結(jié)果微信或 Facebook
橙数,在對接平臺(tái)的時(shí)候,這些 平臺(tái)一定會(huì)提供一個(gè)唯一識(shí)別本 App
的 ID
用來作識(shí)別帅戒。
因?yàn)楫?dāng)你實(shí)現(xiàn)了:
MyApp --> 微信/Facebook --> 跳回 MyApp
這個(gè)步驟灯帮,他一定是需要知道你的 URL Scheme
崖技,不然他怎么知道跳回到哪一個(gè) App
呢?
可以看到钟哥,圖中涂掉的部分迎献,就是第三方平臺(tái)提供并讓我們配置的 URL Scheme
經(jīng)過實(shí)測發(fā)現(xiàn),這些 URL Scheme
確實(shí)可以用于打開/檢測是否可以打開 對應(yīng)的 App