苹果公司在iOS 2中引入了openURL:
方法作为打开外部链接的一种方式。相关函数canOpenURL:
在iOS 9中添加了一些隐私控制以阻止您查询设备上安装的应用程序。现在,在iOS 10中,苹果已弃用了简单的旧版openURL
方法,取而代之的是openURL:options:completionHandler:
。
以下是我快速指南,帮助您在iOS 10上打开外部链接。
现在被弃用的方法有一个参数用于打开URL,并返回一个布尔值以报告成功或失败:
- (BOOL)openURL:(NSURL*)url
open func canOpenURL(_ url: URL) -> Bool
iOS 10中的新方法:
- (void)openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options
completionHandler:(void (^ __nullable)(BOOL success))completion
open func open(_ url: URL, options: [String : Any] = [:],
completionHandler completion: (@escaping (Bool) -> Swift.Void)? = nil)
现在有三个参数:
- 要打开的URL
- 选项字典(请参见下面的有效条目)。使用空字典以获得与
openURL:
相同的行为。
- 完成处理程序,在主队列上调用成功。如果您对状态不感兴趣,则可为空。
使用iOS 10打开URL
如果您有一个仅适用于iOS 10的应用,不关心选项和完成状态,并且只想停止Xcode发出的警告,那么这意味着什么:
UIApplication *application = [UIApplication sharedApplication];
[application openURL:URL options:@{} completionHandler:nil];
UIApplication.shared.open(url, options: [:], completionHandler: nil)
实际上,只要您仍然支持iOS 9或更早版本,您将希望返回到普通的openURL
方法。让我们看一个例子,在其中执行此操作并使用完成处理程序来检查打开状态:
首先是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);
}
}
[self openScheme:@"tweetbot://timeline"];
我在选项中传递了一个空字典,并且在完成处理程序中除了记录成功之外没有做任何有用的事情。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)")
}
}
}
open(scheme: "tweetbot://timeline")
选项
UIApplication
头文件只列出一个用于选项字典的键:
UIApplicationOpenURLOptionUniversalLinksOnly
: 使用布尔值设为 true (YES) 仅在 URL 是有效的通用链接并且已配置打开它的应用程序时才打开 URL。如果没有配置应用程序或用户禁用了使用它打开链接,则调用完成处理程序返回 false (NO)。
要覆盖默认行为,请创建一个键设置为 true (YES) 的字典,并将其作为选项参数传递:
NSDictionary *options = @{UIApplicationOpenURLOptionUniversalLinksOnly : @YES};
[application openURL:URL options:options completionHandler:nil];
let options = [UIApplicationOpenURLOptionUniversalLinksOnly : true]
UIApplication.shared.open(url, options: options, completionHandler: nil)
比如,如果我将此设置为true并尝试打开URL https://twitter.com/kharrison,如果我没有安装Twitter应用程序,则会失败,而不是在Safari中打开链接。
参考资料:openURL:在iOS 10中已弃用