2010-07-05 4 views
4

J'essaie d'implémenter OAuth de manière sécurisée comme détaillé ici: http://fireeagle.yahoo.net/developer/documentation/oauth_best_practice#custom-url-osx. J'ai l'impression d'être tombé sur une pierre d'achoppement, car je n'arrive pas à comprendre comment gérer une URL qui lance mon application en arrière-plan.Applications prenant en charge le multitâche dans iOS 4 et les schémas d'URL personnalisés

J'ai enregistré mon application pour gérer oauthtest. J'ai confirmé que oauthtest: // et oauthtest: // callbacktest lancent tous deux mon application et fonctionnent comme prévu lorsque mon application n'est pas exécutée en arrière-plan.

Je la mise en œuvre

application:(UIApplication *) didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

qui est appelé avec succès quand mon application démarre à froid. Je peux facilement faire passer l'URL à mon application.

Cependant, si ma demande est déjà en cours d'exécution en arrière-plan, ni

application:(UIApplication *) didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

ni

application:(UIApplication *) handleOpenURL:(NSURL *)url 

est appelé et je n'ai aucun moyen d'obtenir les paramètres passés à ma demande dans le cadre de l'URL

Est-ce que quelqu'un sait comment obtenir les paramètres passés à une application en arrière-plan par un schéma d'URL personnalisé?

Je suis conscient que je pourrais contourner ce problème en désactivant le multitâche, mais je préfère ne pas le faire pour des raisons évidentes. Merci d'avance.

+0

J'ai également essayé d'ajouter manuellement un observateur pour la UIApplicationDidFinishLaunchingNotification. Comme prévu, ceci n'est pas appelé lors de la reprise d'un état suspendu. – ace

Répondre

7

Voici quelques exemples de code qui semblait fonctionner pour moi, testé dans iOS4:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { 
    NSLog(@"handleOpenURL - %@", [url absoluteURL]); 
    return YES;  
} 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    NSLog(@"applicationDidFinishLaunching"); 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    NSLog(@"didFinishLaunchingWithOptions - %@", [launchOptions objectForKey:@"UIApplicationLaunchOptionsURLKey"]); 
    return NO; 
} 

Si je lance l'application pour la première fois, didFinishLaunching: gère l'URL. Si je mets l'application en arrière-plan, revenez à Safari et appuyez sur un lien qui ramène l'application au premier plan, puis handleOpenURL: s'occupe de l'URL. Bonne chance!

+0

Merci beaucoup de m'avoir incité à regarder ça à nouveau! J'étais sur le point de commencer à mettre en œuvre une solution de contournement compliquée. En regardant votre code, j'ai réalisé que je testais handleOpenURL en appelant [url query] et non [url absoluteURL] avec une URL qui ne devait pas avoir de paramètres valides à retourner. J'ai bêtement pensé que cette requête demandait simplement l'URL de son URL ... Un coup d'œil sur la RFC 1808 et je comprends maintenant les getters pour NSURL. Votre code fonctionne vraiment à merveille, merci encore! – ace

Questions connexes