openURL:在 iOS 10 中已弃用
Posted
技术标签:
【中文标题】openURL:在 iOS 10 中已弃用【英文标题】:openURL: deprecated in iOS 10 【发布时间】:2017-01-25 15:47:39 【问题描述】:ios 10 的 Apple 已弃用 openURL: for openURL:option:completionHandler
如果我有:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.google.com"]];
它会变成什么样子? options:<#(nonnull NSDictionary<NSString *,id> *)#>
详细
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.google.com"] options:<#(nonnull NSDictionary<NSString *,id> *)#> completionHandler:nil];
谢谢
更新
options:@
对于没有键和值的空字典
http://useyourloaf.com/blog/querying-url-schemes-with-canopenurl/
【问题讨论】:
选项字典在两个答案here中都有描述。 顺便说一句 - 如果您的应用仍然支持 iOS 9 或更低版本,请继续使用旧的openURL
。如果您的部署目标是 iOS 10,您应该只迁移到新的。
显然在 UIKit.framework 中有注释!
OpenURL in iOS10的可能重复
【参考方案1】:
这样写。
处理completionHandler
UIApplication *application = [UIApplication sharedApplication];
NSURL *URL = [NSURL URLWithString:@"http://www.google.com"];
[application openURL:URL options:@ completionHandler:^(BOOL success)
if (success)
NSLog(@"Opened url");
];
不处理completionHandler
[application openURL:URL options:@ completionHandler:nil];
【讨论】:
查看本教程了解更多详情useyourloaf.com/blog/querying-url-schemes-with-canopenurl @有什么用? 对于没有键和值的空字典。 在键盘扩展和iOS10没有共享应用的情况下怎么办? 嗨@NiravD 我正在尝试在 wkwebview 中打开一个 URL。我如何在不使用 openURL 的情况下达到同样的效果? openURL 使用浏览器,我正在尝试使用 webkit 在我的应用程序中打开一个 url。【参考方案2】:Apple 引入了openURL:
方法作为在 iOS 2 中打开外部链接的一种方式。相关功能 canOpenURL:
在 iOS 9 中获得了一些隐私控制,以阻止您查询设备以查找已安装的应用程序。现在在 iOS 10 中,Apple 已经弃用了旧的 openURL
为 openURL:options:completionHandler:
。
这是我在 iOS 10 中打开外部链接所需了解的快速指南。
现在已弃用的方法有一个参数用于打开 URL,并返回一个布尔值来报告成功或失败:
// Objective-C
- (BOOL)openURL:(NSURL*)url
// Swift
open func canOpenURL(_ url: URL) -> Bool
iOS 10 中的新方法:
// 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)
现在有三个参数:
要打开的 URL 一个选项字典(见下文有效 条目)。使用空字典来实现相同的行为openURL:
。
在主队列上调用的完成处理程序具有
成功。如果您对状态不感兴趣,则可以为空。
使用 iOS 10 打开 URL
如果您只有 iOS 10 的应用,不关心选项和完成状态,只想停止 Xcode 抱怨,这意味着什么:
// Objective-C
UIApplication *application = [UIApplication sharedApplication];
[application openURL:URL options:@ completionHandler:nil];
// Swift
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);
// Typical usage
[self openScheme:@"tweetbot://timeline"];
我为选项传递了一个空字典,除了记录成功之外,我没有在完成处理程序中做任何有用的事情。斯威夫特版本:
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")
选项UIApplication
头文件列出了选项字典的一个键:
UIApplicationOpenURLOptionUniversalLinksOnly
:使用设置为 true (YES) 的布尔值仅在 URL 是有效的通用链接且应用程序配置为打开它时才打开它。如果没有配置应用程序或用户禁用它来打开链接,则以 false (NO) 调用完成处理程序。
要覆盖默认行为,请创建一个键设置为 true (YES) 的字典并将其作为选项参数传递:
// 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 并尝试打开 URL https://twitter.com/kharrison,如果我没有安装 Twitter 应用程序而不是在 Safari 中打开链接,它将失败。
参考:openURL: deprecated in iOS 10
【讨论】:
【参考方案3】:// 目标-C
UIApplication *application = [UIApplication sharedApplication];
[application openURL:URL options:@ completionHandler:nil];
// 斯威夫特
UIApplication.shared.open(url, options: [:], completionHandler: nil)
【讨论】:
您甚至可以省略 options 和 completionHandler 参数,因为它们默认分别初始化为 [:] 和 nil 值。只需保留 UIApplication.shared.open(url)【参考方案4】: // In Xcode 9 and iOS 11
UIApplication *application = [UIApplication sharedApplication];
NSURL *URL = [NSURL URLWithString:@"http://facebook.com"];
[application openURL:URL options:@ completionHandler:^(BOOL success)
if (success)
NSLog(@"Opened url");
];
【讨论】:
【参考方案5】:打开应用设置(Objective-c)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]
options:@
completionHandler:^(BOOL success)
];
在 iOS 12 中测试
【讨论】:
【参考方案6】:Swift 5.0.1 及以上版本
UIApplication.shared.open(URL.init(string: UIApplication.openSettingsURLString)!)
【讨论】:
应该在哪里添加以上是关于openURL:在 iOS 10 中已弃用的主要内容,如果未能解决你的问题,请参考以下文章
'openURL'在iOS 10.0中已被弃用:请使用openURL:options:completionHandler:而不是在Swift 3中[重复]
MPMediaItemArtwork init(image:) 在 iOS 10.0 中已弃用
UITabBarItem setFinishedSelectedImage:在 iOS7 中已弃用