您好,登錄后才能下訂單哦!
本文作者徐斌,原騰信IOS工程師,現(xiàn)LinkedME高級(jí)工程師。
SandBox是什么?
SandBox(沙盒)機(jī)制規(guī)定應(yīng)用程序只能夠讀取應(yīng)用程序內(nèi)部的數(shù)據(jù),不可以訪問(wèn)其他應(yīng)用的信息數(shù)據(jù)。
在iOS設(shè)備中每一個(gè)APP都有自己的儲(chǔ)存空間
APP只能訪問(wèn)自己的沙盒目錄下內(nèi)容,不能訪問(wèn)其它存儲(chǔ)空間的內(nèi)容
應(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。
代碼實(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)作。
- (void)APPlication:(UIAPPlication *)APPlication handleOpenURL:(NSURL *)url {
// 在 host 等于 list.vip.com,說(shuō)明這是唯品會(huì)的寶貝詳情url,
// 那么就使用本地的 TBItemDetailViewController 來(lái)顯示
if ([[url host] isEqualToString:@"list.vip.com"]) {
// 這里只是簡(jiǎn)單地假設(shè) url 形式為 vip://list.vip.com/item.htm?id=xxxxx
// 先獲取要查看的寶貝詳情的 itemId
NSString *itemId = [[url query] substringFromIndex:[[url query] rangeOfString:@"id="].location+3];
// 使用本地 ViewController 來(lái)顯示詳情
VipItemDetailViewController *controller = [[VipItemDetailViewController alloc] initWithItemId:itemId];
[self.navigationController pushViewController:controller animated:YES];
}
}
URL構(gòu)建
- (void)showItemInVipForiOS:(NSString *)itemId {
// 構(gòu)建客戶(hù)端協(xié)議的 URL
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"vip://list.vip.com/item.htm?id=%@", itemId]];
// 判斷當(dāng)前系統(tǒng)是安裝客戶(hù)端
if ([[UIAPPlication sharedAPPlication] canOpenURL:url]){
// 如果已經(jīng)安裝客戶(hù)端,就使用客戶(hù)端打開(kāi)鏈接
[[UIAPPlication sharedAPPlication] openURL:url];
} else {
// 否則使用 Mobile Safari 或者內(nèi)嵌 WebView 來(lái)顯示
url = [NSURL URLWithString:[NSString stringWithFormat:@"http://list.vip.com/item.htm?id=%@", itemId]];
[[UIAPPlication sharedAPPlication] openURL:url];
}
}
注意:當(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 文件如下:
{
"APPlinks": {
"APPs": [],
"details": [
{
"APPID": "9JA89QQLNQ.com.APPle.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*" ]
},
{
"APPID": "TeamID.BundleID2",
"paths": [ "*" ]
}
]
}
}
根據(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: 前置它
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
免責(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)容。