标签:
目的:通过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是可选的。
标签:
原文地址:http://www.cnblogs.com/tongyuling/p/4651842.html