专栏名称: Cocoa开发者社区
CocoaChina苹果开发中文社区官方微信,提供教程资源、app推广营销、招聘、外包及培训信息、各类沙龙交流活动以及更多开发者服务。
目录
相关文章推荐
51好读  ›  专栏  ›  Cocoa开发者社区

iOS10适配:被弃用的openURL

Cocoa开发者社区  · 公众号  · ios  · 2016-10-25 08:28

正文

▲点击上方“CocoaChina”关注即可免费学习iOS开发


原文: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对本文的建议)。


进一步阅读:


微信号:CocoaChinabbs


▲长按二维码“识别”关注即可免费学习 iOS 开发

月薪十万、出任CEO、赢娶白富美、走上人生巅峰不是梦

--------------------------------------

商务合作QQ:2408167315

投稿邮箱:[email protected]