自定义 URL Scheme 彻底指南

 

本文由 Migrant 翻译自 The Complete Tutorial on iOS/iPhone Custom URL Schemes,转载请注明出处。html

注意自从自定义 URL 的引入,本文始终是我博客中阅读量最大的文章。虽然大多数都相同,但仍然有一些细微差异的变化。本文是原帖的重写版,更新为最新的 iOS 和 Xcode 版本。ios

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

注册自定义 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.yourAppapp

urlScheme2a

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

iOS Custom URL Scheme

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

iOS Custom URL Scheme

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

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,咱们能够运行一个快速测试来验证应用是否如咱们所指望的被调用。

iOS App with Custom URL

使用模拟器调用应用的步骤:

  • 在 Xcode 中运行应用
  • 一旦应用被安装,自定义 URL scheme 就会被注册
  • 经过模拟器的硬件菜单中选择 Home 来关闭应用
  • 启动 Safari
  • 在浏览器地址栏输入以前定义的 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
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
- (void)buttonPressed:(UIButton *)button {  NSString *customURL = @"iOSDevTips://";   if ([[UIApplication sharedApplication]  canOpenURL:[NSURL URLWithString:customURL]])  {  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];  }  else  {  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL error"  message:[NSString stringWithFormat:  @"No custom URL defined for %@", customURL]  delegate:self cancelButtonTitle:@"Ok"  otherButtonTitles:nil];  [alert show];  } } 

第 5 行代码检查自定义 URL 是否被定义,若是定义了,则使用 shared application 实例来打开 URL (第 8 行)。openURL: 方法启动应用并将 URL 传入应用。在此过程当中,当前的应用被退出。

经过自定义 URL Scheme 向应用传递参数

有时你须要经过自定义 URL 向应用中传递参数。让咱们看看该如何完成这个工做。

NSURL 做为从一个应用调用另外一个的基础,遵循 RFC 1808 (Relative Uniform Resource Locators) 标准。 所以你所熟悉的基于网页内容的 URL 格式在这里也适用。

在自定义了 URL scheme 的应用中,app delegate 必须实现如下方法:

1
2 3 4 
- (BOOL)application:(UIApplication *)application  openURL:(NSURL *)url  sourceApplication:(NSString *)sourceApplication  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
2 3 4 5 6 7 8 9 
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {  NSLog(@"Calling Application Bundle ID: %@", sourceApplication);  NSLog(@"URL scheme:%@", [url scheme]);  NSLog(@"URL query: %@", [url query]);   return YES; } 

以上代码在应用被调用时的输出为:

1
2 3 
Calling Application Bundle ID: com.3Sixty.CallCustomURL URL scheme:iOSDevTips URL query: token=123abct&registered=1 

注意 “Calling Application Bundle ID”,你能够用这个来确保只有你定义的应用能够与你的应用直接交互。

让咱们改变一下代码,来验证发起调用的应用的 Bundle ID 是否合法:

1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {  // Check the calling application Bundle ID  if ([sourceApplication isEqualToString:@"com.3Sixty.CallCustomURL"])  {  NSLog(@"Calling Application Bundle ID: %@", sourceApplication);  NSLog(@"URL scheme:%@", [url scheme]);  NSLog(@"URL query: %@", [url query]);   return YES;  }  else  return NO; } 

有一点要特别注意,你不能阻止其余应用经过自定义 URL scheme 调用你的应用,然而你能够跳事后续的操做并返回 NO,就像上面的代码那样。也就是说,若是你想阻止其它应用调用你的应用,建立一个不同凡响的 URL scheme。尽管这不能保证你的应用不会被调用,但至少大大下降了这种可能性。

相关文章
相关标签/搜索