關于 -canOpenURL: 和 -openURL: 的那些事

最近工作中需要知道用戶的 iPhone 上都安裝了哪些應用炮车,所以查閱了一些資料酣溃。總的來說主要還是通過使用 Apple 提供的 - canOpenURL: API 來測試相應 APP 的 scheme 是否有效來實現(xiàn)扛或。

如何知道某個 APP 支持的所有 scheme

很顯然碘饼,為了知道對應的 APP 是否在設備上,我們需要知道這個 APP 支持的所有 scheme(如果 APP 沒有定義任何自己的 scheme住涉,請看使用私有 API )钠绍。這里我總結(jié)了一下大概有兩種方法。

  • 使用別人已經(jīng)整理好的scheme媳握。比如這個wiki頁面磷脯,里面收錄了一些比較有名的 APP 的 scheme争拐。當然還有這個網(wǎng)站,你可以在這里查詢 scheme 對應的 APP隘冲,你還可以幫助將你知道的 APP 的 scheme 添加進去绑雄,方便后面的人搜索。
  • 自己動手查看 APP 的 scheme罗珍。主要分下面幾步:
    1. 獲取 IPA 包。這里你可以使用 iTunes 下載 APP蘸朋。 然后在~/Music/iTunes/iTunes Media/Mobile Applications這個目錄下可以找到 iTunes 為我們下載的 IPA 包扣唱。
    2. 將 IPA 包的擴展名改成 zip,這樣我們就可以解壓了炼彪。
    3. 解壓之后打開Payload文件夾正歼,右鍵擴展名為 app 的文件夾,選擇 顯示包內(nèi)容 就可以查看到內(nèi)部的文件了
    4. 找到 Info.plist 文件喜爷,搜索 CFBundleURLSchemes 就可以看到這個 APP 給自己定義的 scheme 了旭咽。

如何使用 -canOpenURL:

iOS9 上面出于對用戶隱私的保護穷绵,開發(fā)人員不能像以前一樣隨便 -canOpenURL: 了。 通常在 iOS9 及以后版本的系統(tǒng)中勾缭,使用 -canOpenURL: 分為如下幾步目养。

  • 點擊工程文件,選擇相應的 Target幻梯,點擊 Info 選項努释,展開 Custom iOS Target Properties
  • 找到或者添加 LSApplicationQueriesSchemes 到屬性列表中。同時在這個數(shù)組下面添加相應的 scheme

當然你也可以直接編輯項目的 Info.plist 文件煞躬,在 LSApplicationQueriesSchemes 鍵下面添加你在 APP 中會使用到的 scheme。

通過將 scheme 添加到白名單中在扰,我們就可以在代碼中使用 -canOpenURL: 來測試對應 scheme 的 APP 是否被安裝雷客。如果你沒有將 scheme 添加到白名單中卻在 -canOpenURL: 中使用了搅裙,你的查詢會失敗,同時控制臺會打印類似下面這樣的信息:

-canOpenURL: failed for URL: "fb://" - error: "This app is not allowed to query for scheme fb"
-canOpenURL: failed for URL: "twitter://" - error: "This app is not allowed to query for scheme twitter"

正常的輸出是這樣的(如何 -canOpenURL: 測試 scheme 失敗的話,成功的話控制臺默認不會有任何輸出
):

-canOpenURL: failed for URL: "fb://" - error: "(null)"

這里或許有個疑問就是為什么這樣就能保護用戶隱私呢甥啄? 畢竟我們可以添加很多的我們會測試的 scheme 到白名單中炬搭。 如果你無限制的添加 scheme 到白名單中, app store 審核時候可能會覺得你濫用了這個機制融虽,從而不讓你的 APP 審核通過灼芭。

要注意的是使用 iOS8 sdk 編譯的代碼跑在運行 iOS9 系統(tǒng)的設備上是沒有問題的,但是一個 APP 可以測試的 scheme 有數(shù)量的限制巍佑,大概是50條寄悯。

關于 iOS9 上的 -openURL:

我測試了一下猜旬,在沒有添加 scheme 到白名單的情況下脆栋,使用 -openURL: 會默認打開相應的應用,同時該函數(shù)返回 true(如果設備安裝了)椿争,否則函數(shù)返回 false(也不會有任何提醒)。 而在添加了 scheme 到白名單的情況下丘薛,使用 -openURL: 會彈窗提示(有時候又沒有彈窗??邦危,難道是第一次選擇是跳轉(zhuǎn)以后后面都默認跳轉(zhuǎn)嗎舍扰? 從這點可以看出 Apple 這個 API 做的用戶體驗并不好)用戶是否需要打開相應的應用边苹,選擇是則打開裁僧,否則不打開,同時函數(shù)也會正確的返回 true 或者 false

<a name="private-api"></a>使用私有 API

私有 API 也就是 Apple 提供的 iOS SDK 中沒有暴露給外部的接口類和方法茬底。我們知道 OC 函數(shù)調(diào)用是運行時決定的获洲,利用這個特性,通過一些手段獲取到 Apple 的一些私有 API 的類名和方法名最爬。我們就可以很容易的使用這些 API门岔。對于本文主題寒随,GitHub 上有一個很好的例子,大家可以下載這個 demo妻往,了解如何使用私有 API 來獲取設備上支持的所有 scheme蒲讯,以及所有安裝的 APP 信息。

需要注意的是局嘁, 如果你在項目中使用了私有 API晦墙,那么你可能需要做一些函數(shù)調(diào)用方式上的處理,以避免在 APP 審核的時候被發(fā)現(xiàn)導致被拒但指。

關于私有 API 更多的介紹可以看這個 StackOverflow 回答 What exactly is a private api and why will apple reject an ios app if one is us

關于 Apple 是如果檢測應用是否使用了私有 API可以看這里 How does apple know you are using private api

參考資料

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拦坠,一起剝皮案震驚了整個濱河市剩岳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晓铆,老刑警劉巖绰播,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腰池,居然都是意外死亡忙芒,警方通過查閱死者的電腦和手機讳侨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門跨跨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忱嘹,你說我怎么就攤上這事耕渴。” “怎么了础米?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵添诉,是天一觀的道長栏赴。 經(jīng)常有香客問我,道長竖瘾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任事扭,我火速辦了婚禮求橄,結(jié)果婚禮上葡公,老公的妹妹穿的比我還像新娘。我一直安慰自己涵亏,他們只是感情好蒲凶,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布气筋。 她就那樣靜靜地躺著,像睡著了一般旋圆。 火紅的嫁衣襯著肌膚如雪宠默。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天灵巧,我揣著相機與錄音搀矫,去河邊找鬼。 笑死刻肄,一個胖子當著我的面吹牛瓤球,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敏弃,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卦羡,長吁一口氣:“原來是場噩夢啊……” “哼麦到!你這毒婦竟也來了虹茶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤隅要,失蹤者是張志新(化名)和其女友劉穎蝴罪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體步清,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡要门,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年虏肾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欢搜。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡封豪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炒瘟,到底是詐尸還是另有隱情,我是刑警寧澤疮装,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布缘琅,位于F島的核電站,受9級特大地震影響廓推,放射性物質(zhì)發(fā)生泄漏刷袍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一樊展、第九天 我趴在偏房一處隱蔽的房頂上張望呻纹。 院中可真熱鬧,春花似錦专缠、人聲如沸雷酪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哥力。三九已至,卻和暖如春嘁圈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蟀淮。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工最住, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怠惶。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓涨缚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親策治。 傳聞我的和親對象是個殘疾皇子脓魏,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 很可能你的應用是與一個支持HTTPS傳輸數(shù)據(jù)的服務器交互,但是并沒有使用TLS 1.2或更高通惫。在這種情況下茂翔,你定義...
    Www劉閱讀 3,071評論 0 5
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評論 25 707
  • 原文地址 HashMap可以說是Java中最常用的集合類框架之一,是Java語言中非常典型的數(shù)據(jù)結(jié)構(gòu)履腋,我們總會在不...
    未央_2625閱讀 258評論 0 2
  • 無論是哪種語言珊燎,作用域都是一個非常重要的概念惭嚣,同樣,作用域?qū)avaScript有許多影響悔政。從功能的角度來看晚吞,作用...
    前端一小卒閱讀 1,002評論 0 6
  • 自從用語言作為交流的主要工具,說話就從功能演化到了能力的范疇谋国。 說話人人都會槽地,會說話就不見得人人能行。 紅樓夢里的...
    48歲的張昆閱讀 251評論 2 4