通过URL Scheme传递参数

来源:互联网 发布:淘宝发布类目查询 编辑:程序博客网 时间:2024/06/05 17:54

通过注册的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传参格式

假设我们想要传递两个参数分别是名字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

scheme1

即可打开APP,看看参数是否传递过来:

scheme2

最后我们看一下打印:

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;    }}

0 0
原创粉丝点击