2016-09-17 20 views
15

Apple z iOS 10 ma przestarzałe OpenURL: dla OpenURL: Opcja: completionHandler Jeśli mam:OpenURL: przestarzałe w iOS 10

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

Jak to stać? Opcje: < # (niepustych NSDictionary *) #> w szczegółach

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

Dzięki

Aktualizuj opcje: @ {} Do pustego słownika bez klucza i wartości http://useyourloaf.com/blog/querying-url-schemes-with-canopenurl/

+1

Słownik opcji została opisana w obu odpowiedzi [tutaj] (http : //stackoverflow.com/questions/38964264/openurl-in-ios10). –

+3

BTW - Jeśli Twoja aplikacja nadal obsługuje system iOS 9 lub starszy, po prostu nadal używaj starego 'openURL'. Powinieneś przenieść się do nowego tylko wtedy, gdy twoim celem wdrożenia jest iOS 10. – rmaddy

+0

oczywiście w UIKit.framework jest to skomentowane! – Joannes

Odpowiedz

42

pisać jak ten.

Uchwyt 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"); 
    } 
}]; 

Bez obsługi completionHandler

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

Sprawdź ten samouczek, aby dowiedzieć się więcej szczegółów http://useyourloaf.com/blog/querying-url-schemes -z-canopenurl/ –

+0

@ {} do jakiego użytku? – Joannes

+0

Dla pustego słownika bez klucza i wartości. –

3

Apple wprowadziła metodę openURL: jako sposób na otwieranie linków zewnętrznych z iOS 2. powiązanej funkcji canOpenURL: dostał trochę prywatności kontroluje w systemie iOS 9, aby uniemożliwić wyszukiwanie urządzeń do zainstalowanych aplikacji. Teraz w systemie iOS 10 firma Apple wycofała zwykłe stare openURL dla openURL:options:completionHandler:.

Oto moja szybkie przypomnienie tego, co trzeba wiedzieć, aby otworzyć odnośnik zewnętrzny z iOS 10.

obecnie przestarzała metoda ma jeden parametr URL, aby otworzyć i zwraca wartość logiczną, aby zgłosić sukces lub niepowodzenie :

// Objective-C 
    - (BOOL)openURL:(NSURL*)url 

// Swift 
    open func canOpenURL(_ url: URL) -> Bool 

nowa metoda w iOS 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) 

Istnieją obecnie trzy parametry:

  • URL, aby otworzyć
  • słownika opcje (patrz poniżej ważnych Wpisy). Użyj pustego słownika dla tego samego zachowania, co openURL:.
  • Program obsługi zakończenia wywoływany w głównej kolejce z wynikiem . Nullable, jeśli nie jesteś zainteresowany statusem.

Otwieranie adresu URL z iOS 10

Co to znaczy jeśli masz tylko 10 iOS app, nie dbają o możliwości i stanu zaawansowania i po prostu chcą zatrzymać Xcode narzekania:

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

// Swift 
UIApplication.shared.open(url, options: [:], completionHandler: nil) 

W praktyce, o ile nadal obsługuje się system iOS 9 lub wcześniejszy, należy cofnąć się do zwykłej starej metody openURL.Spójrzmy na przykład gdzie to zrobić, a także korzystać z obsługi ukończenia aby sprawdzić stan otwarty:

Pierwszy z 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"]; 

ja przechodząc pustego słownika dla opcji i I nie rób nic użytecznego w obsłudze zakończeń, poza rejestrowaniem sukcesu. Swift wersja:

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") 

Opcje
Plik nagłówka UIApplication wymienia jeden klucz do słownika opcje:

  • UIApplicationOpenURLOptionUniversalLinksOnly: Użyj wartość logiczną ustawioną na true (TAK), aby tylko otwarte adres URL, jeśli jest to prawidłowy link uniwersalny z aplikacją skonfigurowaną do jego otwarcia. Jeśli nie skonfigurowano żadnej aplikacji lub użytkownik wyłączył tę funkcję, aby otworzyć łącze, procedura obsługi zakończenia jest wywoływana z wartością false (NO).

Aby zastąpić domyślne zachowanie utworzyć słownik z kluczem ustawiona na true (YES) i przekazać go jako parametr opcji:

// 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) 

Tak na przykład, jeśli ustawisz na true i spróbować otwórz adres URL: https://twitter.com/kharrison nie powiedzie się, jeśli nie zainstaluję aplikacji Twitter, zamiast otwierać łącze w Safari.

Referencje: openURL: deprecated in iOS 10

4

// Cel 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"); 
     } 
    }];