程序员人生 网站导航

iOS自定义 URL Scheme 完全指南

栏目:综合技术时间:2016-07-07 08:36:05

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

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

iPhone / iOS SDK 最酷的特性之1就是利用将其本身”绑定”到1个自定义 URL scheme 上,该 scheme 用于从阅读器或其他利用中启动本利用。

注册自定义 URL Scheme

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

向下转动弹出的列表并选择 URL types

iOS Custom URL SchemeiOS Custom URL Scheme

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

urlScheme2aurlScheme2a

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

iOS Custom URL SchemeiOS Custom URL Scheme

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

iOS Custom URL SchemeiOS Custom URL Scheme

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

iOS Custom URL SchemeiOS Custom URL Scheme

此时,全部定义以下图:

iOS Custom URL SchemeiOS Custom URL Scheme

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

iOS Custom URL SchemeiOS Custom URL Scheme

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

iPhone Custom URL SchemeiPhone Custom URL Scheme

从 Safari 中调用自定义 URL Scheme

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

iOS App with Custom URLiOS App with Custom URL

使用摹拟器调用利用的步骤:

  • 在 Xcode 中运行利用
  • 1旦利用被安装,自定义 URL scheme 就会被注册
  • 通过摹拟器的硬件菜单当选择 Home 来关闭利用
  • 启动 Safari
  • 在阅读器地址栏输入之前定义的 URL scheme(以下)

Call Custom URL Scheme from SafariCall Custom URL Scheme from Safari

此时 Safari 将会关闭,利用会被带回到前台。庆祝你刚刚使用自定义 URL scheme 调用了1个 iPhone 利用。

从另外一个 iPhone 利用中调用自定义 URL Scheme

让我们看看如何从另外一个利用中调用自定义 URL scheme。我又创建了1个非常简单的 iPhone 利用,它只有1个 UILabel 和1个 UIButton — 前者显示了1段信息,告知你这个利用将要通过自定义 URL scheme 来调用另外一个利用,按钮则开始这个行动。下载源代码

iPhone app that call Custom URL SchemeiPhone 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 作为从1个利用调用另外一个的基础,遵守 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

从1个利用传递参数到另外一个的窍门是通过 URL。例如,假定我们使用以下的 URL scheme,想传递1个名为 “token”的参数和1个标识注册状态的标志,我们可以像这样创建1个 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”,你可以用这个来确保只有你定义的利用可以与你的利用直接交互。

让我们改变1下代码,来验证发起调用的利用的 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; }

有1点要特别注意,你不能禁止其他利用通过自定义 URL scheme 调用你的利用,但是你可以跳过后续的操作并返回 NO,就像上面的代码那样。也就是说,如果你想禁止其它利用调用你的利用,创建1个与众不同的 URL scheme。虽然这不能保证你的利用不会被调用,但最少大大下降了这类可能性。

自定义 URL Scheme 示例工程

我意想到依照本文的每步做下来还是有1点复杂的。我做好了两个非常基础的 iOS 利用,1个自定义了 URL scheme,另外一个则去调用它,并传递了1个比较短的参数列表(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

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐