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