iOS URL Scheme

目的:通过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是可选的。

 

posted @ 2015-07-16 17:01  tongyuling  阅读(655)  评论(0编辑  收藏  举报