自定义 URL Scheme 完全指南(转载)
iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用。
注册自定义 URL Scheme
注册自定义 URL Scheme 的第一步是创建 URL Scheme — 在 Xcode Project Navigator 中找到并点击工程 info.plist 文件。当该文件显示在右边窗口,在列表上点击鼠标右键,选择 Add Row:
向下滚动弹出的列表并选择 URL types。

点击左边剪头打开列表,可以看到 Item 0,一个字典实体。展开 Item 0,可以看到 URL Identifier,一个字符串对象。该字符串是你自定义的 URL scheme 的名字。建议采用反转域名的方法保证该名字的唯一性,比如 com.yourCompany.yourApp。

点击 Item 0 新增一行,从下拉列表中选择 URL Schemes,敲击键盘回车键完成插入。

注意 URL Schemes 是一个数组,允许应用定义多个 URL schemes。

展开该数据并点击 Item 0。你将在这里定义自定义 URL scheme 的名字。只需要名字,不要在后面追加 :// — 比如,如果你输入 iOSDevApp,你的自定义 url 就是 iOSDevApp://

此时,整个定义如下图:

虽然我赞同 Xcode 使用描述性的名字的目的,不过看到创建的实际的 key 也是非常有用的。这里有一个方便的技巧,右键点击 plist 并选择 Show Raw Keys/Values,就能看到以下效果:

还有另一种有用的输出格式,XML,因为可以非常容易的看到字典和原始数组及其包括的实体的结构。点击 plist 并选择 Open As – Source Code:

从 Safari 中调用自定义 URL Scheme
定义了 URL scheme,我们可以运行一个快速测试来验证应用是否如我们所期望的被调用。在这之前,我创建了一个准 UI 以辨别带有自定义 URL 的应用。该应用只有一个 UILabel,带有文本 “App With Custom URL”。下载源代码

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

此时 Safari 将会关闭,应用会被带回到前台。祝贺你刚刚使用自定义 URL scheme 调用了一个 iPhone 应用。
从另一个 iPhone 应用中调用自定义 URL Scheme
让我们看看如何从另一个应用中调用自定义 URL scheme。我又创建了一个非常简单的 iPhone 应用,它只有一个 UILabel 和一个 UIButton — 前者显示了一段信息,告诉你这个应用将要通过自定义 URL scheme 来调用另一个应用,按钮则开始这个行为。下载源代码

buttonPressed 方法中的代码处理 URL 调用:
1 |
|
第 5 行代码检查自定义 URL 是否被定义,如果定义了,则使用 shared application 实例来打开 URL (第 8 行)。openURL: 方法启动应用并将 URL 传入应用。在此过程中,当前的应用被退出。
通过自定义 URL Scheme 向应用传递参数
有时你需要通过自定义 URL 向应用中传递参数。让我们看看该如何完成这个工作。
NSURL 作为从一个应用调用另一个的基础,遵循 RFC 1808 (Relative Uniform Resource Locators) 标准。 因此你所熟悉的基于网页内容的 URL 格式在这里也适用。
在自定义了 URL scheme 的应用中,app delegate 必须实现以下方法:
1 |
|
从一个应用传递参数到另一个的诀窍是通过 URL。例如,假设我们使用以下的 URL scheme,想传递一个名为 “token”的参数和一个标识注册状态的标志,我们可以像这样创建一个 URL:
1 |
|
在 web 开发中,字符串 ?token=123abct®istered=1 被称作查询询串(query string).
在被调用(设置了自定义 URL)的应用的 app delegate 中,获取参数的代码如下:
1 |
|
以上代码在应用被调用时的输出为:
1 |
|
注意 “Calling Application Bundle ID”,你可以用这个来确保只有你定义的应用可以与你的应用直接交互。
让我们改变一下代码,来验证发起调用的应用的 Bundle ID 是否合法:
1 |
|
有一点要特别注意,你不能阻止其他应用通过自定义 URL scheme 调用你的应用,然而你可以跳过后续的操作并返回 NO,就像上面的代码那样。也就是说,如果你想阻止其它应用调用你的应用,创建一个与众不同的 URL scheme。尽管这不能保证你的应用不会被调用,但至少大大降低了这种可能性。
自定义 URL Scheme 示例工程
我意识到按照本文的每一步做下来还是有一点复杂的。我做好了两个非常基础的 iOS 应用,一个自定义了 URL scheme,另一个则去调用它,并传递了一个比较短的参数列表(query string)。这些是体验自定义 URL 的很好的入门点。
- Download Xcode project for app with Custom URL scheme
- Download Xcode project for app to call custom URL scheme
其它资源
How to Properly Validate URL Parameters URL Scheme Reference Docs
自定义 URL Scheme 完全指南(转载)的更多相关文章
- 自定义 URL Scheme 完全指南
本文由 Migrant 翻译自 The Complete Tutorial on iOS/iPhone Custom URL Schemes,转载请注明出处. 注意: 自从自定义 URL 的引入,本文 ...
- 自定义URL Scheme完全指南
iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用. 注册自定义 URL Scheme ...
- iOS 自定义 URL Scheme 完全指南
http://www.cocoachina.com/industry/20140522/8514.html “” 阅读器 自定义URL Scheme 本文转自Migrant的博客,原文:<T ...
- 【读书笔记】iOS-自定义 URL Scheme 完全指南
iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用. 注册自定义 URL Sche ...
- iOS App 自定义 URL Scheme 设计(转自COCOACHINA)
在 iOS 里,程序之间都是相互隔离,目前并没有一个有效的方式来做程序间通信,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个 ...
- ios 自定义URL Scheme 设计
在 iOS 里,程序之间都是相互隔离,目前并没有一个有效的方式来做程序间通信,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个 ...
- 【读书笔记】iOS-自定义URL Scheme注意事项
如果两个不同的应用注册了同样的URL Scheme,那么后安装的应用会响应符合这种协议格式的URL. 如果你的应用的iPhone和iPad版是各自独立的(即不是Universal类型的),那么你就不应 ...
- iOS 唤起APP之URL Scheme
什么是URL Scheme 简单的说,由于苹果选择使用沙盒机制来保障用户的隐私和安全,APP只能访问自己沙盒数据,但同时也阻碍了应用间合理的信息共享.因此苹果提供了一个可以在APP之间跳转的方法:UR ...
- 通过自定义的URL Scheme启动你的App
iPhone SDK可以把你的App和一个自定义的URL Scheme绑定.该URL Scheme可用来从浏览器或别的App启动你的App. 如何响应从别的App里发给你的URL Scheme申请,由 ...
随机推荐
- float实例讲解
float实例讲解 float是个强大的属性,在实际前端开发过程中,人们经常拿它来进行布局,但有时,使用的不好,也麻烦多多啊. 比如,现在我们要实现一个两列布局,左边的列,宽度固定:右边的列,宽度自动 ...
- MySQL学习笔记十七:复制特性
一.MySQL的复制是将主数据库(master)的数据复制到从(slave)数据库上,专业一点讲就是将主数据库DDL和DML操作的二进制日志传到从库上,然后从库对这些二进制日志进行重做,使得主数据库与 ...
- CentOS 7下MySQL服务启动失败的解决思路
今天,启动MySQL服务器失败,如下所示: [root@spark01 ~]# /etc/init.d/mysqld start Starting mysqld (via systemctl): Jo ...
- Java内存模型深度解析:final--转
原文地址:http://www.codeceo.com/article/java-memory-6.html 与前面介绍的锁和Volatile相比较,对final域的读和写更像是普通的变量访问.对于f ...
- 【SQLServer】DBHelper即C#数据库底层封装
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...
- Github团队开发示例(一)
Github团队开发示例(二) 作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/6044837.html 我们可以在Github上管理自己的团队项目.团队 ...
- 微服务(Microservices)——Martin Flower【翻译】
原文是 Martin Flower 于 2014 年 3 月 25 日写的<Microservices>. 本文内容 微服务 微服务风格的特性 组件化(Componentization ) ...
- Redis命令拾遗四——集合类型(命令补充)
补充下上篇文章集合的命令. 上篇地址 博客园蜗牛 http://www.cnblogs.com/tdws/p/5785939.html SCARD Key获得执行集合中元素的数量. SDIFFSTOR ...
- [修正] Firemonkey TSelection 控件等比缩放时,左下角拉动问题
说明:TSelection 控件,当在属性 Proportional = True 为等比缩放时,拉动左下角,右上角会跟着移动. 适用:Berlin 10.1.1 (或之前版本) Firemonkey ...
- 基于Netbeans的PHPUnit单元测试环境搭建
一.配置 PHPUnit截至2015-10-16,稳定版已更新至5.0.6,要求使用PHP v5.6及以上的环境才能使用. PHPUnit的4.8系列要求在PHP v5.3.3以上环境使用. Netb ...