LinkedME|iOS移動應(yīng)用開發(fā)者不得不知道的Deep Linking技術(shù)

本文作者徐斌,原騰信IOS工程師,現(xiàn)LinkedME高級工程師。

SandBox是什么?

SandBox(沙盒)機(jī)制規(guī)定應(yīng)用程序只能夠讀取應(yīng)用程序內(nèi)部的數(shù)據(jù),不可以訪問其他應(yīng)用的信息數(shù)據(jù)。

在iOS設(shè)備中每一個APP都有自己的儲存空間

APP只能訪問自己的沙盒目錄下內(nèi)容,不能訪問其它存儲空間的內(nèi)容

應(yīng)用程序的數(shù)據(jù)請求需要經(jīng)過權(quán)限檢測,檢測不通過則不執(zhí)行

為什么要使用沙盒機(jī)制?

SandBox是安全體系中的一種機(jī)制,從而蘋果公司在設(shè)計(jì)iOS系統(tǒng)時,考慮應(yīng)用之間的信息安全,對應(yīng)用程序的訪問權(quán)限設(shè)置限制。

沙盒機(jī)制有什么弊端?

使用沙盒機(jī)制后APP之間不能相互訪問通信,使得APP成為一個個的信息孤島。

怎么解決這個問題?

為了解決APP信息孤島問題,蘋果在iOS 4中推出了URI Scheme技術(shù),可以通過特定的URL方式傳遞參數(shù)給另一個APP。例如Uber://pid=3894&source=25,linkedmedemo:/ /id=2351。

怎么配置URI Scheme?

在iOS工程中,打開Info.plist文件,添加URL Types節(jié)點(diǎn)即可。在這個節(jié)點(diǎn)里,可以自定義協(xié)議名稱,如linkedmedemo,這個形式的 URI 就會關(guān)聯(lián)到唯品會客戶端。眾多開發(fā)者對URI Scheme已經(jīng)不再陌生,通常在集成社會化分享組件或深度鏈接技術(shù)服務(wù)(知名品牌有友盟和LinkedME)時,必須填寫URI Scheme。

代碼實(shí)現(xiàn)

在 Info.plist 里面設(shè)置完 URL types 之后,就可以在程序中處理這類 URL 的打開請求。在外部程序中,如果打開了指定自定義協(xié)議的 URL,程序中 APPlication delegate 的 APPlication:handleOpenURL: 方法就會被調(diào)用,在這個方法里,可以獲取到觸發(fā)這個方法的 URL,可以通過對這個URL進(jìn)行判斷,例如根據(jù)不同的Host,不同的 Query String 來執(zhí)行不同的動作。

URL構(gòu)建

注意:當(dāng)前唯品會客戶端并不支持這樣的調(diào)用方式,這里僅是一個示例。

URI Scheme存在的問題?

URI Scheme能夠?qū)崿F(xiàn)APP與APP之間的關(guān)聯(lián),并且是無縫的。例如QQ音樂跳轉(zhuǎn)全民K歌,禮物說跳轉(zhuǎn)淘寶等等。由于H5相對于APP輕量,H5和APP要兼并開發(fā)。然而,從微信和微博的內(nèi)置瀏覽器查看H5頁面時,大部分APP不能夠回到APP查看相同的內(nèi)容。例如知乎、今日頭條是可以的。它們需要從Safari打開zhihu://id=2370247&source=zhig才行。

通過Safari跳轉(zhuǎn),如果用戶已安裝APP直接跳轉(zhuǎn)到APP中,如果用戶沒有安裝APP則跳轉(zhuǎn)到APP Store中下載,下載完成后打開APP不能到達(dá)用戶需要的頁面。

怎么解決這些問題呢?

蘋果在iOS 9中推出Universal Links(通用連接) 一種能夠方便的通過傳統(tǒng) HTTPS 鏈接來啟動 APP, 使用相同的網(wǎng)址打開網(wǎng)站和 APP。

通過唯一的網(wǎng)址, 不需要特別的URI Scheme就可以鏈接一個特定APP里面的視圖 。比如:一個APP分享內(nèi)容到微信,然后用戶在微信內(nèi)置瀏覽器中看到H5頁面內(nèi)容,然后用戶觸發(fā)Universal Links后,直接打開APP內(nèi)相同的頁面內(nèi)容。

NOTE

Universal links let iOS 9 users open your APP when they tap links to your website within WKWebView andUIWebView views and Safari pages, in addition to links that result in a call to openURL:, such as those that occur in Mail, Messages, and other APPs.

For users who are running versions of iOS earlier than 9.0, tAPPing a universal link to your website opens the link in Safari.

怎么使用 Universal Links?

Step1:創(chuàng)建一個JSON 格式的APPle-APP-site-association 文件如下:

根據(jù) paths 鍵設(shè)定允許的路徑列表, 或只是一個星號如果你想打開 APP 而不管路徑是什么。

注意:paths 路徑是大小寫敏感的

NOTE:The website paths you specify in the paths array are case sensitive.”

“APPID”組成部分:TeamID + BundleId TeamID可以從蘋果開發(fā)賬號頁面“Your Account”下查看,BundleId就直接在工程里看了。

Step2:上傳 APPle-APP-site-association 文件注意:

1、上傳到web server根目錄下;

2、web server 需要支持https,客戶端需要通告https訪問,并且不支持任何重定向;

upload it to the root of your HTTPS web server. The file needs to be accessible via HTTPS—without any redirects—athttps:///APPle-APP-site-association. Next, you need to handle universal links in your APP.

Step3:在 APP 里處理通用鏈接

1、添加域名到 Capabilities在 Xcode 的 capabilities 里 添加你的 APP 域名, 必須用 APPlinks: 前置它

APP從上面的域名請求Step2中創(chuàng)建的JSON 文件 APPle-APP-site-association。當(dāng)你第一次啟動 APP,它會從https://domain.com/APPle-APP-site-association下載這個文件。

2.在 APPDelegate 里支持通用鏈接

?實(shí)現(xiàn): - (BOOL)APPlication:(UIAPPlication *)APPlication continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler方法。

當(dāng) userActivity 是 NSUserActivityTypeBrowsingWeb 類型, 則意味著它已經(jīng)由通用鏈接 API 代理。這樣的話, 它保證用戶打開的 URL 將有一個非空的 webpageURL 屬性。

移動應(yīng)用實(shí)現(xiàn)深度鏈接需要考慮非常多復(fù)雜的情況,比如支持各種手機(jī)機(jī)型、移動操作系統(tǒng)、瀏覽器、系統(tǒng)版本等等,還要考慮到深度鏈接統(tǒng)計(jì)分析的諸多問題。這些問題都是建立在用戶已經(jīng)安裝APP,如果沒有安裝APP,用戶下載安裝,打開APP是否能夠看到對應(yīng)的頁面,將是非常困難的問題。

我們正致力于為移動開發(fā)者提供穩(wěn)定、安全、免費(fèi)的技術(shù)服務(wù),幫助APP提高用戶增長,當(dāng)擁有APP擁有流量之后,幫助APP實(shí)現(xiàn)流量變現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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