文档章节

注册URL Scheme

 北方人在上海
发布于 2016/11/22 12:11
字数 1371
阅读 44
收藏 1

我们都知道苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的。但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app之间互相调用而设计的。我们可以通过系统的OpenURL来打开该app,并可以传递一些参数。

例如:你在Safari里输入www.alipay.com,就可以直接打开你的支付宝app,前提是你的手机装了支付宝。如果你没有装支付宝,应该显示的是支付宝下载界面,点击会跳到AppStore的支付宝下载界面。

URL Scheme必须能唯一标识一个APP,如果你设置的URL Scheme与别的APP的URL Scheme冲突时,你的APP不一定会被启动起来。因为当你的APP在安装的时候,系统里面已经注册了你的URL Scheme。

一般情况下,是会调用先安装的app。但是iOS的系统app的URL Scheme肯定是最高的。所以我们定义URL Scheme的时候,尽量避开系统app已经定义过的URL Scheme。

注册URL Scheme

1.在info.plist里添加URL types

每一个项目里面都会有一个info.plist配置文件。找到info.plist,右键选择Add Row,然后选择URL types。如图所示:

 

 

 

2.添加URL Schemes

添加完URL types,点击展开。右键选择Add Row,添加URL Schemes:

 

 

 

 

3.设置URL Schemes

设置URL Schemes为iOSDevTip

 

4.设置URL Identifier

URL Identifier是自定义的 URL scheme 的名字,一般采用反转域名的方法保证该名字的唯一性,比如 com.iOSStrongDemo.www

 

添加成功启动提示

为了方便测试,我们在AppDelegate里面添加一个UIAlertView,当app被成功打开时,会提出提示:

 

复制代码

代码如下:

 

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

}

 

Safari启动自定义的URL Schemes APP

既然已经配置好URL Schemes,那么我们可以来款速测试一下,我们设置的URL Schemes是否有效。打开Safari,在地址栏里输入:iOSDevTip://

 

 

 

果然成功打开:

 

 

 

也可以在地址栏中输入:iOSDevTip://com.iOSStrongDemo.www。也是可以打开注册了URL Schemes的APP的。

通过另一个APP启动注册了URL Schemes的APP

复制代码

代码如下:

 

 NSString *url = @"iOSDevTip://";

//    NSString *url = @"iOSDevTip://com.iOSStrongDemo.www";

if ([[UIApplication sharedApplication]

     canOpenURL:[NSURL URLWithString:url]])

{

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];

}

else

{

    NSLog(@"can not open URL scheme iOSDevTip");

}

 

打开注册iOSDevTip的APP格式为: URL Scheme://URL identifier,直接调用URL Scheme也可打开程序, URL identifier是可选的。

 

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

昨天我们在iOSStrongDemo注册的URL Scheme还记得是什么吗?你应该还有印象的就是iOS开发的ID:iOSDevTip。

假设我们想要传递两个参数分别是名字name和手机号phone,格式如下:

?

1

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

 

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

 

最后我们看一下打印:

?

1

2

3

2015-07-15 22:38:25.655 iOSStrongDemo[9983:2894855] sourceApplication: com.apple.mobilesafari

2015-07-15 22:38:28.664 iOSStrongDemo[9983:2894855] URL scheme:iosdevtip

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

    }

}

 

这样我们就可以通过Bundle ID来决定是否允许打开我们的APP。

© 著作权归作者所有

粉丝 22
博文 187
码字总数 265578
作品 0
浦东
私信 提问
Custom URL scheme for iOS与Android需要注意的地方

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

长平狐
2012/08/13
3K
0
自定义 URL Scheme - 用于从浏览器或其他应用中启动本应用。

注册自定义 URL Scheme 注册自定义 URL Scheme 的第一步是创建 URL Scheme — 在 Xcode Project Navigator 中找到并点击工程 info.plist 文件。当该文件显示在右边窗口,在列表上点击鼠标右键...

FTD_SL
2016/10/10
67
0
【quickhybrid】H5和Native交互原理

前言 架构的核心就是交互,而实现这个交互的前提是弄清楚H5和Native端的交互 本文主要介绍Native端(Android/iOS)和H5端(泛指前端)的交互原理 (之前也整理过类似的文章,本系列重新梳理)...

dailc
02/18
0
0
Android Studio 第六十四期 - Android业务组件化之URL Scheme使用

什么是 URL Scheme? android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉...

吴雨声
2018/07/18
0
0
Deep Link及相关第三方库调研

背景说明 通知相关的页面跳转POCT项目处于后台状态,服务器发推信息到客户端,客户端在通知栏点击消息,进入App并跳转到具体的消息页面。现阶段接收的通知包含:系统消息、个人消息、春雨、七...

sycasl
2017/11/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用递归打印乘法表

一般我们在学for循环的时候都会去打印九九乘法表,但是如果是用递归的方式打印的话,应该怎么做呢? 下面讲解一下用递归打印九九乘法表的思路: 其实我们在用for循环打印乘法表的时候,用的是...

INEVITABLE
19分钟前
5
0
sql 练习

创建需要的4张表 首先创建student、course、score、teacher这四张表。 student表 创建student表 CREATE TABLE IF NOT EXISTS student(sno TINYINT UNSIGNED NOT NULL,sname VARCHAR(20......

Garphy
20分钟前
7
0
vSphere的两种虚拟交换机

VMware vSphere 6.7中支持两种虚拟交换机: 1、标准交换机,VSS - Virtual Standard Switch 2、分布式交换机,VDS - Virtual Distributed Switch VSS与ESXi主机一一对应,即一个VSS只能部署在...

大别阿郎
22分钟前
5
0
webGL和three.js的关系

本文转载于:专业的前端网站➤webGL和three.js的关系 如今浏览器的功能越来越强大,而且这些功能可能通过JavaScript直接调用。你可以用HTML5标签轻松地添加音频和视频,而且可以在HTML5画布上...

前端老手
50分钟前
7
0
Spring如何实现AOP,请不要再说cglib了!

1. 从注解入手找到对应核心类 最近工作中我都是基于注解实现AOP功能,常用的开启AOP的注解是@EnableAspectJAutoProxy,我们就从它入手。 上面的动图的流程的步骤就是: @EnableAspectJAutoPr...

温安适
52分钟前
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部