蘋果在iOS 2中引入了openURL:方法來進(jìn)行APP間的跳轉(zhuǎn)。不過在iOS 9中匕积,隱私控制已禁止開發(fā)者通過openURL:方法查詢設(shè)備上是否安裝了哪些APP應(yīng)用呆细。蘋果禁止開發(fā)者查詢設(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)在被廢棄的方法必須傳入啟動APP的URL并返回布爾值來標(biāo)識成功或是失敗编矾。
// 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ù)(請參見以下有效條目)熟史。傳入一個(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)并停止對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及更早的版本限寞,你肯定會想用回以前的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那它就會失敗眷细,同時(shí)會調(diào)用safari來打開這個(gè)鏈接。