2016-09-17 8 views
15

компании Apple с прошивкой 10 имеет осуждается OpenUrl: для OpenUrl: Опция: completionHandler Если у меня есть:OpenUrl: не рекомендуется использовать в ИО 10

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.google.com"]]; 

Как это будет? Варианты: < # (ненулевая NSDictionary *) #> подробно

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.google.com"] options:<#(nonnull NSDictionary<NSString *,id> *)#> completionHandler:nil]; 

Благодарности

Обновление опции: @ {} Для пустого словаря, без ключа и значения http://useyourloaf.com/blog/querying-url-schemes-with-canopenurl/

+1

Словарь вариантов описывается в обоих ответах [здесь] (HTTP : //stackoverflow.com/questions/38964264/openurl-in-ios10). –

+3

BTW - Если ваше приложение по-прежнему поддерживает IOS 9 или ниже, просто продолжайте использовать старый 'openURL'. Вы должны перейти только к новому, если ваш целевой объект развертывания - iOS 10. – rmaddy

+0

, очевидно, в UIKit.framework это прокомментировано! – Joannes

ответ

42

Написать, как это.

Ручка completionHandler

UIApplication *application = [UIApplication sharedApplication]; 
NSURL *URL = [NSURL URLWithString:@"http://www.google.com"]; 
[application openURL:URL options:@{} completionHandler:^(BOOL success) { 
    if (success) { 
     NSLog(@"Opened url"); 
    } 
}]; 

Без обработки completionHandler

[application openURL:URL options:@{} completionHandler:nil]; 
+1

Проверьте это руководство для получения более подробной информации http://useyourloaf.com/blog/querying-url-schemes -with-canopenurl/ –

+0

@ {} для чего? – Joannes

+0

Для пустого словаря без ключа и значения. –

3

компания 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

4

// Objective-C

UIApplication *application = [UIApplication sharedApplication]; 
[application openURL:URL options:@{} completionHandler:nil]; 

// Swift

UIApplication.shared.open(url, options: [:], completionHandler: nil) 
0
// In Xcode 9 and iOS 11 

    UIApplication *application = [UIApplication sharedApplication]; 
    NSURL *URL = [NSURL URLWithString:@"http://facebook.com"]; 
    [application openURL:URL options:@{} completionHandler:^(BOOL success) { 
     if (success) { 
      NSLog(@"Opened url"); 
     } 
    }];