(譯)openURL 在 iOS10中已棄用

翻譯自:openURL Deprecated in iOS10html

譯者:Haley_Wongios

蘋果在iOS 2 推出了 openURL:方法 做爲一種打開外部連接的方式。而與之相關的方法 canOpenURL: 在iOS 9隱私控制裏也禁止查詢設備中已安裝的App。api

蘋果在iOS 10 中已經棄用了openURL:這個舊方法,用openURL:options:completionHandler:來代替。bash

這篇快速指南就是教你在iOS 10 下如何打開一個外部連接的文章。 (Haley_Wong注:canOpenURL:是在iOS 3中添加的;打開外部連接通常都是用來調起別的App,好比調起打電話、郵件、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:).
複製代碼

翻譯以下:app

新的UIApplication 方法`openURL:options:completionHandler:` 會異步執行,並在主隊列中調用這個指定的 `completion handler`回調。
複製代碼

這個棄用的方法有一個要打開的URL 參數,而且返回一個表示成功或者失敗的布爾值:異步

// Objective-C
- (BOOL)openURL:(NSURL*)url

// Swift
open func canOpenURL(_ url: URL) -> Bool
複製代碼

iOS 10中的新方法:async

// 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)
複製代碼

它有三個參數:ui

  • 要打開的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中打開這個連接)

更多閱讀

若有翻譯錯誤,請批評指正,謝謝!

相關文章
相關標籤/搜索