本文轉載自(下載示例代碼請打開第一個鏈接):
http://www.cocoachina.com/industry/20140522/8514.html
http://blog.csdn.net/wbw1985/article/details/26264029
1 URL Scheme是什么
與Android的URL Scheme類似,是為方便app之間互相調用而設計的。你可以通過一個類似URL的鏈接,通過系統的OpenURL來打開該app,並可以傳遞一些參數。每個URL必須能唯一標識一個APP,如果你設置的URL Scheme與別的APP的URL Scheme一致。那么,你的APP不一定會被調用起來,原因是當APP在安裝的時候就已經在系統里面注冊了此APP的URL Scheme,如果你的是后安裝的,那么系統不會調用你的APP,因為你的APP設置的URL scheme被覆蓋了。當然系統的APP的URL Scheme是優先級高的,不用想着能覆蓋系統APP的URL Scheme的注冊調用。
我就碰到了這個問題:在測試機里面安裝了同一個應用的兩個版本(只是名字不同,代碼一樣),在其中一個app內進行微信分享的時候,完事后點擊"回到應用",卻回到了另一個版本的app中去了。原因就是進行分享操作的app是后安裝的。找到原因之后,也是醉了!
2 URL Scheme是干什么的
大家知道在iOS系統里面APP之間是相互隔離的,不像Android,每個組件都可以作為一個獨立的功能被其他APP調用,但是,IOS系統里面也需要完成類似於三方功能如支付、搜索跳轉、導航等等跨APP的功能,怎么實現呢,蘋果就使用了URL Scheme來實現了這個功能。通過各個APP設計的符合蘋果的統一規范的URL Scheme,系統就會自動去調用相關的APP來完成你的請求。
比如:我們的APP需要使用支付寶的三方支付功能、我的APP需要使用微信分享好的文章,那么此時就可以通過URL Scheme來傳遞這些數據到支付寶APP或者微信APP,系統會通過這些APP的URL Scheme來調起這些APP,完成你所需要做的跨APP的功能。
3 URL Scheme怎么玩


展開該數據並點擊 Item 0。你將在這里定義自定義 URL scheme 的名字。只需要名字,不要在后面追加 :// — 比如,如果你輸入 iOSDevApp,你的自定義 url 就是 iOSDevApp://
雖然我贊同 Xcode 使用描述性的名字的目的,不過看到創建的實際的 key 也是非常有用的。這里有一個方便的技巧,右鍵點擊 plist 並選擇 Show Raw Keys/Values,就能看到以下效果:



- (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]; } }
- (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";
- (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
- (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; }