web-dev-qa-db-fra.com

openURL: obsolète dans iOS 10

Apple avec iOS 10 a obsolète openURL: pour openURL: option: completionHandler Si j'ai:

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

Comment ça va devenir? options: <# (nonnull NSDictionary *) #> en détail

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

Merci

Options de mise à jour: @ {} Pour un dictionnaire vide sans clé ni valeur http://useyourloaf.com/blog/querying-url-schemes-with-canopenurl/

34
Joannes

Écris comme ça.

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

sans traitement d'achèvementHandler

[application openURL:URL options:@{} completionHandler:nil];
82
Nirav D

// Objectif c

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

// Rapide

  UIApplication.shared.open(url, options: [:], completionHandler: nil)
7
zeeshan Dar

Apple a présenté le openURL: méthode pour ouvrir des liens externes avec iOS 2. La fonction associée canOpenURL: iOS 9 dispose de contrôles de confidentialité qui vous empêchent d’interroger les appareils sur les applications installées. Maintenant, avec iOS 10 Apple a déconseillé d'utiliser l'ancien plaine openURL pour openURL:options:completionHandler:.

Voici mon guide rapide sur ce que vous devez savoir pour ouvrir un lien externe avec iOS 10.

La méthode maintenant obsolète a un seul paramètre pour l'URL à ouvrir et renvoie un booléen pour signaler la réussite ou l'échec:

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

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

La nouvelle méthode sous 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)

Il y a maintenant trois paramètres:

  • L'URL à ouvrir
  • Un dictionnaire d’options (voir ci-dessous pour les entrées valides). Utilisez un dictionnaire vide pour le même comportement que openURL:.
  • Un gestionnaire d'achèvement a appelé sur la file d'attente principale avec le succès. Nullable si vous n'êtes pas intéressé par le statut.

Ouverture d'une URL avec iOS 10

Qu'est-ce que cela signifie si vous avez une application iOS 10 uniquement, ne vous souciez pas des options et de l'état d'avancement et que vous voulez simplement arrêter Xcode se plaindre

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

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

En pratique, tant que vous supportez encore iOS 9 ou une version antérieure, vous souhaiterez vous replier sur la vieille méthode plain openURL. Voyons un exemple où faire cela et utilisons également le gestionnaire d’achèvement pour vérifier le statut de l’ouverture:

D'abord avec 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"];

Je passe un dictionnaire vide pour les options et je ne fais rien d’utile dans le gestionnaire d’achèvement, à part enregistrer le succès. La version 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
Le fichier d'en-tête UIApplication répertorie une clé unique pour le dictionnaire d'options:

  • UIApplicationOpenURLOptionUniversalLinksOnly: utilisez une valeur booléenne définie sur true (OUI) pour ouvrir l'URL uniquement s'il s'agit d'un lien universel valide avec une application configurée pour l'ouvrir. S'il n'y a pas d'application configurée ou si l'utilisateur est désactivé en l'utilisant pour ouvrir le lien, le gestionnaire d'achèvement est appelé avec false (NO).

Pour remplacer le comportement par défaut, créez un dictionnaire avec la clé définie sur true (YES) et transmettez-le comme paramètre options:

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

Ainsi, par exemple, si je mets ceci à true et tente d'ouvrir l'URL https://Twitter.com/kharrison , il échouera si l'application Twitter n'est pas installée au lieu d'ouvrir le lien dans Safari. .

Référence : openURL: obsolète dans iOS 1

4
Disha
 // 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");
        }
    }];
2