iOS10适配:被弃用的openURL

苹果在iOS10中废弃了原有的openURL:方法,并推出了openURL:options:completionHandler:新方法,该方法支持异步执行并提供完成回调。本文详细介绍了新方法的使用方式及选项参数。
摘要由CSDN通过智能技术生成

原文:openURL Deprecated in iOS 10

作者:@kharrison

译者:deqiutseng


苹果在iOS 2中引入了openURL:方法来进行APP间的跳转。不过在iOS 9中,相关的canOpenURL:函数已经被私有化了,苹果禁止开发者查询设备上是否安装了某款APP。在iOS 10中,苹果弃用了openURL,转而用openURL:options:completionHandler:替代。本文简单介绍如何在iOS 10中进行APP之间的跳转。


iOS 10中的新功能


苹果在What's New in iOS文档的UIKit部分中指出:


新的UIApplication方法openURL:options:completionHandler:可以异步执行并在主队列中执行完成后进行回调(此方法替换原来的openURL:)。


现在被废弃的方法必须传入启动APP的URL并返回布尔值来标识成功或是失败。


- (BOOL)openURL:(NSURL*)url

 // Swift

open func canOpenURL(_ url: URL) -> Bool


iOS 10中的新方法:


// Objective-C

- (void)openURL:(NSURL*)url options:(NSDictionary *)options

  completionHandler:(void (^ __nullable)(BOOL success))completion

   

// Swift

open func open(_ url: URL, options: [String : Any] = [:],

  completionHandler completion: (@escaping (Bool) -> Swift.Void)? = nil)


现在变为三个参数


  • 打开APP的URL

  • 可选字典参数(请参见以下有效条目)。传入一个空字典可以达到openURL:一样的行为。

  • 执行成功后completionhandler在主队列中回调。如果你并不关心它的返回状态也可以传空。

在iOS10中打开URL


如果你有一个iOS 10应用程序也就意味着你不需要关心它的可选参数及完成回调函数返回的状态并停止对Xcode的抱怨。


// Objective-C

UIApplication *application = [UIApplication sharedApplication];

[application openURL:URL options:@{} completionHandler:nil];

 

// Swift

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


在项目实践中,如果你仍然兼容iOS9及更早的版本,你肯定会想用回以前的openURL 老方法。下面来看一段代码是如何使用completionHandler来检查APP打开状态。先上一段Object-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"];


我为option参数传入一个空的字典,除了只是在成功回调方法里只是打印了一下日志以外,并没有写任何有用的代码。以下是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:如果这个要打开的URL有效,并且在应用中配置它布尔值为true(YES)时才可以打开,否则打不开。

为了覆盖默认行为,创建一个设置key值了True的字典作为参数传入:


// 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 app那它就会失败,同时会调用safari来打开这个链接。(非常感谢Kamil对本文的建议)。


进一步阅读:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值