翻译自:openURL Deprecated in iOS10html
译者:Haley_Wongios
苹果在iOS 2 推出了 openURL:
方法 做为一种打开外部连接的方式。而与之相关的方法 canOpenURL:
在iOS 9隐私控制里也禁止查询设备中已安装的App。api
苹果在iOS 10 中已经弃用了openURL:
这个旧方法,用openURL:options:completionHandler:
来代替。bash
这篇快速指南就是教你在iOS 10 下如何打开一个外部连接的文章。 (Haley_Wong注:canOpenURL:是在iOS 3中添加的;打开外部连接通常都是用来调起别的App,好比调起打电话、邮件、QQ、微信、支付宝等)微信
苹果在UIKit相关的 What’s New in iOS 文档中提到:闭包
The new UIApplication method openURL:options:completionHandler:, which is executed asynchronously and calls the specified completion handler on the main queue (this method replaces openURL:).
复制代码
翻译以下:app
新的UIApplication 方法`openURL:options:completionHandler:` 会异步执行,并在主队列中调用这个指定的 `completion handler`回调。
复制代码
这个弃用的方法有一个要打开的URL 参数,而且返回一个表示成功或者失败的布尔值:异步
// Objective-C
- (BOOL)openURL:(NSURL*)url
// Swift
open func canOpenURL(_ url: URL) -> Bool
复制代码
iOS 10中的新方法:async
// Objective-C
- (void)openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options
completionHandler:(void (^ __nullable)(BOOL success))completion
// Swift
open func open(_ url: URL, options: [String : Any] = [:],
completionHandler completion: (@escaping (Bool) -> Swift.Void)? = nil)
复制代码
它有三个参数:ui
openURL:
一致。这意味着若是你有一个只须要支持iOS 10以上的App,也不关心options 参数和 完成的状态,又不想 Xcode 报警告,你能够这样写:
// Objective-C
UIApplication *application = [UIApplication sharedApplication];
[application openURL:URL options:@{} completionHandler:nil];
// Swift
UIApplication.shared.open(url, options: [:], completionHandler: nil)
复制代码
实际上,只要你仍须要支持iOS 9或者更早的版本,那么你就极可能要用回 openURL:
老方法。 咱们来看一个 使用 completion handler 来检查 连接打开状态的例子。
显示 Objective-C代码:
- (void)openScheme:(NSString *)scheme {
UIApplication *application = [UIApplication sharedApplication];
NSURL *URL = [NSURL URLWithString:scheme];
if ([application respondsToSelector:@selector(openURL:options:completionHandler:)]) {
[application openURL:URL options:@{}
completionHandler:^(BOOL success) {
NSLog(@"Open %@: %d",scheme,success);
}];
} else {
BOOL success = [application openURL:URL];
NSLog(@"Open %@: %d",scheme,success);
}
}
// Typical usage
[self openScheme:@"tweetbot://timeline"];
复制代码
我传了一个空字典做为options参数,我在 completion handler 中就打印了一下 success 值,也没作啥有用的事。 下面是 Swift 版代码:
func open(scheme: String) {
if let url = URL(string: scheme) {
if #available(iOS 10, *) {
UIApplication.shared.open(url, options: [:],
completionHandler: {
(success) in
print("Open \(scheme): \(success)")
})
} else {
let success = UIApplication.shared.openURL(url)
print("Open \(scheme): \(success)")
}
}
}
// Typical usage
open(scheme: "tweetbot://timeline")
复制代码
##Options 参数 UIApplication
的头文件中列了一个可用在 options字典中的key:
UIApplicationOpenURLOptionUniversalLinksOnly
:能够设置布尔值,若是设置为true(YES),则只能打开应用里配置好的有效通用连接。若是应用程序没有配置,或者用于禁止打开这个连接,则 completion handler 回调里的success为false(NO)。为了覆写程序的默认动做(默认这个key的值是NO),咱们须要建立一个字典,将对应的key 设置为true(YES),而后将字典传给 options 参数:
// Objective-C
NSDictionary *options = @{UIApplicationOpenURLOptionUniversalLinksOnly : @YES};
[application openURL:URL options:options completionHandler:nil];
// Swift
let options = [UIApplicationOpenURLOptionUniversalLinksOnly : true]
UIApplication.shared.open(url, options: options, completionHandler: nil)
复制代码
举个例子,我把这个值设置为 true 并尝试打开https://twitter.com/kharrison
, 若是我没有安装 Twitter 应用,它将会执行失败,而不是在Safari中打开这个连接。 (译者注:在iOS 9 使用 openURL:方法打开这个连接时,会在首先调起Safari,而后在Safari中打开这个连接)
若有翻译错误,请批评指正,谢谢!