蘋果在iOS 2中引入了openURL:方法來進(jìn)行APP間的跳轉(zhuǎn)。不過在iOS9中,相關(guān)的canOpenURL:函數(shù)已經(jīng)被私有化了,蘋果禁止開發(fā)者查詢設(shè)備上是否安裝了某款A(yù)PP。在iOS10中,蘋果棄用了openURL,轉(zhuǎn)而用openURL:options:completionHandler:替代。本文簡單介紹如何在iOS10中進(jìn)行APP之間的跳轉(zhuǎn)。
iOS10中的新功能
蘋果在What's New in iOS文檔的UIKit部分中指出:
新的UIApplication方法openURL:options:completionHandler:可以異步執(zhí)行并在主隊(duì)列中執(zhí)行完成后進(jìn)行回調(diào)(此方法替換原來的openURL:)。
現(xiàn)在被廢棄的方法必須傳入啟動APP的URL并返回布爾值來標(biāo)識成功或是失敗。
-?(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"];
我為option參數(shù)傳入一個(gè)空的字典,除了只是在成功回調(diào)方法里只是打印了一下日志以外,并沒有寫任何有用的代碼。以下是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參數(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í),如果我并沒有安裝Twitterapp那它就會失敗,同時(shí)會調(diào)用safari來打開這個(gè)鏈接。(非常感謝Kamil對本文的建議)。