溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

LinkedME|Deep Linking技術(shù)你真的了解嗎

發(fā)布時(shí)間:2020-07-30 18:53:19 來(lái)源:網(wǎng)絡(luò) 閱讀:686 作者:LinkedME 欄目:移動(dòng)開(kāi)發(fā)

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



  • SandBox是什么? 

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

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

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

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


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

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


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

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


  • 怎么解決這個(gè)問(wèn)題? 

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


  • 怎么配置URI Scheme? 

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

LinkedME|Deep Linking技術(shù)你真的了解嗎


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

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

  1. - (void)APPlication:(UIAPPlication *)APPlication handleOpenURL:(NSURL *)url {

  1.    // 在 host 等于 list.vip.com,說(shuō)明這是唯品會(huì)的寶貝詳情url,

  1.    // 那么就使用本地的 TBItemDetailViewController 來(lái)顯示

  1.    if ([[url host] isEqualToString:@"list.vip.com"]) {

  1.        // 這里只是簡(jiǎn)單地假設(shè) url 形式為 vip://list.vip.com/item.htm?id=xxxxx

  1.        // 先獲取要查看的寶貝詳情的 itemId

  1.        NSString *itemId = [[url query] substringFromIndex:[[url query] rangeOfString:@"id="].location+3];

  1.        // 使用本地 ViewController 來(lái)顯示詳情

  1.        VipItemDetailViewController *controller = [[VipItemDetailViewController alloc] initWithItemId:itemId];

  1.        [self.navigationController pushViewController:controller animated:YES];

  1.    }


  • URL構(gòu)建 

  1. - (void)showItemInVipForiOS:(NSString *)itemId {

  1.    // 構(gòu)建客戶(hù)端協(xié)議的 URL

  1.    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"vip://list.vip.com/item.htm?id=%@", itemId]];

  1.    // 判斷當(dāng)前系統(tǒng)是安裝客戶(hù)端

  1.    if ([[UIAPPlication sharedAPPlication] canOpenURL:url]){

  1.        // 如果已經(jīng)安裝客戶(hù)端,就使用客戶(hù)端打開(kāi)鏈接

  1.        [[UIAPPlication sharedAPPlication] openURL:url];

  1.    } else {

  1.        // 否則使用 Mobile Safari 或者內(nèi)嵌 WebView 來(lái)顯示

  1.        url = [NSURL URLWithString:[NSString stringWithFormat:@"http://list.vip.com/item.htm?id=%@", itemId]];

  1.        [[UIAPPlication sharedAPPlication] openURL:url];

  1.    }

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


  • URI Scheme存在的問(wèn)題? 

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

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


  • 怎么解決這些問(wèn)題呢? 

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

通過(guò)唯一的網(wǎng)址, 不需要特別的URI Scheme就可以鏈接一個(gè)特定APP里面的視圖 。比如:一個(gè)APP分享內(nèi)容到微信,然后用戶(hù)在微信內(nèi)置瀏覽器中看到H5頁(yè)面內(nèi)容,然后用戶(hù)觸發(fā)Universal Links后,直接打開(kāi)APP內(nèi)相同的頁(yè)面內(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)建一個(gè)JSON 格式的APPle-APP-site-association 文件如下:

  1. {

  1.      "APPlinks": {

  1.          "APPs": [],

  1.          "details": [

  1.              {

  1.                  "APPID": "9JA89QQLNQ.com.APPle.wwdc",

  1.                  "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*" ]

  1.              },

  1.              {

  1.                  "APPID": "TeamID.BundleID2",

  1.                  "paths": [ "*" ]

  1.              }

  1.          ]

  1.      }

  1.  } 

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

注意:paths 路徑是大小寫(xiě)敏感的

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

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


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

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

2、web server 需要支持https,客戶(hù)端需要通告https訪問(wèn),并且不支持任何重定向;

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


Step3:在 APP 里處理通用鏈接

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

LinkedME|Deep Linking技術(shù)你真的了解嗎

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

2.在 APPDelegate 里支持通用鏈接

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

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


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

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



參考連接 

1.http://iosdevelopertips.com/cocoa/launching-your-own-APPlication-via-a-custom-url-scheme.html

2.http://blog.csdn.net/ba_jie/article/details/6884818

3.https://www.linkedme.cc/

4.https://developer.APPle.com/library/ios/documentation/General/Conceptual/APPSearch/UniversalLinks.html#//APPle_ref/doc/uid/TP40016308-CH12-SW2



向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI