zoukankan      html  css  js  c++  java
  • (译)openURL 在 iOS10中已弃用

    翻译自:openURL Deprecated in iOS10
    译者:Haley_Wong

    苹果在iOS 2 推出了 openURL:方法 作为一种打开外部链接的方式。而与之相关的方法 canOpenURL: 在iOS 9隐私控制里也禁止查询设备中已安装的App。 苹果在iOS 10 中已经弃用了openURL:这个旧方法,用openURL:options:completionHandler:来代替。这篇快速指南就是教你在iOS 10 下如何打开一个外部链接的文章。
    (Haley_Wong注:canOpenURL:是在iOS 3中添加的;打开外部链接一般都是用来调起别的App,比如调起打电话、邮件、Safari、QQ、微信、支付宝等)

    iOS 10 中的更新

    苹果在UIKit相关的 What’s New in iOS 文档中提到:

    The new UIApplication method openURL:options:completionHandler:, which is executed asynchronously and calls the specified completion handler on the main queue (this method replaces openURL:).

    翻译如下:

    新的UIApplication 方法`openURL:options:completionHandler:` 会异步执行,并在主队列中调用这个指定的 `completion handler`回调。

    这个弃用的方法有一个要打开的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:一致。
    * 一个带有 成功与否 参数的 completion handler(可认为是闭包或block)。如果你对这个状态不感兴趣可以传Null。

    iOS 10 下打开一个URL

    这意味着如果你有一个只需要支持iOS 10以上的App,也不关心options 参数和 完成的状态,又不想 Xcode 报警告,你可以这样写:

    // Objective-C
    UIApplication *application = [UIApplication sharedApplication];
    [application openURL:URL options:@{} completionHandler:nil];
    
    // Swift
    UIApplication.shared.open(url, options: [:], completionHandler: nil)

    实际上,只要你仍需要支持iOS 9或者更早的版本,那么你就很可能要用回 openURL:老方法。
    我们来看一个 使用 completion handler 来检查 链接打开状态的例子。

    显示 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"];

    我传了一个空字典作为options参数,我在 completion handler 中就打印了一下 success 值,也没做啥有用的事。 下面是 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")

    Options 参数

    UIApplication 的头文件中列了一个可用在 options字典中的key:
    * UIApplicationOpenURLOptionUniversalLinksOnly:可以设置布尔值,如果设置为true(YES),则只能打开应用里配置好的有效通用链接。如果应用程序没有配置,或者用于禁止打开这个链接,则 completion handler 回调里的success为false(NO)。

    为了覆写程序的默认动作(默认这个key的值是NO),我们需要创建一个字典,将对应的key 设置为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)

    举个例子,我把这个值设置为 true 并尝试打开https://twitter.com/kharrison, 如果我没有安装 Twitter 应用,它将会执行失败,而不是在Safari中打开这个链接。
    (译者注:在iOS 9 使用 openURL:方法打开这个链接时,会在首先调起Safari,然后在Safari中打开这个链接)

    更多阅读

    如有翻译错误,请批评指正,谢谢!

  • 相关阅读:
    3.2 直线与方程
    3.1.2 两条直线平等与垂直的判定
    GNU Make
    linux 启动后台进程
    go 占位符
    raft 协议
    restTemplate 接收list数据
    JAVA通过实体类生成数据库查询语句(驼峰命名规则)
    flink使用命令开始、停止任务
    SPringBoot 配置类继承WebMvcConfigurationSupport和实现WebMvcConfigurer的使用
  • 原文地址:https://www.cnblogs.com/wanghang/p/6298808.html
Copyright © 2011-2022 走看看