iOS10適配:被棄用的openURL

蘋果在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è)鏈接。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容