本文轉自 Migrant的博客,原文:《The Complete Tutorial on iOS/iPhone Custom URL Schemes》web
註冊自定義 URL Scheme
註冊自定義 URL Scheme 的第一步是建立 URL Scheme — 在 Xcode Project Navigator 中找到並點擊工程 info.plist 文件。當該文件顯示在右邊窗口,在列表上點擊鼠標右鍵,選擇 Add Row:
向下滾動彈出的列表並選擇 URL types。
![](http://static.javashuo.com/static/loading.gif)
iOS Custom URL Scheme
點擊左邊剪頭打開列表,能夠看到 Item 0,一個字典實體。展開 Item 0,能夠看到 URL Identifier,一個字符串對象。該字符串是你自定義的 URL scheme 的名字。建議採用反轉域名的方法保證該名字的惟一性,好比 com.yourCompany.yourApp。
![](http://static.javashuo.com/static/loading.gif)
urlScheme2a
點擊 Item 0 新增一行,從下拉列表中選擇 URL Schemes,敲擊鍵盤迴車鍵完成插入。
![](http://static.javashuo.com/static/loading.gif)
iOS Custom URL Scheme
注意: URL Schemes 是一個數組,容許應用定義多個 URL schemes。
![](http://static.javashuo.com/static/loading.gif)
iOS Custom URL Scheme
展開該數據並點擊 Item 0。你將在這裏定義自定義 URL scheme 的名字。只須要名字,不要在後面追加 :// — 好比,若是你輸入 iOSDevApp,你的自定義 url 就是 iOSDevApp://
![](http://static.javashuo.com/static/loading.gif)
iOS Custom URL Scheme
此時,整個定義以下圖:
![](http://static.javashuo.com/static/loading.gif)
iOS Custom URL Scheme
雖然我贊同 Xcode 使用描述性的名字的目的,不過看到建立的實際的 key 也是很是有用的。這裏有一個方便的技巧,右鍵點擊 plist 並選擇 Show Raw Keys/Values,就能看到如下效果:
![](http://static.javashuo.com/static/loading.gif)
iOS Custom URL Scheme
還有另外一種有用的輸出格式,XML,由於能夠很是容易的看到字典和原始數組及其包括的實體的結構。點擊 plist 並選擇 Open As – Source Code:
![](http://static.javashuo.com/static/loading.gif)
iPhone Custom URL Scheme
從 Safari 中調用自定義 URL Scheme
定義了 URL scheme,咱們能夠運行一個快速測試來驗證應用是否如咱們所指望的被調用。在這以前,我建立了一個準 UI 以辨別帶有自定義 URL 的應用。該應用只有一個 UILabel,帶有文本 「App With Custom URL」(
下載源代碼)。
![](http://static.javashuo.com/static/loading.gif)
iOS App with Custom URL
使用模擬器調用應用的步驟:
1. 在 Xcode 中運行應用
2. 一旦應用被安裝,自定義 URL scheme 就會被註冊
3. 經過模擬器的硬件菜單中選擇 Home 來關閉應用
4. 啓動 Safari
5. 在瀏覽器地址欄輸入以前定義的 URL scheme(以下)
![](http://static.javashuo.com/static/loading.gif)
Call Custom URL Scheme from Safari
此時 Safari 將會關閉,應用會被帶回到前臺。祝賀你剛剛使用自定義 URL scheme 調用了一個 iPhone 應用。
從另外一個 iPhone 應用中調用自定義 URL Scheme
讓咱們看看如何從另外一個應用中調用自定義 URL scheme。我又建立了一個很是簡單的 iPhone 應用,它只有一個 UILabel 和一個 UIButton — 前者顯示了一段信息,告訴你這個應用將要經過自定義 URL scheme 來調用另外一個應用,按鈕則開始這個行爲(
下載源代碼)。
![](http://static.javashuo.com/static/loading.gif)
iPhone app that call Custom URL Scheme
buttonPressed 方法中的代碼處理 URL 調用:
- - (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 實例來打開 URL (第 8 行)。openURL: 方法啓動應用並將 URL 傳入應用。在此過程當中,當前的應用被退出。
經過自定義 URL Scheme 嚮應用傳遞參數
有時你須要經過自定義 URL 嚮應用中傳遞參數。讓咱們看看該如何完成這個工做。
NSURL 做爲從一個應用調用另外一個的基礎,遵循
RFC 1808 (Relative Uniform Resource Locators) 標準。 所以你所熟悉的基於網頁內容的 URL 格式在這裏也適用。
在自定義了 URL scheme 的應用中,app delegate 必須實現如下方法:
- - (BOOL)application:(UIApplication *)application
- openURL:(NSURL *)url
- sourceApplication:(NSString *)sourceApplication
- annotation:(id)annotation
從一個應用傳遞參數到另外一個的訣竅是經過 URL。例如,假設咱們使用如下的 URL scheme,想傳遞一個名爲 「token」的參數和一個標識註冊狀態的標誌,咱們能夠像這樣建立一個 URL:
- NSString *customURL = @"iOSDevTips://?token=123abct®istered=1";
在 web 開發中,字符串 ?token=123abct®istered=1 被稱做查詢詢串(query string)。
在被調用(設置了自定義 URL)的應用的 app delegate 中,獲取參數的代碼以下:
- - (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;
- }
以上代碼在應用被調用時的輸出爲:
- Calling Application Bundle ID: com.3Sixty.CallCustomURL
- URL scheme:iOSDevTips
- URL query: token=123abct®istered=1
注意 「Calling Application Bundle ID」,你能夠用這個來確保只有你定義的應用能夠與你的應用直接交互。
讓咱們改變一下代碼,來驗證發起調用的應用的 Bundle ID 是否合法:
- - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
- sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
- {
- // Check the calling application Bundle ID
- 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;
- }
有一點要特別注意,你不能阻止其餘應用經過自定義 URL scheme 調用你的應用,然而你能夠跳事後續的操做並返回 NO,就像上面的代碼那樣。也就是說,若是你想阻止其它應用調用你的應用,建立一個不同凡響的 URL scheme。儘管這不能保證你的應用不會被調用,但至少大大下降了這種可能性。
自定義 URL Scheme 示例工程
我意識到按照本文的每一步作下來仍是有一點複雜的。我作好了兩個很是基礎的 iOS 應用,一個自定義了 URL scheme,另外一個則去調用它,並傳遞了一個比較短的參數列表(query string)。這些是體驗自定義 URL 的很好的入門點。
其它資源