web-dev-qa-db-fra.com

Lancer l'application à l'aide de l'URL, mais OpenUrl n'est pas appelé

J'ai implémenté un schéma d'URL et je l'utilise pour transmettre des données à mon application en appelant la méthode. Le code entier est affiché comme ci-dessous

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    // Check the calling application Bundle ID
    if ([[url scheme] isEqualToString:@"yuvitime"])
    {
        NSLog(@"URL scheme:%@", [url scheme]);
        NSString * yuvitimeRequestValue = [url query];
        NSDictionary * userInfor = [[NSDictionary alloc]initWithObjectsAndKeys:yuvitimeRequestValue, @"YuvitimeRequest", nil];
        NSNotificationCenter * notificationCentre = [NSNotificationCenter defaultCenter];
        [notificationCentre postNotificationName:@"URLSCHEMEACTIVATEDNOTIFICATION" object:self userInfo:userInfor];

        return YES;
    }
    else
        return NO;
}

Si mon application est en arrière-plan, tout fonctionne bien. Lorsque vous cliquez sur une URL, l'application est ramenée au premier plan et l'URL est traitée comme codée dans la fonction ci-dessus.

Cependant, si l'application est arrêtée (application pas encore lancée), en cliquant sur l'URL, elle lance uniquement l'application sans appeler la fonction de gestion illustrée ci-dessus.

Après avoir cherché, le meilleur résultat que j'arrive à obtenir est le suivant

application: WillFinishLaunchingWithOptions: Lorsqu'on lui demande d'ouvrir une URL, le résultat de retour de cette méthode est combiné avec le résultat de retour de application:didFinishLaunchingWithOptions: méthode pour déterminer si une URL doit être gérée. Si l'une des méthodes renvoie NON, le système n'appelle pas le application:openURL:options: méthode. Si vous n'implémentez pas l'une des méthodes, seule la valeur de retour de la méthode implémentée est prise en compte.

- application: didFinishLaunchingWithOptions: Cette méthode représente votre dernière chance de traiter les clés du dictionnaire launchOptions. Si vous n'avez pas évalué les clés dans votre application:willFinishLaunchingWithOptions:, vous devez les regarder dans cette méthode et fournir une réponse appropriée. Les objets qui ne sont pas le délégué de l'application peuvent accéder aux mêmes valeurs de dictionnaire launchOptions en observant la notification nommée UIApplicationDidFinishLaunchingNotification et en accédant au dictionnaire userInfo de la notification. Cette notification est envoyée peu de temps après le retour de cette méthode. Le résultat de retour de cette méthode est combiné avec le résultat de retour de application:willFinishLaunchingWithOptions: méthode pour déterminer si une URL doit être gérée. Si l'une des méthodes renvoie NON, l'URL n'est pas gérée. Si vous n'implémentez pas l'une des méthodes, seule la valeur de retour de la méthode implémentée est prise en compte.

Malgré l'explication, je ne sais toujours pas comment le faire et je n'ai rien trouvé d'autre concret en ligne.

Merci

Cordialement

22

Je suis d'accord avec Kaloyan, "handleOpenURL" n'est jamais appelé au lancement de l'application. Vous devez donc vérifier l'URL dans "launchOptions" dans didFinishLaunchingWithOptions.

TOUTEFOIS

J'ai adopté la même solution que Apple exemple de code pour QuickActions (3D Touch). Je garde l'URL au lancement dans une variable, et je la gère dans applicationDidBecomeActive: .

@interface MyAppDelegate ()
@property (nonatomic, strong) NSURL *launchedURL;
@end

@implementation MyAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.launchedURL = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
    ...
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if (self.launchedURL) {
        [self openLink:self.launchedURL];
        self.launchedURL = nil;
    }
}

- (BOOL)  application:(UIApplication *)application
          openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
       annotation:(id)annotation
{
    NSURL *openUrl = url;

    if (!openUrl)
    {
        return NO;
    }
    return [self openLink:openUrl];
}

- (BOOL)openLink:(NSURL *)urlLink
{
    ...
}

@end
29
vmeyer

Je crois qu'il y a une meilleure réponse maintenant que,

  • application:handleOpenURL:
  • application:openURL:sourceApplication:annotation: Les deux sont obsolètes dans iOS 9. Apple suggestion est:

Utilisation application:openURL:options: au lieu.

application:openURL:options: a un comportement différent des anciens, car il sera exécuté au cas où l'application était en arrière-plan ou se lancera.

Donc, vous devez gérer l'ouverture de l'URL en son sein niquement. comme ci-dessous:

- (BOOL)application:(UIApplication *)app
        openURL:(NSURL *)url
        options:(NSDictionary<NSString *,id> *)options {

    // Check the calling application Bundle ID
    if ([[url scheme] isEqualToString:@"yuvitime"])
    {
        NSLog(@"URL scheme:%@", [url scheme]);
        NSString * yuvitimeRequestValue = [url query];
        NSDictionary * userInfor = [[NSDictionary alloc]initWithObjectsAndKeys:yuvitimeRequestValue, @"YuvitimeRequest", nil];
        NSNotificationCenter * notificationCentre = [NSNotificationCenter defaultCenter];
        [notificationCentre postNotificationName:@"URLSCHEMEACTIVATEDNOTIFICATION" object:self userInfo:userInfor];

        return YES;
    }
    else
        return NO;
}
8
Ismail

Salut quand l'application n'est pas lancée auparavant, la méthode "handleOpenURL" n'est jamais appelée. Vous devez vérifier "launchOptions" dans didFinishLaunchingWithOptions pour l'objet avec la clé "UIApplicationLaunchOptionsURLKey"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
//call function to handle the url like in handleURL, but do not call handleURL directly

}
8
Kaloyan Dobrev

Pour iOS 10, utilisez

func application(_ app: UIApplication,
open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
6
ycwjjjj

Pour moi, ne faites pas application(_:open options:)outside AppDelegate {} scope ????

0
hstdt