компания Apple представила метод openURL:
как способ, чтобы открыть внешние ссылки с прошивкой 2. Связанная функция canOpenURL:
получил некоторую приватность управления в iOS 9, чтобы остановить вас от запросов устройств для установленных приложений. Теперь с iOS 10 Apple устарела от старого старого openURL
за openURL:options:completionHandler:
.
Вот мое краткое руководство к тому, что вам нужно знать, чтобы открыть внешнюю ссылку с прошивкой 10.
Ныне устаревший метод имеет один параметр для URL, чтобы открыть и возвращает логическое значение, чтобы сообщить успех или неудачу :
// Objective-C
- (BOOL)openURL:(NSURL*)url
// Swift
open func canOpenURL(_ url: URL) -> Bool
новый метод прошивки 10:
// Objective-C
- (void)openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options
completionHandler:(void (^ __nullable)(BOOL success))completion
// Swift
open func open(_ url: URL, options: [String : Any] = [:],
completionHandler completion: (@escaping (Bool) -> Swift.Void)? = nil)
Есть теперь три параметра:
- URL, чтобы открыть
- опции из словаря (см ниже допустимых записей). Используйте пустой словарь для такого же поведения, как
openURL:
.
- Обработчик завершения вызова в главной очереди с успехом . Неверный, если вы не заинтересованы в статусе.
Открытие URL с прошивкой 10
Что это значит, если у вас есть IOS 10 только приложение, не заботиться о возможностях и статусе завершения и просто хочу, чтобы остановить Xcode жалуется:
// Objective-C
UIApplication *application = [UIApplication sharedApplication];
[application openURL:URL options:@{} completionHandler:nil];
// Swift
UIApplication.shared.open(url, options: [:], completionHandler: nil)
На практике, пока вы все еще поддерживаете IOS 9 или более раннюю версию, вы захотите вернуться к обычным старым методам openURL
.Давайте посмотрим на пример, где это сделать, а также использовать обработчик завершения, чтобы проверить статус открытой:
Сначала с Objective-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"];
Я передаю пустой словарь для опций и I не делайте ничего полезного в обработчике завершения, кроме журнала успеха. 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")
Опция
Файл заголовка UIApplication
перечисляет один ключ для словаря вариантов:
UIApplicationOpenURLOptionUniversalLinksOnly
: Используйте логическое значение, установленное истинные (ДА) только открыто URL, если он является действительной универсальной ссылкой с приложением, настроенным для его открытия. Если приложение не настроено или пользователь отключил его, чтобы открыть ссылку, обработчик завершения вызывается с ложью (NO).
Чтобы изменить поведение по умолчанию создать словарь с набором ключей к истинным (YES) и передать его в качестве параметра опции:
// 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)
Так, например, если я изложу это верно и попытаться откройте URL-адрес https://twitter.com/kharrison, это не удастся, если у меня нет приложения Twitter вместо того, чтобы открывать ссылку в Safari.
Refrence: openURL: deprecated in iOS 10
Словарь вариантов описывается в обоих ответах [здесь] (HTTP : //stackoverflow.com/questions/38964264/openurl-in-ios10). –
BTW - Если ваше приложение по-прежнему поддерживает IOS 9 или ниже, просто продолжайте использовать старый 'openURL'. Вы должны перейти только к новому, если ваш целевой объект развертывания - iOS 10. – rmaddy
, очевидно, в UIKit.framework это прокомментировано! – Joannes