iOS10適配:被棄用的openURL

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容