標籤:
通過註冊的URL Scheme向目標APP傳遞參數
通過URL Scheme啟動APP很簡單就可以做到,但有時候我們想在啟動APP的時候傳遞一些參數,這個時候我們就可以通過URL Scheme自訂URL來傳遞參數了。
昨天我們在AppDelegate調用了UIApplicationDelegate的代理方法:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url{ // 接受傳過來的參數 NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"開啟啦" message:text delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; return YES;}
我們來看看蘋果給這個方法的注釋:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url; // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:
這個方法在未來將被廢棄,可以用application:openURL:sourceApplication:annotation:來代替。
URL傳參格式
昨天我們在iOSStrongDemo註冊的URL Scheme還記得是什麼嗎?你應該還有印象的就是iOS開發的ID:iOSDevTip。
假設我們想要傳遞兩個參數分別是名字name和手機號phone,格式如下:
iOSDevTip://?name=ligang&phone=13888888888
有沒有似曾相識的感覺。我們用get方式請求一個介面是不是就是這樣的。
被啟動的APP處理傳過來的參數
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{ NSLog(@"sourceApplication: %@", sourceApplication); NSLog(@"URL scheme:%@", [url scheme]); NSLog(@"URL query: %@", [url query]); // 接受傳過來的參數 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"開啟啦" message:[url query] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; return YES;}
當APP被啟動是,會調用代理方法application:openURL:sourceApplication:annotation:。參數URL就是啟動APP的URL,參數sourceApplication就是來源APP的Bundle ID。
我們依然通過Safari來測試,在Safari的地址欄中輸入:iOSDevTip://?name=ligang&phone=13888888888
即可開啟APP,看看參數是否傳遞過來:
最後我們看一下列印:
2015-07-15 22:38:25.655 iOSStrongDemo[9983:2894855] sourceApplication: com.apple.mobilesafari2015-07-15 22:38:28.664 iOSStrongDemo[9983:2894855] URL scheme:iosdevtip2015-07-15 22:38:28.665 iOSStrongDemo[9983:2894855] URL query: name=ligang&phone=13888888888
sourceApplication列印出來是com.apple.mobilesafari,從這裡可以看出來,是從Safari啟動我們的APP的。
我們雖然自訂了URL Scheme,但是我們不能阻止別人通過自訂的URL Scheme來開啟我們的應用。怎麼解決呢?
我們可以指定相應的sourceApplication,也就是相應的Bundle ID,通過Bundle ID來決定是否可以開啟我們的APP:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{ NSLog(@"sourceApplication: %@", sourceApplication); NSLog(@"URL scheme:%@", [url scheme]); NSLog(@"URL query: %@", [url query]); if ([sourceApplication isEqualToString:@"com.3Sixty.CallCustomURL"]){ // 接受傳過來的參數 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"開啟啦" message:[url query] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; return YES; }else{ return NO; }}
這樣我們就可以通過Bundle ID來決定是否允許開啟我們的APP,demo:iOSStrongDemo
本文出處剛剛線上:http://www.superqq.com/blog/2015/07/15/tong-guo-url-schemechuan-di-can-shu/
通過註冊的URL Scheme向目標APP傳遞參數