標籤:
目的:通過URL Scheme啟動APP,並且在啟動APP的時候傳遞參數。
一、通過URL Scheme啟動APP
1.先註冊URL Scheme,在info.plist裡添加URL Scheme,選擇add row添加URL types
2.添加完URL types,點擊展開,添加URL Schemes
3.設定URL Schemes為xxxx
4.設定URL Identifier,URL Identifier是自訂的 URL scheme 的名字,一般採用反轉網域名稱的方法保證該名字的唯一性,比如 com.yyyy.www
為了方便測試,我們在AppDelegate裡面添加一個UIAlertView,當app被成功開啟時,會提出提示:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
// 接受傳過來的參數
NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"開啟啦"
message:text
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
return YES;
}
5.safari啟動自訂的URL Schemes APP
既然已經配置好URL Schemes,那麼我們可以來款速測試一下,我們設定的URL Schemes是否有效。開啟Safari,在地址欄裡輸入:xxxx://
也可以在地址欄中輸入:xxxx://com.yyyy.www。也是可以開啟註冊了URL Schemes的APP的。
二、通過URL Scheme啟動APP並且傳遞參數
1.URL傳參格式
假設我們想要傳遞兩個參數分別是名字name和手機號phone,格式如下:xxxx://?name=aaa&phone=13888888888
2.被啟動的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的地址欄中輸入:xxxx://?name=aaa&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;
}
}
三、如何通過一個app啟動註冊了URL Schemes的另一個app呢?
NSString *url = @"xxxx://";
// NSString *url = @"xxxx://com.yyyy.www";
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:url]])
{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}
else
{
NSLog(@"can not open URL scheme xxxx");
}
開啟註冊xxxx的APP格式為: URL Scheme://URL identifier,直接調用URL Scheme也可開啟程式, URL identifier是可選的。
iOS URL Scheme