iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用。
 
注册自定义 URL Scheme
注册自定义 URL Scheme 的第一步是创建 URL Scheme — 在 Xcode Project Navigator 中找到并点击工程 info.plist 文件。当该文件显示在右边窗口,在列表上点击鼠标右键,选择 Add Row:
 
向下滚动弹出的列表并选择 URL types。
iOS Custom URL Scheme
 
点击左边剪头打开列表,可以看到 Item 0,一个字典实体。展开 Item 0,可以看到 URL Identifier,一个字符串对象。该字符串是你自定义的 URL scheme 的名字。建议采用反转域名的方法保证该名字的唯一性,比如 com.yourCompany.yourApp。
urlScheme2a
 
点击 Item 0 新增一行,从下拉列表中选择 URL Schemes,敲击键盘回车键完成插入。 
iOS Custom URL Scheme
 
注意: URL Schemes 是一个数组,允许应用定义多个 URL schemes。 
iOS Custom URL Scheme
 
展开该数据并点击 Item 0。你将在这里定义自定义 URL scheme 的名字。只需要名字,不要在后面追加 :// — 比如,如果你输入 iOSDevApp,你的自定义 url 就是 iOSDevApp:// 
iOS Custom URL Scheme
 
此时,整个定义如下图: 
iOS Custom URL Scheme
 
虽然我赞同 Xcode 使用描述性的名字的目的,不过看到创建的实际的 key 也是非常有用的。这里有一个方便的技巧,右键点击 plist 并选择 Show Raw Keys/Values,就能看到以下效果: 
iOS Custom URL Scheme
 
还有另一种有用的输出格式,XML,因为可以非常容易的看到字典和原始数组及其包括的实体的结构。点击 plist 并选择 Open As – Source Code: 
iPhone Custom URL Scheme
 
从 Safari 中调用自定义 URL Scheme
定义了 URL scheme,我们可以运行一个快速测试来验证应用是否如我们所期望的被调用。在这之前,我创建了一个准 UI 以辨别带有自定义 URL 的应用。该应用只有一个 UILabel,带有文本 “App With Custom URL”(下载源代码)。 
iOS App with Custom URL
  
使用模拟器调用应用的步骤:
1. 在 Xcode 中运行应用
2. 一旦应用被安装,自定义 URL scheme 就会被注册
3. 通过模拟器的硬件菜单中选择 Home 来关闭应用
4. 启动 Safari
5. 在浏览器地址栏输入之前定义的 URL scheme(如下) 
Call Custom URL Scheme from Safari
 
此时 Safari 将会关闭,应用会被带回到前台。祝贺你刚刚使用自定义 URL scheme 调用了一个 iPhone 应用。
 
从另一个 iPhone 应用中调用自定义 URL Scheme
让我们看看如何从另一个应用中调用自定义 URL scheme。我又创建了一个非常简单的 iPhone 应用,它只有一个 UILabel 和一个 UIButton — 前者显示了一段信息,告诉你这个应用将要通过自定义 URL scheme 来调用另一个应用,按钮则开始这个行为(下载源代码)。 
iPhone app that call Custom URL Scheme
  
buttonPressed 方法中的代码处理 URL 调用: 
  1. - (void)buttonPressed:(UIButton *)button
  2. {
  3. NSString *customURL = @"iOSDevTips://";
  4. if ([[UIApplication sharedApplication]
  5. canOpenURL:[NSURL URLWithString:customURL]])
  6. {
  7. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
  8. }
  9. else
  10. {
  11. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL error"
  12. message:[NSString stringWithFormat:
  13. @"No custom URL defined for %@", customURL]
  14. delegate:self cancelButtonTitle:@"Ok"
  15. otherButtonTitles:nil];
  16. [alert show];
  17. }
  18. }
 
第 5 行代码检查自定义 URL 是否被定义,如果定义了,则使用 shared application 实例来打开 URL (第 8 行)。openURL: 方法启动应用并将 URL 传入应用。在此过程中,当前的应用被退出。
 
通过自定义 URL Scheme 向应用传递参数
有时你需要通过自定义 URL 向应用中传递参数。让我们看看该如何完成这个工作。
NSURL 作为从一个应用调用另一个的基础,遵循 RFC 1808 (Relative Uniform Resource Locators) 标准。 因此你所熟悉的基于网页内容的 URL 格式在这里也适用。
 
在自定义了 URL scheme 的应用中,app delegate 必须实现以下方法: 
  1. - (BOOL)application:(UIApplication *)application
  2. openURL:(NSURL *)url
  3. sourceApplication:(NSString *)sourceApplication
  4. annotation:(id)annotation
  
从一个应用传递参数到另一个的诀窍是通过 URL。例如,假设我们使用以下的 URL scheme,想传递一个名为 “token”的参数和一个标识注册状态的标志,我们可以像这样创建一个 URL: 
  1. NSString *customURL = @"iOSDevTips://?token=123abct&registered=1";
 
在 web 开发中,字符串 ?token=123abct&registered=1 被称作查询询串(query string)。
 
在被调用(设置了自定义 URL)的应用的 app delegate 中,获取参数的代码如下: 
  1. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  2. sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
  3. {
  4. NSLog(@"Calling Application Bundle ID: %@", sourceApplication);
  5. NSLog(@"URL scheme:%@", [url scheme]);
  6. NSLog(@"URL query: %@", [url query]);
  7. return YES;
  8. }
 
以上代码在应用被调用时的输出为: 
  1. Calling Application Bundle ID: com.3Sixty.CallCustomURL
  2. URL scheme:iOSDevTips
  3. URL query: token=123abct&registered=1
 
注意 “Calling Application Bundle ID”,你可以用这个来确保只有你定义的应用可以与你的应用直接交互。
 
让我们改变一下代码,来验证发起调用的应用的 Bundle ID 是否合法: 
  1. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  2. sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
  3. {
  4. // Check the calling application Bundle ID
  5. if ([sourceApplication isEqualToString:@"com.3Sixty.CallCustomURL"])
  6. {
  7. NSLog(@"Calling Application Bundle ID: %@", sourceApplication);
  8. NSLog(@"URL scheme:%@", [url scheme]);
  9. NSLog(@"URL query: %@", [url query]);
  10. return YES;
  11. }
  12. else
  13. return NO;
  14. }
 
有一点要特别注意,你不能阻止其他应用通过自定义 URL scheme 调用你的应用,然而你可以跳过后续的操作并返回 NO,就像上面的代码那样。也就是说,如果你想阻止其它应用调用你的应用,创建一个与众不同的 URL scheme。尽管这不能保证你的应用不会被调用,但至少大大降低了这种可能性。
 
 
 
 

【读书笔记】iOS-自定义 URL Scheme 完全指南的更多相关文章

  1. iOS 自定义 URL Scheme 完全指南

    http://www.cocoachina.com/industry/20140522/8514.html “”   阅读器 自定义URL Scheme 本文转自Migrant的博客,原文:<T ...

  2. 自定义 URL Scheme 完全指南

    本文由 Migrant 翻译自 The Complete Tutorial on iOS/iPhone Custom URL Schemes,转载请注明出处. 注意: 自从自定义 URL 的引入,本文 ...

  3. 自定义 URL Scheme 完全指南(转载)

    iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用. 注册自定义 URL Scheme ...

  4. 自定义URL Scheme完全指南

    iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用. 注册自定义 URL Scheme ...

  5. ios 自定义URL Scheme 设计

    在 iOS 里,程序之间都是相互隔离,目前并没有一个有效的方式来做程序间通信,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个 ...

  6. iOS App 自定义 URL Scheme 设计(转自COCOACHINA)

    在 iOS 里,程序之间都是相互隔离,目前并没有一个有效的方式来做程序间通信,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个 ...

  7. iOS:URL Scheme(完结)(18-1-3更)

    1.APP跳转 2.APP功能跳转 3.系统功能跳转 1.APP跳转 1.被打开方 设置APP的URL Types(设置位置在 “项目 - TARGETS - APP icon - info - (拉 ...

  8. iOS app url scheme跳转到淘宝商品详情页 唤醒app

    最近涉及的一个业务,在app内的一个广告,点击打开webView,加载的是一个淘宝商品详情页,效果是打开该webView自动跳转至淘宝对应的页面,同时在自己的app仍然加载页面,点击评论等也同样能跳转 ...

  9. iOS 禁用`URL Scheme`和`Universal Link`(通用链接)

    为什么要禁用URL Scheme和Universal Link(通用链接) 通常我们APP中都会嵌套一些web页面,有时我们的web页面会被DNS劫持从而跳转到其他APP中:或者是某些APP的Univ ...

随机推荐

  1. XXE(XML External Entity attack)XML外部实体注入攻击

    导语 XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击.由于程序在解析输入的XML数据时,解析了攻击者 ...

  2. 第二十二节:Java语言基础-详细讲解位运算符与流程控制语句

    位运算符(二进制位运算) 运算符 运算 例子 << 左移 3 << 2 = 12 --> 3 * 2 * 2 =12 >> 右移 3 >> 1 = ...

  3. WCF绑定netTcpBinding寄宿到控制台应用程序

    契约 新建一个WCF服务类库项目,在其中添加两个WCF服务:GameService,PlayerService 代码如下: [ServiceContract] public interface IGa ...

  4. 【sping揭秘】21、Spring动态数据源的切换

    对于多个数据源的时候,我们如何切换不同的数据源进行数据库的操作呢? 当然我们可以直接定义2个DataSource,然后在每次获取connection的时候,从不同的DataSource中获取conne ...

  5. 使用First查找集合报错:序列不包含任何匹配元素

    原因其实是很简单的: 使用First代表一定能找到,找不到就抛出异常,必须使用try……catch……进行异常的捕获. 推荐使用  FirstOrDefault 或Find 取序列中满足条件的第一个元 ...

  6. oracle新建用户并授权步凑

    #首先创建表空间.存放路径.设置表空间大小 create tablespace tbs_ams datafile '+DATA/pdorcl1/datafile/ams1.dbf' size 1024 ...

  7. Python解析HDF文件 分类: Python 2015-06-25 00:16 743人阅读 评论(0) 收藏

    前段时间因为一个业务的需求需要解析一个HDF格式的文件.在这之前也不知道到底什么是HDF文件.百度百科的解释如下: HDF是用于存储和分发科学数据的一种自我描述.多对象文件格式.HDF是由美国国家超级 ...

  8. Windows抓屏技术

    Windows桌面共享中一些常见的抓屏技术 1. BitBlt   我想做Windows开发应该都知道这个API, 它能实现DC间的内容拷贝, 如果我们把源DC指定成Monitor DC或是桌面DC, ...

  9. 高性能、高可用性Socket通讯库介绍 - 采用完成端口、历时多年调优!(附文件传输程序)

    前言 本人从事编程开发十余年,因为工作关系,很早就接触socket通讯编程.常言道:人在压力下,才可能出非凡的成果.我从事的几个项目都涉及到通讯,为我研究通讯提供了平台,也带来了动力.处理socket ...

  10. Java第三方支付接入案例(支付宝)

    开源项目链接 Kitty 开源权限管理系统 项目地址:https://gitee.com/liuge1988/kitty 演示地址:http://139.196.87.48:9002/kitty 用户 ...