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/
É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];
// Objectif c
UIApplication *application = [UIApplication sharedApplication];
[application openURL:URL options:@{} completionHandler:nil];
// Rapide
UIApplication.shared.open(url, options: [:], completionHandler: nil)
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:
openURL:
.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
// 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");
}
}];