自定义 URL 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”
使用模拟器调用应用的步骤:
1. 在 Xcode 中运行应用
2. 一旦应用被安装,自定义 URL scheme 就会被注册
3. 经过模拟器的硬件菜单中选择 Home 来关闭应用
4. 启动 Safari
5. 在浏览器地址栏输入以前定义的 URL scheme(以下)
此时 Safari 将会关闭,应用会被带回到前台。祝贺你刚刚使用自定义 URL scheme 调用了一个 iPhone 应用。
 
从另外一个 iPhone 应用中调用自定义 URL Scheme
让咱们看看如何从另外一个应用中调用自定义 URL scheme。我又建立了一个很是简单的 iPhone 应用,它只有一个 UILabel 和一个 UIButton — 前者显示了一段信息,告诉你这个应用将要经过自定义 URL scheme 来调用另外一个应用,按钮则开始这个行为
buttonPressed 方法中的代码处理 URL 调用: 
  1. - (void)buttonPressed:(UIButton *)button 
  2.   NSString *customURL = @"iOSDevTips://"; 
  3.  
  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.   } 
 
第 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.   NSLog(@"Calling Application Bundle ID: %@", sourceApplication); 
  4.   NSLog(@"URL scheme:%@", [url scheme]); 
  5.   NSLog(@"URL query: %@", [url query]); 
  6.  
  7.   return YES; 
 
以上代码在应用被调用时的输出为: 
  1. Calling Application Bundle ID: com.3Sixty.CallCustomURL 
  2. URL scheme:iOSDevTips 
  3. URL query: token=123abct&registered=1

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

让咱们改变一下代码,来验证发起调用的应用的 Bundle ID 是否合法: 
  1. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
  2.         sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
  3.   // Check the calling application Bundle ID 
  4.   if ([sourceApplication isEqualToString:@"com.3Sixty.CallCustomURL"]) 
  5.   { 
  6.     NSLog(@"Calling Application Bundle ID: %@", sourceApplication); 
  7.     NSLog(@"URL scheme:%@", [url scheme]); 
  8.     NSLog(@"URL query: %@", [url query]); 
  9.  
  10.     return YES; 
  11.   } 
  12.   else 
  13.     return NO; 
 
有一点要特别注意,你不能阻止其余应用经过自定义 URL scheme 调用你的应用,然而你能够跳事后续的操做并返回 NO,就像上面的代码那样。也就是说,若是你想阻止其它应用调用你的应用,建立一个不同凡响的 URL scheme。尽管这不能保证你的应用不会被调用,但至少大大下降了这种可能性。
相关文章
相关标签/搜索