本文做者徐斌,原騰信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 文件,注意
上傳到web server根目錄下;
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 裏處理通用連接
添加域名到 Capabilities在 Xcode 的 capabilities 裏 添加你的 APP 域名,必須用 APPlinks: 前置它
APP從上面的域名請求Step2中建立的JSON 文件 APPle-APP-site-association。當你第一次啓動 APP,它會從 https://domain.com/APPle-APP-site-association 下載這個文件。
在 APPDelegate 裏支持通用連接實現:- (BOOL)APPlication:(UIAPPlication *)APPlication continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray*restorableObjects))restorationHandler
方法。
當 userActivity 是 NSUserActivityTypeBrowsingWeb 類型, 則意味着它已經由通用連接 API 代理。這樣的話, 它保證用戶打開的 URL 將有一個非空的 webpageURL 屬性。
移動應用實現深度連接須要考慮很是多複雜的狀況,好比支持各類手機機型、移動操做系統、瀏覽器、系統版本等等,還要考慮到深度連接統計分析的諸多問題。這些問題都是創建在用戶已經安裝APP,若是沒有安裝APP,用戶下載安裝,打開APP是否可以看到對應的頁面,將是很是困難的問題。
咱們正致力於爲移動開發者提供穩定、安全、免費的技術服務,幫助APP提升用戶增加,當擁有APP擁有流量以後,幫助APP實現流量變現。
參考鏈接