iOS10適配:被棄用的openURL



iOS10適配:被棄用的openURL


2016-10-24 09:03 編輯: suiling 分類:iOS開發 來源:CocoaChina翻譯組


5 6743


iOS開發openURL:


招聘信息:



  • iOS Developer

  • 微信書城開發

  • 數字圖書商城開發

  • iOS維護

  • Mac開發

  • 應用開發工程師(iOS)

  • 技術合夥人-後端工程師

  • 高級iOS開發工程師

  • 資深軟件研發工程師

  • 嵌入式軟件工程師

  • Unity3D手遊客戶端主程





  • 原文:openURL Deprecated in iOS 10

  • 作者:@kharrison

  • 譯者:deqiutseng


蘋果在iOS 2中引入瞭openURL:方法來進行APP間的跳轉。不過在iOS 9中,隱私控制已禁止開發者通過openURL:方法查詢設備上是否安裝瞭哪些APP應用。蘋果禁止開發者查詢設備上是否安裝瞭某款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並返回佈爾值來標識成功或是失敗。












1


2


3


4


5


// Objective-C


- (BOOL)openURL:(NSURL*)url



// Swift


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



iOS 10中的新方法:












1


2


3


4


5


6


7


// 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的抱怨。












1


2


3


4


5


6


// 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代碼:












1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


- (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版本:












1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


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的字典作為參數傳入:












1


2


3


4


5


6


7


// 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對本文的建議)。

0 個評論

要回覆文章請先登錄註冊