openURL:在iOS 10中已弃用

Joa*_*nes 40 objective-c nsurl ios ios10

使用iOS 10的Apple已弃用openURL:for openURL:option:completionHandler如果我有:

 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.google.com"]];
Run Code Online (Sandbox Code Playgroud)

它将如何变成?选项:<#(nonnull NSDictionary*)#>详细说明

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.google.com"] options:<#(nonnull NSDictionary<NSString *,id> *)#> completionHandler:nil];
Run Code Online (Sandbox Code Playgroud)

谢谢

更新选项:@ {}对于没有键和值的空字典 http://useyourloaf.com/blog/querying-url-schemes-with-canopenurl/

Nir*_*v D 86

写这样的.

处理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");
    }
}];
Run Code Online (Sandbox Code Playgroud)

没有处理completionHandler

[application openURL:URL options:@{} completionHandler:nil];
Run Code Online (Sandbox Code Playgroud)

  • 对于没有键和值的空字典。 (2认同)

zee*_*Dar 8

// Objective-C

 UIApplication *application = [UIApplication sharedApplication];
 [application openURL:URL options:@{} completionHandler:nil];
Run Code Online (Sandbox Code Playgroud)

//斯威夫特

  UIApplication.shared.open(url, options: [:], completionHandler: nil)
Run Code Online (Sandbox Code Playgroud)


Dis*_*sha 7

苹果公司介绍了该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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

现在有三个参数:

  • 打开的URL
  • 选项字典(有关有效条目,请参见下文)。将空字典用于与相同的行为 openURL:
  • 完成处理程序成功调用主队列。如果您对状态不感兴趣,则可以为null。

使用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)
Run Code Online (Sandbox Code Playgroud)

在实践中,只要您仍支持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"];
Run Code Online (Sandbox Code Playgroud)

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

选项
UIApplication头文件列出了选择一个密钥词典:

  • UIApplicationOpenURLOptionUniversalLinksOnly:使用设置为true(YES)的布尔值仅在URL是有效的通用链接且应用程序配置为打开该URL时才打开该URL。如果未配置任何应用程序,或者用户禁用了该应用程序来打开链接,则使用false(NO)调用完成处理程序。

要覆盖默认行为,请创建一个字典并将键设置为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)  
Run Code Online (Sandbox Code Playgroud)

因此,例如,如果我将其设置为true并尝试打开URL https://twitter.com/kharrison,则如果我没有安装Twitter应用程序而不是在Safari中打开链接,则它将失败。

引用openURL:在iOS 10中已弃用


vik*_*mar 6

斯威夫特 5.0.1 及以上版本

UIApplication.shared.open(URL.init(string: UIApplication.openSettingsURLString)!)
Run Code Online (Sandbox Code Playgroud)