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 已经弃用了旧的 openURLopenURL: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 中已弃用

SLServiceTypeFacebook' 在 iOS 11.0 中已弃用

优先级和背景在 ios 8 中已弃用

subscriberCellularProvider在iOS 12.0中已弃用