URL-Schemes深度剖析(上)

一、引言php

URL Schemes 应用在 iOS 上已经好久了。对于使用者来讲,在沙盒机制下的 iOS 中,若是想作到必定程度上的自动化就不可避免地要用到 URL Schemes。但由于 URL Schemes 的使用方式不像传统 iOS 使用者接触到的图形界面那样能够直观地点来点去,形成了对它有兴趣的人(尤为是对英文有恐惧的人)必定程度上理解的困难。数组

二、简介苹果的沙盒机制浏览器

苹果选择沙盒来保障用户的隐私和安全,但沙盒也阻碍了应用间合理的信息共享,因而有了 URL Schemes 这个解决办法。安全

通常来讲,咱们使用的智能设备上有许多咱们的我的信息。好比:联系方式、银行卡/信用卡信息、支付宝/Paypal/各大商城的帐户密码、照片甚至行程与位置信息等。bash

若是说,你设备上的每个应用,不论是官方的仍是你从任何商城安装的应用均可以随意地获取这些信息,那么你轻则收到骚扰信息和邮件、重则后果不堪设想。如何让这些信息不被其它应用随意使用,或者说,如何让这些信息仅在设备全部者本人知情并容许的状况下被使用,是全部智能设备与操做系统所要在意的核心安全问题。微信

在 iOS 这个操做系统中,针对这个问题,苹果使用了名为「沙盒」的机制:应用只能访问它声明可能访问的资源。一切提交到 App Store 的应用都必须遵照这个机制。app

在安全方面沙盒是个很好的解决办法,可是有些矫枉过正。敏感的我的信息咱们不肯意透露,却不表明全部的信息咱们都不想与其它应用共享。ide

好比说咱们要一次性地(没错,只按一次)把多个事件放到日历中,这些事件包含日期时间以及持续时间等信息,若是 App 之间信息不能沟通,就没法作到这点。(在下文中的 x-callback-URL 的部分会详述整个过程)工具

相似于一次性添加多个日历事件这样的,咱们在使用智能设备的过程当中会遇到不少没必要要的重复的步骤。大多数人对这些重复的步骤是不自觉的,就像当本身电脑里有一批文件须要批量重命名的时候,他们机械地重复着重命名的过程。可是当咱们掌握了这些设备运行的模式,或者有了一些工具,咱们就能将这些重复的步骤所有节省下来。在 iOS 上,咱们能够利用的工具就是 URL Schemes。post

三、URL Schemes 是什么

Custom URL scheme 的好处就是,你能够在其它程序中经过这个url打开应用程序。如A应用程序注册了一个url scheme:myApp, 那么就在mobile浏览器中就能够经过打开你的应用程序A。

对比网页url就比较好理解url scheme。给出一个url “http://bxu2359670321.my3w.com/view/login.php”,它的格式:protocol :// hostname[:port] / path / [;parameters][?query]#fragment。 所以这个url的protocol就是http。对比URL Scheme,给出例子“weixin://dl/moments“,前面的weixin:就表明微信的scheme。你能够彻底按照理解一个网页的 URL ——也就是它的网址——的方式来理解一个 iOS 应用的 URL。即Scheme是://以前的那段字符

注意

一、全部的网页都有url;但未必全部的应用都有本身的 URL Schemes,更不是每一个应用的每一个功能都有相应的 URL Schemes

二、一个网址只对应一个网页,但并不是每一个 URL Schemes 都只对应一款应用。这点是由于苹果没有对 URL Schemes 有不容许重复的硬性要求

三、通常网页的 URL 比较好预测,而 iOS 上的 URL Schemes 由于没有统一标准,因此很是难猜,经过猜来获取 iOS 应用的 URL Schemes 是不现实的。(我推荐将Bundle identifier反转)

上干货

一、注册自定义 URL Scheme

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

注册url scheme

2)点击左边剪头打开列表,能够看到 Item 0,一个字典实体。展开 Item 0,能够看到 URL Identifier,一个字符串对象。该字符串是你自定义的 URL scheme 的名字。建议采用反转Bundle idenmtifier的方法保证该名字的惟一性

3)点击 Item 0 新增一行,从下拉列表中选择 URL Schemes,敲击键盘回车键完成插入。(注意 URL Schemes 是一个数组,容许应用定义多个 URL schemes。)展开该数据并点击 Item 0。你将在这里定义自定义 URL scheme 的名字。只须要名字,不要在后面追加 ://

新增scheme

二、拿浏览器作简单验证

在地址栏中熟入自定的url scheme。此时必须保证该浏览器所在设备上已经安装了具备自定义url scheme的App。浏览器检验 urlscheme

三、新建Xcode工程,作个App试试看,这里我就放一个Button,点击打开url 代码。

- (IBAction)open:(id)sender {
    NSString *url = @"zhunaer://?name=lbp&age=22";
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:url]]) {
           [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
    }else{
        NSLog(@"打不开");
    }
}复制代码复制代码

结果打不开,为何? 由于在新建App的plist中没加query schemes

<key>LSApplicationQueriesSchemes</key>
<array>
<string>zhunaer</string>
</array>复制代码复制代码

四、若是须要在2个App之间传值,怎么办?能够用URL Scheme解决。

在被打开的App的Appdelegate.m中实现-(BOOL)application:(UIApplication

)application openURL:(nonnull NSURL

)url sourceApplication:(nullable NSString *)sourceApplication annotation:(nonnull id)annotation;

-(BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(nonnull id)annotation{
    NSLog(@"calling application bundle id: %@",sourceApplication);
    NSLog(@"url shceme:%@",[url scheme]);
    NSLog(@"参数:%@",[url query]);
    if ([sourceApplication isEqualToString:@"com.geek.test1"]) {
        return YES;
    }
    return NO;

}
复制代码复制代码

在须要打开第三方App的点击事件处的url处后面加上参数,相似NSString *url = @"zhunaer://?name=lbp&age=22";

注意:在URL Scheme后加?而后跟网页的url的参数同样写法。

五、如何判断是指定App打开,或者某些App不让打开咱们的App? 作了实验。

A:在须要打开第三方App的工程中将Bundle identifier改成“com.geek.test2”,其他不变

B:在被打开的App的AppDelegate.m中

-(BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(nonnull id)annotation{
    NSLog(@"calling application bundle id: %@",sourceApplication);
    NSLog(@"url shceme:%@",[url scheme]);
    NSLog(@"参数:%@",[url query]);
    if ([sourceApplication isEqualToString:@"com.geek.test1"]) {
        return YES;
    }
    return NO;
}复制代码复制代码

测序

实验结果

依旧能够打开App,即便断点走入Return NO

结论:若是你想阻止其它应用调用你的应用,建立一个不同凡响的 URL scheme。尽管这不能保证你的应用不会被调用,但至少大大下降了这种可能性。

参考:https://sspai.com/post/31500#01

来源:本文为第三方转载,若有侵权请联系小编删除。 

相关文章
相关标签/搜索