蘋果在iOS 2中引入了openURL:方法來進(jìn)行APP間的跳轉(zhuǎn)。不過在iOS 9中,隱私控制已禁止開發(fā)者通過openURL:方法查詢?cè)O(shè)備上是否安裝了哪些APP應(yīng)用。蘋果禁止開發(fā)者查詢?cè)O(shè)備上是否安裝了某款A(yù)PP。在iOS 10中,蘋果棄用了openURL,轉(zhuǎn)而用openURL:options:completionHandler:替代。本文簡單介紹如何在iOS 10中進(jìn)行APP之間的跳轉(zhuǎn)。
iOS 10中的新功能
蘋果在What's New in iOS文檔的UIKit部分中指出:
新的UIApplication方法openURL:options:completionHandler:可以異步執(zhí)行并在主隊(duì)列中執(zhí)行完成后進(jìn)行回調(diào)(此方法替換原來的openURL:)。
現(xiàn)在被廢棄的方法必須傳入啟動(dòng)APP的URL并返回布爾值來標(biāo)識(shí)成功或是失敗。
// 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)
現(xiàn)在變?yōu)槿齻€(gè)參數(shù)
打開APP的URL
可選字典參數(shù)(請(qǐng)參見以下有效條目)。傳入一個(gè)空字典可以達(dá)到openURL:一樣的行為。
執(zhí)行成功后completionhandler在主隊(duì)列中回調(diào)。如果你并不關(guān)心它的返回狀態(tài)也可以傳空。
在iOS10中打開URL
如果你有一個(gè)iOS 10應(yīng)用程序也就意味著你不需要關(guān)心它的可選參數(shù)及完成回調(diào)函數(shù)返回的狀態(tài)并停止對(duì)Xcode的抱怨。
// Objective-C
UIApplication *application = [UIApplication sharedApplication];
[application openURL:URL options:@{} completionHandler:nil];
// Swift
UIApplication.shared.open(url, options: [:], completionHandler: nil)
在項(xiàng)目實(shí)踐中,如果你仍然兼容iOS9及更早的版本,你肯定會(huì)想用回以前的openURL 老方法。下面來看一段代碼是如何使用completionHandler來檢查APP打開狀態(tài)。先上一段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](tweetbot://timeline)"];
我為option參數(shù)傳入一個(gè)空的字典,除了只是在成功回調(diào)方法里只是打印了一下日志以外,并沒有寫任何有用的代碼。以下是Swift版本:
func open(scheme: String) {
iflet 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](tweetbot://timeline)")
Options 參數(shù)
UIApplication 頭文件為options字典列出了一個(gè)key:
UIApplicationOpenURLOptionUniversalLinksOnly:如果這個(gè)要打開的URL有效,并且在應(yīng)用中配置它布爾值為true(YES)時(shí)才可以打開,否則打不開。
為了覆蓋默認(rèn)行為,創(chuàng)建一個(gè)設(shè)置key值了True的字典作為參數(shù)傳入:
// 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)
以上面示例,如果我設(shè)置它為true并打開URL:https://twitter.com/kharrison 時(shí), 如果我并沒有安裝Twitter app那它就會(huì)失敗,同時(shí)會(huì)調(diào)用safari來打開這個(gè)鏈接。