生活随笔
收集整理的這篇文章主要介紹了
自定义 URL Scheme 完全指南
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文轉(zhuǎn)自?Migrant的博客,原文:《The Complete Tutorial on iOS/iPhone Custom URL Schemes》
?
iPhone / iOS SDK 最酷的特性之一就是應(yīng)用將其自身”綁定”到一個(gè)自定義 URL scheme 上,該 scheme 用于從瀏覽器或其他應(yīng)用中啟動本應(yīng)用。
注冊自定義 URL Scheme
注冊自定義 URL Scheme 的第一步是創(chuàng)建 URL Scheme — 在 Xcode Project Navigator 中找到并點(diǎn)擊工程 info.plist 文件。當(dāng)該文件顯示在右邊窗口,在列表上點(diǎn)擊鼠標(biāo)右鍵,選擇 Add Row:
向下滾動彈出的列表并選擇 URL types。
iOS Custom URL Scheme
點(diǎn)擊左邊剪頭打開列表,可以看到 Item 0,一個(gè)字典實(shí)體。展開 Item 0,可以看到 URL Identifier,一個(gè)字符串對象。該字符串是你自定義的 URL scheme 的名字。建議采用反轉(zhuǎn)域名的方法保證該名字的唯一性,比如 com.yourCompany.yourApp。
urlScheme2a
點(diǎn)擊 Item 0 新增一行,從下拉列表中選擇 URL Schemes,敲擊鍵盤回車鍵完成插入。?
iOS Custom URL Scheme
注意: URL Schemes 是一個(gè)數(shù)組,允許應(yīng)用定義多個(gè) URL schemes。?
iOS Custom URL Scheme
展開該數(shù)據(jù)并點(diǎn)擊 Item 0。你將在這里定義自定義 URL scheme 的名字。只需要名字,不要在后面追加 :// — 比如,如果你輸入 iOSDevApp,你的自定義 url 就是 iOSDevApp://?
iOS Custom URL Scheme
此時(shí),整個(gè)定義如下圖:?
iOS Custom URL Scheme
雖然我贊同 Xcode 使用描述性的名字的目的,不過看到創(chuàng)建的實(shí)際的 key 也是非常有用的。這里有一個(gè)方便的技巧,右鍵點(diǎn)擊 plist 并選擇 Show Raw Keys/Values,就能看到以下效果:?
iOS Custom URL Scheme
還有另一種有用的輸出格式,XML,因?yàn)榭梢苑浅H菀椎目吹阶值浜驮紨?shù)組及其包括的實(shí)體的結(jié)構(gòu)。點(diǎn)擊 plist 并選擇 Open As – Source Code:?
iPhone Custom URL Scheme
從 Safari 中調(diào)用自定義 URL Scheme
定義了 URL scheme,我們可以運(yùn)行一個(gè)快速測試來驗(yàn)證應(yīng)用是否如我們所期望的被調(diào)用。在這之前,我創(chuàng)建了一個(gè)準(zhǔn) UI 以辨別帶有自定義 URL 的應(yīng)用。該應(yīng)用只有一個(gè) UILabel,帶有文本 “App With Custom URL”(
下載源代碼)。?
iOS App with Custom URL
使用模擬器調(diào)用應(yīng)用的步驟:
1. 在 Xcode 中運(yùn)行應(yīng)用
2. 一旦應(yīng)用被安裝,自定義 URL scheme 就會被注冊
3. 通過模擬器的硬件菜單中選擇 Home 來關(guān)閉應(yīng)用
4. 啟動 Safari
5. 在瀏覽器地址欄輸入之前定義的 URL scheme(如下)?
Call Custom URL Scheme from Safari
此時(shí) Safari 將會關(guān)閉,應(yīng)用會被帶回到前臺。祝賀你剛剛使用自定義 URL scheme 調(diào)用了一個(gè) iPhone 應(yīng)用。
從另一個(gè) iPhone 應(yīng)用中調(diào)用自定義 URL Scheme
讓我們看看如何從另一個(gè)應(yīng)用中調(diào)用自定義 URL scheme。我又創(chuàng)建了一個(gè)非常簡單的 iPhone 應(yīng)用,它只有一個(gè) UILabel 和一個(gè) UIButton — 前者顯示了一段信息,告訴你這個(gè)應(yīng)用將要通過自定義 URL scheme 來調(diào)用另一個(gè)應(yīng)用,按鈕則開始這個(gè)行為(
下載源代碼)。?
iPhone app that call Custom URL Scheme
buttonPressed 方法中的代碼處理 URL 調(diào)用:?
-?(void)buttonPressed:(UIButton?*)button?{???NSString?*customURL?=?@"iOSDevTips://";????if?([[UIApplication?sharedApplication]?????canOpenURL:[NSURL?URLWithString:customURL]])???{?????[[UIApplication?sharedApplication]?openURL:[NSURL?URLWithString:customURL]];???}???else???{?????UIAlertView?*alert?=?[[UIAlertView?alloc]?initWithTitle:@"URL?error"???????????????????????????message:[NSString?stringWithFormat:?????????????????????????????@"No?custom?URL?defined?for?%@",?customURL]???????????????????????????delegate:self?cancelButtonTitle:@"Ok"???????????????????????????otherButtonTitles:nil];?????[alert?show];???}?}?
第 5 行代碼檢查自定義 URL 是否被定義,如果定義了,則使用 shared application 實(shí)例來打開 URL (第 8 行)。openURL: 方法啟動應(yīng)用并將 URL 傳入應(yīng)用。在此過程中,當(dāng)前的應(yīng)用被退出。
通過自定義 URL Scheme 向應(yīng)用傳遞參數(shù)
有時(shí)你需要通過自定義 URL 向應(yīng)用中傳遞參數(shù)。讓我們看看該如何完成這個(gè)工作。
NSURL 作為從一個(gè)應(yīng)用調(diào)用另一個(gè)的基礎(chǔ),遵循?
RFC 1808?(Relative Uniform Resource Locators) 標(biāo)準(zhǔn)。 因此你所熟悉的基于網(wǎng)頁內(nèi)容的 URL 格式在這里也適用。
在自定義了 URL scheme 的應(yīng)用中,app delegate 必須實(shí)現(xiàn)以下方法:?
-?(BOOL)application:(UIApplication?*)application???openURL:(NSURL?*)url???sourceApplication:(NSString?*)sourceApplication???annotation:(id)annotation?
從一個(gè)應(yīng)用傳遞參數(shù)到另一個(gè)的訣竅是通過 URL。例如,假設(shè)我們使用以下的 URL scheme,想傳遞一個(gè)名為 “token”的參數(shù)和一個(gè)標(biāo)識注冊狀態(tài)的標(biāo)志,我們可以像這樣創(chuàng)建一個(gè) URL:?
NSString?*customURL?=?@"iOSDevTips://?token=123abct®istered=1";?
在 web 開發(fā)中,字符串 ?token=123abct®istered=1 被稱作查詢詢串(query string)。
在被調(diào)用(設(shè)置了自定義 URL)的應(yīng)用的 app delegate 中,獲取參數(shù)的代碼如下:?
-?(BOOL)application:(UIApplication?*)application?openURL:(NSURL?*)url?????????sourceApplication:(NSString?*)sourceApplication?annotation:(id)annotation?{???NSLog(@"Calling?Application?Bundle?ID:?%@",?sourceApplication);???NSLog(@"URL?scheme:%@",?[url?scheme]);???NSLog(@"URL?query:?%@",?[url?query]);????return?YES;?}?
以上代碼在應(yīng)用被調(diào)用時(shí)的輸出為:?
Calling?Application?Bundle?ID:?com.3Sixty.CallCustomURL?URL?scheme:iOSDevTips?URL?query:?token=123abct®istered=1?
注意 “Calling Application Bundle ID”,你可以用這個(gè)來確保只有你定義的應(yīng)用可以與你的應(yīng)用直接交互。
讓我們改變一下代碼,來驗(yàn)證發(fā)起調(diào)用的應(yīng)用的 Bundle ID 是否合法:?
-?(BOOL)application:(UIApplication?*)application?openURL:(NSURL?*)url?????????sourceApplication:(NSString?*)sourceApplication?annotation:(id)annotation?{??????if?([sourceApplication?isEqualToString:@"com.3Sixty.CallCustomURL"])???{?????NSLog(@"Calling?Application?Bundle?ID:?%@",?sourceApplication);?????NSLog(@"URL?scheme:%@",?[url?scheme]);?????NSLog(@"URL?query:?%@",?[url?query]);??????return?YES;???}???else?????return?NO;?}?
有一點(diǎn)要特別注意,你不能阻止其他應(yīng)用通過自定義 URL scheme 調(diào)用你的應(yīng)用,然而你可以跳過后續(xù)的操作并返回 NO,就像上面的代碼那樣。也就是說,如果你想阻止其它應(yīng)用調(diào)用你的應(yīng)用,創(chuàng)建一個(gè)與眾不同的 URL scheme。盡管這不能保證你的應(yīng)用不會被調(diào)用,但至少大大降低了這種可能性。
自定義 URL Scheme 示例工程
我意識到按照本文的每一步做下來還是有一點(diǎn)復(fù)雜的。我做好了兩個(gè)非?;A(chǔ)的 iOS 應(yīng)用,一個(gè)自定義了 URL scheme,另一個(gè)則去調(diào)用它,并傳遞了一個(gè)比較短的參數(shù)列表(query string)。這些是體驗(yàn)自定義 URL 的很好的入門點(diǎn)。
Download Xcode project for app with Custom URL scheme
Download Xcode project for app to call custom URL scheme
其它資源
How to Properly Validate URL Parameters
URL Scheme Reference Docs
總結(jié)
以上是生活随笔為你收集整理的自定义 URL Scheme 完全指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。