IOS-Scheme详解

一、什么是scheme?

我们知道在ios的程序中,由于沙盒的限制,导致程序之间相互隔离,没有一个有效的办法进行相互通信。但是也不是完全不可能实现,我们可以通过scheme url来实现程序间的通信。

典型的应用就是支付宝,新浪分享,微信分享。当你在一个网页中进行浏览的时候,如果你已经安装了支付宝的话,你点击支付功能的话,就通过设置的scheme url跳转到支付宝的支付界面。

二、配置scheme

如何实现像支付宝那样的功能呢,很简单,通过在ios程序中添加自定义协议(scheme)。在你的应用中的info.plist文件中添加URL Type节点。这个节点包括:这个程序所支持的自定义协议名称,像 http、ftp 这种,一般我们可以设置为程序英文名称,像淘宝客户端中就设置了 taobao,这样 taobao:// 这个形式的 URL 就会关联到淘宝客户端的 App。
这里写图片描述

注意:亲测对于那个Identifier,目前不知道用处是什么,希望网友给出指正。url scheme 就是要你在其他程序中要回调的url。
三、使用safari或者其他程序调用你自定义的的scheme
这里写图片描述

使用模拟器调用应用的步骤:
1. 在 Xcode 中运行应用
2. 一旦应用被安装,自定义 URL scheme 就会被注册
3. 通过模拟器的硬件菜单中选择 Home 来关闭应用
4. 启动 Safari
5. 在浏览器地址栏输入之前定义的 URL scheme(如下)

这样你就可以在浏览器中通过你自定义的scheme调用你的app。

当然你也可以在另外一个app中通过你自定义的scheme调用的你的app。实现步骤:

- (void)showScheme:(UIButton *)button {
    NSString *customURL = @"iosApp://";
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:customURL]]) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];

    } else {
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Test" message:nil preferredStyle:UIAlertControllerStyleAlert];
        ....
    }
}

代码中我们可以通过检测url是不是被定义,如果定义了直接打开url,否则提示未定义。

通过自定义 URL Scheme 向应用传递参数(回调函数)
有时你需要通过自定义 URL 向应用中传递参数。让我们看看该如何完成这个工作。
NSURL 作为从一个应用调用另一个的基础,遵循 RFC 1808 (Relative Uniform Resource Locators) 标准。 因此你所熟悉的基于网页内容的 URL 格式在这里也适用。

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

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

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

说明:

(1)上面的两个函数作用是一致的只是参数不同而已,函数的返回值是BOOL,如果为YES表示可以打开,NO表示不可以打开应用程序

(2)参数可以通过[url query]来获取,比如使用的是devzeng://?token=123abct&registered=1那么通过[url query]获取到的值是token=123abct&registered=1,然后可以通过这些数据再作相应的处理.

(3)调用的应用程序的Bundle ID可以通过sourceApplication参数获取

(4)通过[url scheme]可以获取到请求的URL Scheme,比如是通过devzeng://打开的那么[url scheme]的值就是devzeng。可以通过不同的参数来判断来源的合法性

从一个应用传递参数到另一个的诀窍是通过 URL。例如,假设我们使用以下的 URL scheme,想传递一个名为 “token”的参数和一个标识注册状态的标志,我们可以像这样创建一个 URL:
第三方URL:
wb2239427625://response?id=C3316AD8-74C0-4B26-9EEF-3A6ECEBF21FF&sdkversion=2.5
在 web 开发中,字符串 ?token=123abct&registered=1 被称作查询询串(query string)。

示例:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if ([sourceApplication isEqualToString:@"com.devzeng.demo.urlscheme"])
    {
        NSLog(@"调用的应用程序的Bundle ID是: %@", sourceApplication);
        NSLog(@"URL scheme:%@", [url scheme]);
        NSLog(@"URL query: %@", [url query]);
        return YES;
    }
    else
    {
        return NO;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值