本文由 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。
点击左侧剪头打开列表,可以看到 Item 0,1个字典实体。展开 Item 0,可以看到 URL Identifier,1个字符串对象。该字符串是你自定义的 URL scheme 的名字。建议采取反转域名的方法保证该名字的唯1性,比如 com.yourCompany.yourApp。
点击 Item 0 新增1行,从下拉列表当选择 URL Schemes,敲击键盘回车键完成插入。
注意 URL Schemes 是1个数组,允许利用定义多个 URL schemes。
展开该数据并点击 Item 0。你将在这里定义自定义 URL scheme 的名字。只需要名字,不要在后面追加 :// — 比如,如果你输入 iOSDevApp,你的自定义 url 就是 iOSDevApp://
此时,全部定义以下图:
虽然我赞同 Xcode 使用描写性的名字的目的,不过看到创建的实际的 key 也是非常有用的。这里有1个方便的技能,右键点击 plist 并选择 Show Raw Keys/Values,就可以看到以下效果:
还有另外一种有用的输出格式,XML,由于可以非常容易的看到字典和原始数组及其包括的实体的结构。点击 plist 并选择 Open As – Source Code:
从 Safari 中调用自定义 URL Scheme
定义了 URL scheme,我们可以运行1个快速测试来验证利用是不是如我们所期望的被调用。在这之前,我创建了1个准 UI 以辨别带有自定义 URL 的利用。该利用只有1个 UILabel,带有文本 “App With Custom URL”。下载源代码
使用摹拟器调用利用的步骤:
- 在 Xcode 中运行利用
- 1旦利用被安装,自定义 URL scheme 就会被注册
- 通过摹拟器的硬件菜单当选择 Home 来关闭利用
- 启动 Safari
- 在阅读器地址栏输入之前定义的 URL scheme(以下)
此时 Safari 将会关闭,利用会被带回到前台。庆祝你刚刚使用自定义 URL scheme 调用了1个 iPhone 利用。
从另外一个 iPhone 利用中调用自定义 URL Scheme
让我们看看如何从另外一个利用中调用自定义 URL scheme。我又创建了1个非常简单的 iPhone 利用,它只有1个 UILabel 和1个 UIButton — 前者显示了1段信息,告知你这个利用将要通过自定义 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®istered=1";
|
在 web 开发中,字符串 ?token=123abct®istered=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®istered=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