LinkedME|移動應用開發者必須知道的Deep Linking技術

本文做者徐斌,原騰信IOS工程師,現LinkedME高級工程師。html

SandBox是什麼?ios

SandBox(沙盒)機制規定應用程序只可以讀取應用程序內部的數據,不能夠訪問其餘應用的信息數據。在iOS設備中每個APP都有本身的儲存空間APP只能訪問本身的沙盒目錄下內容,不能訪問其它存儲空間的內容。應用程序的數據請求須要通過權限檢測,檢測不經過則不執行。web

爲何要使用沙盒機制?瀏覽器

SandBox是安全體系中的一種機制,從而蘋果公司在設計iOS系統時,考慮應用之間的信息安全,對應用程序的訪問權限設置限制。安全

沙盒機制有什麼弊端?微信

使用沙盒機制後APP之間不能相互訪問通訊,使得APP成爲一個個的信息孤島。dom

怎麼解決這個問題?ide

爲了解決APP信息孤島問題,蘋果在iOS 4中推出了URI Scheme技術,能夠經過特定的URL方式傳遞參數給另外一個APP。
例如Uber://pid=3894&source=25,linkedmedemo:/ /id=2351。網站

怎麼配置URI Scheme?ui

在iOS工程中,打開Info.plist文件,添加URL Types節點便可。在這個節點裏,能夠自定義協議名稱,如linkedmedemo,這個形式的 URI 就會關聯到惟品會客戶端。
衆多開發者對URI Scheme已經再也不陌生,一般在集成社會化分享組件或深度連接技術服務(知名品牌有友盟和LinkedME)時,必須填寫URI Scheme。
圖片描述

代碼實現

在 Info.plist 裏面設置完 URL types 以後,就能夠在程序中處理這類 URL 的打開請求。在外部程序中,若是打開了指定自定義協議的 URL,程序中 APPlication delegate 的 APPlication:handleOpenURL: 方法就會被調用,在這個方法裏,能夠獲取到觸發這個方法的 URL,能夠經過對這個URL進行判斷,例如根據不一樣的Host,不一樣的 Query String 來執行不一樣的動做。

- (void)APPlication:(UIAPPlication *)APPlication handleOpenURL:(NSURL *)url {
   // 在 host 等於 list.vip.com,說明這是惟品會的寶貝詳情url,
   // 那麼就使用本地的 TBItemDetailViewController 來顯示
   if ([[url host] isEqualToString:@"list.vip.com"]) {
       // 這裏只是簡單地假設 url 形式爲 vip://list.vip.com/item.htm?id=xxxxx
       // 先獲取要查看的寶貝詳情的 itemId
       NSString *itemId = [[url query] substringFromIndex:[[url query] rangeOfString:@"id="].location+3];
       // 使用本地 ViewController 來顯示詳情
       VipItemDetailViewController *controller = [[VipItemDetailViewController alloc] initWithItemId:itemId];
       [self.navigationController pushViewController:controller animated:YES];
   }
}

URL構建

- (void)showItemInVipForiOS:(NSString *)itemId {
   // 構建客戶端協議的 URL
   NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"vip://list.vip.com/item.htm?id=%@", itemId]];
   // 判斷當前系統是安裝客戶端
   if ([[UIAPPlication sharedAPPlication] canOpenURL:url]){
       // 若是已經安裝客戶端,就使用客戶端打開連接
       [[UIAPPlication sharedAPPlication] openURL:url];
   } else {
       // 不然使用 Mobile Safari 或者內嵌 WebView 來顯示
       url = [NSURL URLWithString:[NSString stringWithFormat:@"http://list.vip.com/item.htm?id=%@", itemId]];
       [[UIAPPlication sharedAPPlication] openURL:url];
   }
}

注意:當前惟品會客戶端並不支持這樣的調用方式,這裏僅是一個示例。

URI Scheme存在的問題?

URI Scheme可以實現APP與APP之間的關聯,而且是無縫的。例如QQ音樂跳轉全民K歌,禮物說跳轉淘寶等等。因爲H5相對於APP輕量,H5和APP要兼併開發。然而,從微信和微博的內置瀏覽器查看H5頁面時,大部分APP不可以回到APP查看相同的內容。例如知乎、今日頭條是能夠的。它們須要從Safari打開[zhihu://id=2370247&source=zhig]才行。經過Safari跳轉,若是用戶已安裝APP直接跳轉到APP中,若是用戶沒有安裝APP則跳轉到APP Store中下載,下載完成後打開APP不能到達用戶須要的頁面。

怎麼解決這些問題呢?

蘋果在iOS 9中推出Universal Links(通用鏈接) 一種可以方便的經過傳統 HTTPS 連接來啓動 APP, 使用相同的網址打開網站和 APP。經過惟一的網址, 不須要特別的URI Scheme就能夠連接一個特定APP裏面的視圖 。好比:一個APP分享內容到微信,而後用戶在微信內置瀏覽器中看到H5頁面內容,而後用戶觸發Universal Links後,直接打開APP內相同的頁面內容。

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:建立一個JSON 格式的APPle-APP-site-association 文件,以下

{
     "APPlinks": {
         "APPs": [],
         "details": [
             {
                 "APPID": "9JA89QQLNQ.com.APPle.wwdc",
                 "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*" ]
             },
             {
                 "APPID": "TeamID.BundleID2",
                 "paths": [ "*" ]
             }
         ]
     }
 }

根據 paths 鍵設定容許的路徑列表, 或只是一個星號若是你想打開 APP 而無論路徑是什麼。

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

{NOTE:The website paths you specify in the paths array are case sensitive.」 「APPID」組成部分:TeamID + BundleId TeamID能夠從蘋果開發帳號頁面「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—at https:///APPle-APP-site-association. Next, you need to handle universal links in your APP.

Step3:在 APP 裏處理通用連接

  1. 添加域名到 Capabilities在 Xcode 的 capabilities 裏 添加你的 APP 域名,必須用 APPlinks: 前置它
    圖片描述

APP從上面的域名請求Step2中建立的JSON 文件 APPle-APP-site-association。當你第一次啓動 APP,它會從 https://domain.com/APPle-APP-site-association 下載這個文件。

  1. 在 APPDelegate 裏支持通用連接實現:- (BOOL)APPlication:(UIAPPlication *)APPlication continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray*restorableObjects))restorationHandler方法。
    當 userActivity 是 NSUserActivityTypeBrowsingWeb 類型, 則意味着它已經由通用連接 API 代理。這樣的話, 它保證用戶打開的 URL 將有一個非空的 webpageURL 屬性。

移動應用實現深度連接須要考慮很是多複雜的狀況,好比支持各類手機機型、移動操做系統、瀏覽器、系統版本等等,還要考慮到深度連接統計分析的諸多問題。這些問題都是創建在用戶已經安裝APP,若是沒有安裝APP,用戶下載安裝,打開APP是否可以看到對應的頁面,將是很是困難的問題。

咱們正致力於爲移動開發者提供穩定、安全、免費的技術服務,幫助APP提升用戶增加,當擁有APP擁有流量以後,幫助APP實現流量變現。

參考鏈接

  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

相關文章
相關標籤/搜索