【備忘:】在 iOS 里,程序之間都是相互隔離,目前并沒(méi)有一個(gè)有效的方式來(lái)做程序間通信,幸好 iOS 程序可以很方便的注冊(cè)自己的URL Scheme,這樣就可以通過(guò)打開(kāi)特定 URL 的方式來(lái)傳遞參數(shù)給另外一個(gè)程序。
例如在 iPad 上瀏覽網(wǎng)頁(yè),并且 iPad 已經(jīng)安裝了 淘寶 HD,那么就打開(kāi)下面這個(gè)鏈接就會(huì)在淘寶 HD中查看這個(gè)商品的詳細(xì)信息,也可以方便的使用淘寶 HD 進(jìn)行購(gòu)買(mǎi)、收藏等操作。
在淘寶 HD 中查看商品“2012西藏卓明谷方舟登艦卡(船票)”
當(dāng)然,如果你在 Mac OS X 中打開(kāi)這個(gè)鏈接,或者在沒(méi)有安裝 淘寶 HD 的 iPad中打開(kāi)這個(gè)鏈接,會(huì)提示沒(méi)有程序來(lái)打開(kāi)這個(gè)鏈接。
配置
要為 iOS 程序添加自定義協(xié)議的支持是一件很方便的事,只需要在程序的 Info.plist 添加一個(gè) URL types節(jié)點(diǎn)就可以了。在這個(gè)節(jié)點(diǎn)里,可以設(shè)置這個(gè)程序所支持的自定義協(xié)議名稱(chēng),像 http、ftp這種,一般我們可以設(shè)置為程序英文名稱(chēng),像淘寶客戶(hù)端中就設(shè)置了 taobao,這樣 taobao:// 這個(gè)形式的 URL就會(huì)關(guān)聯(lián)到淘寶客戶(hù)端的 App。
實(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 *)applicationhandleOpenURL:(NSURL *)url {
NSLog(@"%@", [urlabsoluteString]);
// 在 host 等于 item時(shí),說(shuō)明一個(gè)寶貝詳情的 url,
// 那么就使用本地的TBItemDetailViewController 來(lái)顯示
if ([[url host]isEqualToString:@"item"]) {
// 這里只是簡(jiǎn)單地假設(shè) url 形式為taobao://item/item.htm?id=12345678
// 先獲取要查看的寶貝詳情的 itemId
NSString *itemId = [[url query]substringFromIndex:[[url query]rangeOfString:@"id="].location+3];
// 使用本地 ViewController 來(lái)顯示淘寶商品詳情
TBItemDetailViewController *controller =[[TBItemDetailViewController alloc] initWithItemId:itemId];
[self.navigationControllerpushViewController:controller animated:YES];
[controller release];
}
}
淘寶 for iOS
現(xiàn)在,淘寶 和 淘寶 HD 兩個(gè)客戶(hù)端都支持 taobao:// 協(xié)議,來(lái)打開(kāi)特定的鏈接。目前已經(jīng)支持的有:
寶貝詳情 taobao://item/item.htm?id=12688928896
寶貝搜索 taobao://s/?q=iphone
店鋪搜索taobao://shopsearch/browse/shop_search.htm?q=iphone
例如,想要在自己的程序中,使用淘寶客戶(hù)端來(lái)顯示一個(gè)淘寶商品的詳情,以支持用戶(hù)可以直接在 iPhone上購(gòu)買(mǎi),收藏等,就可以使用下面的代碼:
- (void)showItemInTaobao4iOS:(NSString *)itemId {
// 構(gòu)建淘寶客戶(hù)端協(xié)議的 URL
NSURL *url = [NSURLURLWithString:[NSStringstringWithFormat:@"taobao://item/item.htm?id=%@",itemId]];
// 判斷當(dāng)前系統(tǒng)是否有安裝淘寶客戶(hù)端
if ([[UIApplicationsharedApplication] canOpenURL:url]) {
// 如果已經(jīng)安裝淘寶客戶(hù)端,就使用客戶(hù)端打開(kāi)鏈接
[[UIApplication sharedApplication]openURL:url];
} else {
// 否則使用 Mobile Safari 或者內(nèi)嵌 WebView 來(lái)顯示
url = [NSURL URLWithString:[NSStringstringWithFormat:@"http://item/item.htm?id=%@",itemId]];
[[UIApplication sharedApplication]openURL:url];
}
}
使用淘寶客戶(hù)端來(lái)打開(kāi)淘寶鏈接的好處就是可以讓用戶(hù)更加方便的去購(gòu)買(mǎi)商品,而不需要再重新登錄,或者把用戶(hù)名密碼給了第三方的網(wǎng)站而導(dǎo)致安全隱患。
擴(kuò)展性
在淘寶客戶(hù)端中,支持的 URL 往往是淘寶網(wǎng)站已經(jīng)有的鏈接,這些鏈接的 QueryString中所帶的參數(shù)往往已經(jīng)滿(mǎn)足了使用本地代碼顯示內(nèi)容的需要,但是為了擴(kuò)展性考慮,就需要添加一些額外的參數(shù),并且與原有 QueryString中不沖突的參數(shù)名稱(chēng)。通過(guò)這些額外的參數(shù),再實(shí)現(xiàn)客戶(hù)端打開(kāi)鏈接時(shí)更多的自定義行為。
例如,如果在打開(kāi)特定 URL,進(jìn)行一些操作后需要再返回原來(lái)的程序,就會(huì)需要在 URL 中添加類(lèi)似于 callback這樣的參數(shù),這樣在客戶(hù)端處理完用戶(hù)的操作后,可以將用戶(hù)操作的結(jié)果返回給原來(lái)的程序,從而實(shí)現(xiàn)程序間的通信。
示例:
- (void)buyItemInTaobao4iOS:(NSString *)itemId {
// 構(gòu)建淘寶客戶(hù)端協(xié)議的 URL
NSString *format =@"taobao://item/item.htm?id=%@&_action=buy&_callback=myapp://taobaobuysuccess";
NSURL *url = [NSURLURLWithString:[NSString stringWithFormat:format, itemId]];
// 使用淘寶客戶(hù)端打開(kāi)鏈接
[[UIApplicationsharedApplication] openURL:url];
}
注意:當(dāng)前淘寶客戶(hù)端并不支持這樣的調(diào)用方式,這里僅是一個(gè)示例。
當(dāng)然,在使用這種方式實(shí)現(xiàn)程序間通信的時(shí)候,需要考慮檢查一下來(lái)源 URL 的合法性,防止一些非法的調(diào)用造成用戶(hù)的損失。
結(jié)語(yǔ)

通過(guò)自定義協(xié)議地支持,可以將 iOS 程序的一些功能和服務(wù)提供給外部程序,也可以實(shí)現(xiàn) Web 和本地應(yīng)用之間的互相調(diào)用。
如果你的 iOS 程序有這些需求的話(huà),那么就可以考慮在 iOS 程序中添加自定義協(xié)議的支持了。
愛(ài)華網(wǎng)本文地址 » http://www.klfzs.com/a/25101014/231946.html
愛(ài)華網(wǎng)



