打开链接:在iOS 10中已弃用

92

苹果公司在iOS 10中已将openURL: for openURL:option:completionHandler标记为过时的。 如果我有:

 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.google.com"]];

它将如何变得?选项:<#(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/


1
选项字典在这里的两个答案中都有描述:https://dev59.com/5FkT5IYBdhLWcg3wK8hT。 - Dev Sanghani
3
顺便说一句,如果你的应用程序仍然支持iOS 9或更低版本,只需继续使用旧的“openURL”。只有在部署目标为iOS 10时,才应该开始使用新的方法。 - rmaddy
显然在UIKit.framework中,这是被注释掉的! - Joannes
可能是OpenURL in iOS10的重复问题。 - KSigWyatt
6个回答

168

像这样写。

处理 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];

Swift 等价函数:open(_:options:completionHandler:)

UIApplication.shared.open(url)

1
查看此教程以获取更多详细信息:http://useyourloaf.com/blog/querying-url-schemes-with-canopenurl/ - Nirav D
1
@{} 有什么用途? - Joannes
2
对于没有键和值的空字典。 - Nirav D
在 iOS10 的键盘扩展中,如果没有共享应用程序,你该如何实现它? - Learn Swift
嗨@NiravD,我正在尝试在wkwebview中打开一个URL。如何在不使用openURL的情况下实现相同的效果?openURL使用浏览器,我正在尝试使用Webkit在我的应用程序中打开一个URL。 - iPhoneDeveloper
@iPhoneKar,您需要从URL创建NSURLRequest,然后在WKWebView对象上调用loadRequest方法。 - Nirav D

19

苹果公司在iOS 2中引入了openURL:方法作为打开外部链接的一种方式。相关函数canOpenURL:在iOS 9中添加了一些隐私控制以阻止您查询设备上安装的应用程序。现在,在iOS 10中,苹果已弃用了简单的旧版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"];

我在选项中传递了一个空字典,并且在完成处理程序中除了记录成功之外没有做任何有用的事情。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")

选项
UIApplication头文件只列出一个用于选项字典的键:

  • UIApplicationOpenURLOptionUniversalLinksOnly: 使用布尔值设为 true (YES) 仅在 URL 是有效的通用链接并且已配置打开它的应用程序时才打开 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:在iOS 10中已弃用


13

// Objective-C

 UIApplication *application = [UIApplication sharedApplication];
 [application openURL:URL options:@{} completionHandler:nil];

// Swift

  UIApplication.shared.open(url, options: [:], completionHandler: nil)

你甚至可以省略选项和completionHandler参数,因为它们默认初始化为[:]和nil值。只需保留UIApplication.shared.open(url)即可。 - Sanjeevcn

6

Swift 5.0.1及以上版本

UIApplication.shared.open(URL.init(string: UIApplication.openSettingsURLString)!)

1
这应该添加在哪里? - samezedi

3
 // 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");
        }
    }];

0

打开应用程序设置(Objective-C)

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]
                                           options:@{}
                                 completionHandler:^(BOOL success) {
        }];

已在iOS 12上进行测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接