原文: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並返回布爾值來標識成功或是失敗。
// Objective-C - (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對本文的建議)。
進一步閱讀:
What's New in iOS -查看UIKit 部分?
Querying URL Schemes with canOpenURL