iOS App間相互跳轉漫談 part1

劉哈發表於2017-12-17

概述

文章介紹當下iOS系統中各種App之間的跳轉技術,並最終重點介紹UniversalLinks的一種特殊的使用技巧來幫助App來引流,提升轉化。

背景

介紹下當下支援的App頁面跳轉技術及其優劣:

  1. Scheme跳轉 例如:

    <appscheme>://detail?id=10000
    複製程式碼

    使用者在系統中其他App中點選scheme連結;瀏覽器網頁中點選scheme連結會彈出一個Alert彈框,讓使用者確認是否跳轉。 優勢:與http的url提供類似,可以通過URL直觀表達跳轉的頁面和意思。觸發條件可以是使用者點選,也可以通過程式觸發JS或者App。 劣勢:跳轉時系統會彈出確認框讓使用者確認,體驗略差。並且不能知道App是否安裝,只能通過一些手段推測需要跳轉的App是否已經安裝,如果跳轉時沒有安裝則會彈出“Safari不能開啟該網頁,因為網址無效。”的提示體驗打折扣,關於H5頁面如何推測App已經安裝後面會介紹。

  2. Smart App Banners 在HTML頁面中植入一個meta標籤,類似於:

    <meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">
    複製程式碼

    訪問這個頁面的時候在網頁載入完後往下拉頁面可以看到App的跳轉入口,可以承接跳轉的App的功能。 可以手機訪問這個Demo頁面來體驗下 優勢:對使用者而言,點選進入不需要二次確認;自動檢測App安裝狀態,未安裝引導到App Store,已安裝則可直接開啟App,並帶入預置在app-argument中的url值,讓App感知當前的頁面,可以App中繼續行為。 劣勢:最大的問題是跳轉操作不可通過程式控制,只能由使用者點選觸發跳轉;另一個產品經理不怎麼喜歡的是居然還顯示評分星級,這是個頭疼的事情。

  3. Univeral Links 從iOS9開始,蘋果開放了一種新的App之間的跳轉方式,從使用體驗上來看,蘋果希望這種技術用於不打斷使用者的操作行為為前提,提供更好的App跳轉方式。舉例來說,正在訪問使用者正在訪問m.alibaba.com,那麼如果使用者已經安裝了Alibaba.com App那麼系統將自動引導到App,並將正在訪問的完整http連結提供到開啟的App以提供在App上繼續之前行為的能力。 這種技術帶來了完美的體驗,通俗點說,現在還能提供http的URL(當然需要https)直接開啟App,而且沒有二次確認!當然也有些地方有待完善,這個下文會詳細提到。

三種技術各有優劣,組合使用可以讓引流體驗變得非常好。下面會簡單介紹三種技術的部署方法和一些技巧。

部署

Scheme方式跳轉

這種技術部署是需要App本身對scheme協議頭進行註冊的,而且這種註冊是屬於系統級別本地註冊關聯。

  1. 專案的Info.plist檔案中,新增一個Key -> "URL Types"預置的Key輸入時有聯想。
  2. 新增完後會自動變成一個陣列,展開檢視第一個元素,將其中 "URL identifier" 置為App的BundleID
  3. 並且平級新增一個Key -> "URL Schemes"預置Key有聯想。
  4. 新增完後自動變成陣列,展開,在第一個元素中填入想要註冊的scheme協議頭即可,比如想要註冊 "enalibaba://",那麼只要輸入 "enalibaba" 即可。

這時App安裝後,協議頭即註冊生效,可以通過瀏覽器位址列中輸入該協議頭即可跳轉。

注意:因為是本地註冊,所以如果遇到某個其他App也註冊這個協議頭那會發生什麼情況呢?經過實踐測試結果發現,協議頭是本地搶注式,先被安裝的註冊的App擁有更高的優先權,當先裝的App被刪除時,第二註冊者會命中,以此後推。

App Smart Banner

這種方式是直接去中心化,去校驗,完全自由的一種部署方式。

唯一需要做的只是在html頁面新增meta標籤即可

<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">
複製程式碼

使用iOS手機訪問這個地址 Demo頁面

Universal Links

這種方式更為麻煩一些,因為相當於支援了http連結直接開啟App,所以需要雙向授信才行。

網站端

  1. 建立一個名為apple-app-site-association的JSON格式檔案,防止在可以被根目錄直接訪問到的地方。例如打算繫結m.alibaba.com那麼就需要https://m.alibaba.com/apple-app-site-association這個檔案可以正常訪問,mine/type 為 json/text。
  2. 檔案的內容格式如下
     {
         "applinks": {
             "apps": [],
             "details": [
                 {
                     "appID": "9JA89QQLNQ.com.apple.wwdc", //bundleid
                     "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"] //path 可以萬用字元
                 },
                 { // 可配置多個域名和path匹配規則的繫結
                     "appID": "ABCD1234.com.apple.wwdc",
                     "paths": [ "*" ]
                 }
             ]
         }
     }
    複製程式碼

App端

  1. 找到 Alibaba.entitlements 檔案
  2. 在裡面 com.apple.developer.associated-domains 的陣列下面新增一個item
  3. 值為 applinks:m.alibaba.com 即可

當然App端能找到entitlements檔案需要開啟Capabilities中的Associated Domain能力,這需要開發者賬號專案才能開啟。

到這裡雙向繫結已做完,編譯專案到裝置上,通過點選在 備忘錄 中預置的匹配Universal Links連結,即可完美跳轉了。

為什麼要放到備忘錄?不能直接瀏覽器位址列開啟嗎?答案是不行,還記得上面講過,蘋果希望的是不打斷使用者意圖的情況下,所以在瀏覽器位址列中直接輸入地址的行為,蘋果認為使用者有明顯意圖想要訪問http網頁,所以不會直接跳轉到App。當然程式也無法控制,如果是JS程式跳轉某個UniversalLinks,那結果就是請求正常發出,並不會跳轉到App。

而且,而且,蘋果的初衷其實是希望不同App之間可以通過這種方式相互跳轉。 當初我親測微信跳轉Alibaba.com App完美跳轉。 後來,有一種非常規操作可以阻擋這種跳轉,以至於現狀是幾乎所有App都禁用了UniversalLinks的外跳。 但我仍然有解決辦法,我會把UniversalLinks的運作原理和攻防技巧放在下一篇文章裡詳細描述。

豆知識

Scheme和Schema

其實正確的叫法應該叫Scheme[skim],而不是Schema['ski:mə],官方文件在描述中也是一直使用Scheme。

從詞典上檢視,這兩個詞的意思表達非常相近,都有計劃策劃的意思。

參考資料

Promoting Apps with Smart App Banners

Inter-App Communication

AppID查詢工具

Support Universal Links

原文 - iOS App間相互跳轉漫談-UniversalLinks的極致使用]

相關文章