iOS H5打開App(通用鏈接)

入秋了衡蚂,路上會遇到用小販用小貨車拉著賣芒果窿克,和去年一樣,我會停下急匆匆的腳步毛甲,買幾個年叮。一則自己愛吃芒果不過敏,二則品嘗下是否和去年一樣熟悉的味道玻募。

很多時候可能都希望在瀏覽器只损,微信里面點擊一個H5鏈接或按鈕,之后直接打開App跳到App里面指定的頁面七咧。

  • safari跃惫,chrome,UC,搜狗,opera Mini等瀏覽器-----》喚醒App艾栋。
    用戶通過瀏覽器地址欄輸入官網(wǎng)地址爆存,或商品地址打開App里面指定頁面。若手機內(nèi)未安裝App則引導(dǎo)用戶跳入Apple Store下載頁蝗砾。(本來準備舉美團的例子先较,結(jié)果美團變成了小程序,那就某東吧)悼粮。
    在瀏覽器中輸入商品地址:

手機安裝了某東闲勺。

2.gif

手機未安裝某東。

4.gif
  • 微信扣猫,QQ菜循,微博-----》喚醒APP。
    用戶通過某APP分享了一條鏈接至微信申尤,QQ或微博癌幕,用戶點開該鏈接后,會引導(dǎo)用戶B打開該APP或者下載該APP瀑凝。

在微信里面點擊的分享的商品:

手機安裝了某東序芦。

1.gif

手機未安裝某東。

3.gif
  • 短信粤咪、備忘錄,郵件-----> 喚醒APP渴杆。
    用戶收到一條推廣短信寥枝,在短信里面點擊鏈接跳入App里面或下載App頁宪塔。

如何實現(xiàn)上面的場景呢?分為iOS9.0以前和iOS9.0以后囊拜。

1.iOS9.0以前只有一種實現(xiàn)方式某筐,scheme方式。若安裝App則跳入指定頁面冠跷,則scheme后面加參數(shù):”taobao://item.taobao.com/item.htm?id=“南誊。若未安裝跳到下載頁引導(dǎo)用戶下載安裝。

let link = "taobao://item.taobao.com/item.htm?id=" + id,
    fallback = "itms-apps://itunes.apple.com/cn/app/" + appId;
// 嘗試呼起 App
location.href = link;
// 3s 后未能呼起則跳轉(zhuǎn) App Store
setTimeout(() => location.href = fallback, 3000);

瀏覽器如何知道手機是否安裝了App呢蜜托,通過設(shè)置延時抄囚。

  • setTimeout的實現(xiàn)過程:
    瀏覽器嘗試打開URL scheme并記錄時間點t1,在2秒計時后橄务,檢查當前時間t2幔托,如果t2-t1 > 2200ms,說明喚起app成功(喚起app會是瀏覽器的定時器延后執(zhí)行),如果t2-t1 < 2200ms,可能沒有安裝app蜂挪,可以引導(dǎo)用戶進入下載頁重挑。


    5.gif

    6.gif
var openTime = +new Date();
window.location.href = 'wzry://videolists.show/mark/penta_kill?num=1'
var timer = setTimeout(function () {
    if ((new Date()) - openTime < 2200) {//加了200ms基準誤差
        window.location.href = 'you app download page';
    }
    if ((new Date()) - openTime > 2200) {
        clearTimeout(timer);
    }
}, 2000);

  • setInterval實現(xiàn)過程:
    原理上跟setTimeout相似棠涮,方法上換成設(shè)置一個比較小的時間間隔(例如20ms)谬哀,運行多次(例如100),比較運行完100次的總耗時與20*100的時間差辱士。邏輯判斷同setTimeout始鱼。
var limit_num = 100;
var openTime = +new Date();
window.location.href = 'wzry://videolists.show/mark/penta_kill?num=1'
var timer = setInterval(function () {
   if(limit_num > 0){
        limit_num--;
   }else{
        if ((new Date()) - openTime < 2200) {//加了200ms基準誤差
            window.location.href = 'you app download page';
        }
        clearTimeout(timer);
   }
}, 20);

iOS9.0以后有兩種方式吵护,scheme和universal link(后面單獨說)陨闹。重要的事情說三遍未斑,iOS9.0以后還是可以用scheme界斜,只是在iOS9上幕帆,iframe方案變得不可用娄蔼,在打開自定義URL scheme時结窘,會彈出對話框很洋,詢問是否用 xx應(yīng)用來打開。若未安裝App則會顯示“safari打不開該網(wǎng)頁隧枫,因為網(wǎng)址無效”喉磁。(可以通過直接跳轉(zhuǎn):點擊鏈接或者修改window.location。<a href="schemeUrl">喚醒你的APP</a>官脓,window.location.href = schemeUrl)

針對微信协怒,就不區(qū)分iOS9.0之前和之后了,因為微信有白名單卑笨,白名單里面只包含50個App的url scheme孕暇。怎么查看呢。通過Apple configuration 2能夠查到,具體請看文章妖滔。

白名單如下:在這個 plist 文件中找到白名單很簡單隧哮,因為微信已經(jīng)達到了49個的上限,一個很扎眼的 “(49 items)” 的 “Array” 項 LSApplicationQueriesSchemes 就是我們要找的白名單了座舍。我們可以看到諸如騰訊新聞 (qqnews), 騰訊視頻 (tenvideo2) 都是在白名單內(nèi)的沮翔。


8.gif

從微信里面打開分享的網(wǎng)頁跳入App里面有三種(騰訊應(yīng)用寶,通用鏈接,引導(dǎo)用戶瀏覽器打開)解決辦法:

1.使用騰訊應(yīng)用寶曲秉。

使用它頒發(fā)給你的應(yīng)用地址采蚀,向這個地址跳轉(zhuǎn),然后一切就交給微信了承二,直接無視微信什么的榆鼠,直接帶你飛到app內(nèi)。具體可看騰訊應(yīng)用寶Applink接入文檔矢洲。舉個例子璧眠,網(wǎng)易新聞。從網(wǎng)易新聞分享一條鏈接到微信读虏,在微信里面點開鏈接责静。

  • 若安裝了微信。直接打開到網(wǎng)易新聞App對應(yīng)鏈接盖桥。
7.gif
  • 若未安裝微信灾螃。騰訊應(yīng)用寶跳到Apple Store進行下載。有趣的是下載完成后揩徊,點擊打開后還能跑到對應(yīng)鏈接腰鬼。這是為什么呢。因為在微信里面點擊打開按鈕時塑荒,粘貼板上粘貼了該條鏈接的信息熄赡,跳入網(wǎng)易新聞之后,和淘寶一樣監(jiān)聽到粘貼板上面的內(nèi)容后跳到指定頁面齿税。
8.gif
11.gif
12.gif

2.Universal Links(通用鏈接)彼硫。

  • 在2015年的WWDC大會上,Apple推出了iOS 9的一個功能:Universal Links通用鏈接凌箕。如果你的App支持Universal Links拧篮,那就可以訪問HTTP/HTTPS鏈接直接喚起APP進入具體頁面,不需要其他額外判斷牵舱;如果未安裝App串绩,訪問此通用鏈接時,可以一個自定義網(wǎng)頁芜壁。

優(yōu)點:

  • 唯一性:不像自定義的scheme,因為它使用標準的HTTP/HTTPS鏈接到你的web站點,所以它不會被其它的app所聲明.另外,Custom URL scheme 因為是自定義的協(xié)議礁凡,所以在沒有安裝 app 的情況下是無法直接打開的高氮,而Universal Links本身是一個HTTP/HTTPS鏈接,所以有更好的兼容性把篓;
  • 安全:當用戶的手機上安裝了你的app纫溃,那么iOS將去你的網(wǎng)站上去下載你上傳上去的說明文件(這個說明文件聲明了APP可以打開哪些類型的http鏈接)腰涧。因為只有你自己才能上傳文件到你網(wǎng)站的根目錄,所以你的網(wǎng)站和你的app之間的關(guān)聯(lián)是安全的韧掩;
  • 可變:當用戶手機上沒有安裝你的app的時候,Universal Links也能夠工作窖铡。如果你愿意疗锐,在沒有安裝APP的時候,用戶點擊鏈接费彼,會在safari中展示你網(wǎng)站的內(nèi)容滑臊;
  • 簡單:一個URL鏈接,可以同時作用于網(wǎng)站和app箍铲,可以定義統(tǒng)一的web-native協(xié)議雇卷;
  • 私有:其它APP可以在不需要知道是否安裝了的情況下和你的APP相互通信;

缺點:
只支持iOS9及以上系統(tǒng)颠猴;當使用Universal Link打開APP之后关划,狀態(tài)欄右上角會出現(xiàn)鏈接地址,點擊它會取消Universal Link翘瓮,需引導(dǎo)用戶重新使用Safari再次打開該鏈接贮折,彈出Safari內(nèi)置APP廣告條,再點擊打開重新開啟Universal Link资盅。

本來一般公司會有一個官網(wǎng)域名https://www.aaaaa.com/,你必須找運維同學(xué)開一個專門用來制作通用鏈接的域名https://oap.aaaaa.com调榄,然后上傳apple-app-site-association的json文件到.well-known和根目錄,具體如下面的步驟:

1.創(chuàng)建一個json格式的命名為apple-app-site-association文件呵扛,注意這個文件必須沒有后綴名每庆,文件名必須為apple-app-site-association上傳到https.

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "ABCD1234.com.aaa.app", 
                "paths": [ "/info/*", "/mobile/*"]
            },
            {
                "appID": "EFGH5678.com.bbb.app", 
                "paths": [ "*" ]
            }
        ]
    }
}

說明: appID = teamId.yourapp's bundle identifier
paths = APP支持的路徑列表,只有這些指定的路徑的鏈接今穿,才能被APP所處理缤灵,大小寫敏感。舉個例子荣赶,如果你的網(wǎng)站是oap.aaa.com凤价,你的path寫的是"/info/*",那么當用戶點擊www.aaa.com/info/<path>?<params>=<value>拔创,就可以喚醒APP了利诺,相反www.aaa.com/other就不會。此外Apple為了方便開發(fā)者剩燥,提供了一個網(wǎng)址來驗證我們編寫的這個apple-app-site-association是否合法有效,這個網(wǎng)址經(jīng)過測試后有的有效果有的沒有效果慢逾。下圖是輸入oia.zhihu.com之后的效果立倍。

WX20181219-193247@2x.png

2.激活Xcode工程中的Associated Domains能力,在其中的Domains中填入你想支持的域名(這里不是隨便填的,是可以支持你需要的Universal Links的域名), 必須以applinks:為前綴侣滩,例如:applinks:oap.aaaaa.com將會在合適的時候口注,從這個域名請求apple-app-site-association文件。注意:當你打開Associated Domains后君珠,Xcode會在你的工程中添加.entitlements文件寝志,并且登錄開發(fā)者中心,可以看到Associated Domains處于Enable狀態(tài)策添。

WX20181219-202128@2x.png

3.在AppDelegate里實現(xiàn)如下代理方法:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler {
    // NSUserActivityTypeBrowsingWeb 由Universal Links喚醒的APP
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        NSURL *webpageURL = userActivity.webpageURL;
        NSString *host = webpageURL.host;
        if ([host isEqualToString:@"yohunl.com"]) {
            //進行我們需要的處理
        } else {
            [[UIApplication sharedApplication]openURL:webpageURL];
        }
    }
    return YES;
}

至此APP已經(jīng)開啟Universal Links材部,可以通過鏈接喚醒APP,并跳轉(zhuǎn)至指定頁面了唯竹。流程如下:


WechatIMG433.jpeg

4.跨域乐导。假設(shè)當前微信瀏覽器中話題詳情頁面的 URL 為 "www.domain.com/XXX",底部“打開App”按鈕對應(yīng)的鏈接URL為 "www.domain.com/YYY"浸颓,但由于www.domain.com/YYY不在配置的域名oap.domain.com的域名下物臂,因此實際不能完成跳轉(zhuǎn)。必須寫點擊事件跳轉(zhuǎn)到與applinks中添加的域名相同的頁面例如oap.aaaaa.com/info/download.html(要跨域),在微信中就直接跳轉(zhuǎn)到了我們的app中了产上!

注:用于跳轉(zhuǎn)打開app的域名需要支持https棵磷,如果是一級域名頁面有個按鈕,點擊按鈕跳轉(zhuǎn)二級域名來打開app蒂秘,那么二級域名需要支持https泽本。這里DEMO的二級域名不支持https,所以采用的方案是二級域名跳轉(zhuǎn)到一級域名來打開APP姻僧。

5.從微信跳轉(zhuǎn)到app的時候规丽,屏幕右上角還有個 "xxx.xx" 的小箭頭:點擊該箭頭,會在Safari中打開該頁面撇贺。此時再回到微信瀏覽器中點擊 "打開App"按鈕赌莺,神奇的事情出現(xiàn)了:無法跳轉(zhuǎn)到app!K伤弧艘狭!

解決方案:在Safari中打開該頁面,將網(wǎng)頁拉倒最頂部翠订,會出現(xiàn)一個懸浮框巢音,點擊懸浮框中的打開按鈕,又跳回到app中打開指定頁面尽超,此時再回到微信瀏覽器中點擊 "打開App"按鈕官撼,又能正常跳轉(zhuǎn)到app了。
Universal Links 功能的接入其實相當于給某些 URL 添加了一種新的打開方式似谁,但是舊的通過瀏覽器打開 URL 的方式仍然可用傲绣,當點擊右上角跳轉(zhuǎn)箭頭時掠哥,相當于又設(shè)置這些特定 URL 的默認打開方式為瀏覽器而非 web,因此一鍵跳轉(zhuǎn)功能此時會失效秃诵。反之通過點擊頂部 "打開" 按鈕续搀,相當于又將這些特定 URL 的默認打開方式修改為 app ,一鍵跳轉(zhuǎn)功能恢復(fù)正常菠净。
在Safari中打開頁面剛進入時禁舷,橫條是隱藏的,一定要將頁面拉到最頂部時才能顯示嗤练。

3.引導(dǎo)用戶去瀏覽器打開榛了。微信已經(jīng)屏蔽了通用鏈接,所以大多數(shù)App都做了引導(dǎo)用戶去瀏覽器打開煞抬。下一篇文章介紹微信屏蔽通用鏈接

4.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末构哺,一起剝皮案震驚了整個濱河市革答,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌曙强,老刑警劉巖残拐,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碟嘴,居然都是意外死亡溪食,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門娜扇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來错沃,“玉大人,你說我怎么就攤上這事雀瓢∈辔觯” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵刃麸,是天一觀的道長醒叁。 經(jīng)常有香客問我,道長泊业,這世上最難降的妖魔是什么把沼? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮吁伺,結(jié)果婚禮上饮睬,老公的妹妹穿的比我還像新娘。我一直安慰自己箱蝠,他們只是感情好续捂,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布垦垂。 她就那樣靜靜地躺著,像睡著了一般牙瓢。 火紅的嫁衣襯著肌膚如雪劫拗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天矾克,我揣著相機與錄音页慷,去河邊找鬼。 笑死胁附,一個胖子當著我的面吹牛酒繁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播控妻,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼州袒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弓候?” 一聲冷哼從身側(cè)響起郎哭,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菇存,沒想到半個月后夸研,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡依鸥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年亥至,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贱迟。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡姐扮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出关筒,到底是詐尸還是另有隱情溶握,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布蒸播,位于F島的核電站睡榆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏袍榆。R本人自食惡果不足惜胀屿,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望包雀。 院中可真熱鬧宿崭,春花似錦、人聲如沸才写。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讹堤,卻和暖如春吆鹤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洲守。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工疑务, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梗醇。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓知允,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叙谨。 傳聞我的和親對象是個殘疾皇子温鸽,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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