APP调用Custom URL Scheme

标签: iOS开发 | 发表时间:2016-02-18 23:45 | 作者:风雨雷电堂
出处:http://www.blogread.cn/it/

标签:   Scheme   跳转

Custom URL scheme 的好处就是,你可以在其它程序中通过这个url打开应用程序。如A应用程序注册了一个url scheme:myApp,  那么就在mobile浏览器中就可以通过<href=’myApp://’>打开你的应用程序A。

Android

首先在AndroidManifast.xml要被指定Scheme的Activity下设置如下参数

<intent-filter>  
  <category android:name="android.intent.category.DEFAULT"></category>  
  <action android:name="android.intent.action.VIEW"></action>  
  <data android:scheme="mgtv"></data>  
</intent-filter>  

这样即指定了接收Uri的Scheme为 mgtv 且 Action为View的Intent。

利用如下Intent调用Activity

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("mgtv://?action=play&data=12345")));

或在浏览器中调用A链接打开

<a href="mgtv://?action=play&data=12345">打开你的应用程序</a>

在接收的Activity中使用如下代码获得数据

//获得Scheme名称  
this.getIntent().getScheme();
//获得Uri全部路径
this.getIntent().getDataString();

iOS

  • 如果没有URL types,随意点一个key行后面+号,输入大写URL选择URL types

  • 右键URL types,选择add row

  • item0下改成url identifier,后面的value值随意写,com.xx,xx

  • 加一行,选择url schemes,item后面值写成你需要的,譬如上面的todolist

在其他应用里就可以用以下语句启动你的app

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"todolist://"]];

在自定义了 URL scheme 的应用中,app delegate 必须实现以下方法:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
                                       sourceApplication:(NSString *)sourceApplication
                                              annotation:(id)annotation

例如,假设我们使用以下的 URL scheme,我们可以像这样创建一个 URL:

NSString *customURL = @"mgtv://?action=play&data=12345";

在 web 开发中,字符串 ?action=play&data=12345 被称作查询询串(query string)。

在被调用(设置了自定义 URL)的应用的 app delegate 中,获取参数的代码如下:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
                                       sourceApplication:(NSString *)sourceApplication
                                              annotation:(id)annotation
{
  NSLog(@"Calling Application Bundle ID: %@", sourceApplication);
  NSLog(@"URL scheme:%@", [url scheme]);
  NSLog(@"URL query: %@", [url query]);

  return YES;
}

以上代码在应用被调用时的输出为:

Calling Application Bundle ID: com.hunantv.app
URL scheme:mgtv
URL query: action=play&data=12345

额外功能

果处理成功的Scheme如包含了TestBAPP://callsuccess,那么说明你调用其他的APP成功了。如果不是,那么说明是别的APP如TestAAPP调用了你的APP,此时在你的APPDelegate里面添加如下函数以及实现处理,这里是直接返回告诉TestAAPP调用成功的标识TestAAPP://callsuccess:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url  
{  
    // Do something with the url here  
    if (!url)  
    {  
        return NO;  
    }  
    NSString *handleUrl = [url absoluteString];  
    if ([handleUrl isEqualToString:@"TestBApp://callsuccess"]) {  
        return YES;  
    }else{  
        NSString *urlstr = @"TestAAPP:/com.baidu.sidepath.TestA&_callback=TestAApp://callsuccess";  
        NSURL *handlbackeUrl = [NSURL URLWithString:urlstr];  
        [[UIApplication sharedApplication] openURL:handlbackeUrl];  

    }
}  

如果你不想直接返回callback,而是想启动一个页面那么,此时要考虑你的应用是否已经启动,可以如下判断使用:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url  
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{  
    NSString *handleUrl = [url absoluteString];  
    if ([handleUrl isEqualToString:@"TestBApp://callsuccess"]) {  
        return YES;  
    }else{  
        UINavigationController *vc = (UINavigationController *)_window.rootViewController;  
        if (vc == nil) {  
            PathViewController *controller = [[PathViewController alloc] initWithNibName:@"PathViewController" bundle:nil];  

            self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];  
            self.mUINavigationController = [[UINavigationController alloc] init];  


            [self.mUINavigationController pushViewController:controller animated:YES];  
            [self.window addSubview:self.mUINavigationController.view];  


            // Override point for customization after application launch.  
            self.window.backgroundColor = [UIColor whiteColor];  
            [self.window makeKeyAndVisible];  
        }  
        return YES;  
    }
  }

也就是把appdelegate里面的didFinishLaunchingWithOptions初始化app的代码拷贝进去。此时会启动PathViewController这个页面。然后在这个页面里面可以添加一个返回按钮来返回到调用APP。

再次 在TestAAPp里面使用URl Scheme调起你的APP

- (void)buttonPressed:(UIButton *)button
{
  NSString *customURL = @"mgtv://play/12345";

  if ([[UIApplication sharedApplication]
    canOpenURL:[NSURL URLWithString:customURL]])
  {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
  }
  else
  {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL error"
                          message:[NSString stringWithFormat:
                            @"No custom URL defined for %@", customURL]
                          delegate:self cancelButtonTitle:@"Ok"
                          otherButtonTitles:nil];
    [alert show];
  }
}

查看更多苹果官方资料:

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/Reference/Reference.html

其他

iOS与Android在这儿有点小区别,在iOS中如果系统注册了url scheme且安装了那个应用程序,通过上面那种网页的方式就可以启动应用程序,如果没有注册或没有安装那个应用程序,就没有任何效果(你注册的url scheme不能是http://xxx 这样的)。

在Android系统中注册了url scheme且安装了那个应用程序,通过上面那种网页的方式就可以启动应用程序,如果没有注册或没有安装那个应用程序,就没有任何效果;如果注册了是http://xxx这样的,就会弹了一个对话框让你选,是打开网页还是程序。

iOS中不能注册http://xxx这样的url scheme,而Android是可以的。

您可能还对下面的文章感兴趣:

  1. 安卓第三方应用调起常见问题 [2016-02-16 20:53:22]
  2. 苹果iOS系统下检查第三方APP是否安装及跳转启动 [2016-02-16 20:32:38]
  3. .htaccess的301跳转 [2009-12-09 16:45:58]

相关 [app custom url] 推荐:

APP调用Custom URL Scheme

- - IT技术博客大学习
标签:   Scheme   跳转. Custom URL scheme 的好处就是,你可以在其它程序中通过这个url打开应用程序. 如A应用程序注册了一个url scheme:myApp,  那么就在mobile浏览器中就可以通过打开你的应用程序A. 首先在AndroidManifast.xml要被指定Scheme的Activity下设置如下参数.

URL的井号

- chenqj - 阮一峰的网络日志
一个显著变化,就是URL加入了"#!"符号. 在我印象中,这是主流网站第一次将"#"大规模用于直接与用户交互的关键URL中. 这表明井号(Hash)的作用正在被重新认识. 本文根据HttpWatch的文章,整理与井号有关的所有重要知识点. 其右面的字符,就是该位置的标识符. 就代表网页index.html的print位置.

将URL编码?

- - JavaScript - Web前端 - ITeye博客
    URL一般只能由字母、数字、$ - _. * ' ( ) 等一些字符构成. 那么当URL中需要用到汉字时怎么办,譬如有这样的URL: "www.test.com/search?name=张三",此时,只有通过将URL进行编码的方式进行传递了.     Javascript编/解码方法:.     如果对上面的URL(www.test.com/search?name=张三)进行编码的话.

理清URL编码

- winners - Thinking for Fun
关于URL编码,RFC1738做了如下的规定:. “Only alphanumerics [0-9a-zA-Z], the special characters “$-_.+!*’(),” [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL.”.

iOS UIWebView URL拦截

- - 移动开发 - ITeye博客
本文译者: candeladiao,原文: URL filtering for UIWebView on the iPhone. 说明:译者在做app开发时,因为页面的javascript文件比较大导致加载速度很慢,所以想把javascript文件打包在app里,当UIWebView需要加载该脚本时就从app本地读取,但UIWebView并不支持加载本地资源.

URL最大长度问题

- - CSDN博客推荐文章
这几天为解决一个BUG头疼了一段时间,BUG现象如下:. 一个选择人员的选择控件,当选择多个人时(50多个的时候),返回没有错误现象,而再一次打开的时候就报404错误. 看到这个错误非常纳闷,无法下手,只能再一次看控件的代码,在详细看代码时,发现所有的参数都是经过URL传参的,赶紧百度一下URL参数的大小限制(从这个百度开始,我就进入一个误区:参数大小的限制).

URL中井号的作用

- - CSDN博客Web前端推荐文章
  URL中的井号(#)是比较常见的,它并不影响网址的指向,而是有众多功能和特点的. 下面就为大家介绍一些有关井号的故事.   1、页面中的某一个位置可以用井号在URL中指定.   井号作为比较长出现在URL的一种符号,通常也会代表这个页面中的某一个位置,比如:http://aoshu.juren.com/chzt/xiaoxueshijuan/index.html#nn1,此URL表示在这个页面中nn1的位置.

将URL直接下载到Dropbox

- zjk - 煎蛋
URL Droplet是一个dropbox app,只要填你要下载的URL进去,它就会自动将之下载到你的Dropbox里. 虽说直接下载到Dropbox文件夹里也很方便,不过这不就多出来一个上传到云的多余过程么. 网络速度快的同学们可能没感觉,不过对于网络蜗牛爬的同学们来说一定深有感触吧. //Dropbox真的是个非常好用的服务,由于他们开放了API,所以有很多Dropbox app可以使用,比如效果华丽的在线相册什么的,很有用.

Web开发:URL编码与解码

- - 搜索引擎技术博客
通常如果一样东西需要编码,说明这样东西并不适合传输. 原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义. 例如Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8. 如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码.