2017-10-21 21 views
0

J'ai deux boutons sur mon extension aujourd'hui. L'un est dédié à l'ouverture de MainViewController et l'autre à la deuxième ViewController.Ouvert ViewController spécifique à partir d'aujourd'hui Extension

Je fait une appURL:

let appURL = NSURL(string: "StarterApplication://") 

puis sur un premier bouton que j'appelle:

 self.extensionContext?.open(appURL! as URL, completionHandler:nil) 

qui ouvre l'application sur MainViewController. Comment puis-je ouvrir MainViewController et effectuer une sauvegarde sur SecondViewController en appuyant sur le deuxième bouton sur Today Widget?

J'ai créé un deuxième schéma d'URL pour ce ViewController spécifique. J'ai vu dans d'autres sujets qu'il peut même type se fait en appelant:

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

en AppDelegate mais ne pas la moindre idée comment l'utiliser.

Répondre

-1

Oui, vous allez bien u besoin de revenir Oui à l'URL comme celui-ci dans AppDelegate:

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

if _ = url { 

return true 
} 
return false 
} 

Edit:

Vous devez faire correspondre le schéma d'URL avec identifiant de paquet (de l'application votre ouverture) dans votre plist à partir de laquelle vous essayez d'ouvrir l'application.

+0

Pouvez-vous fournir plus de détails? Qu'est-ce qui doit être spécifié dans cette instruction if? – Maxxer

+0

J'essaie de le dire si l'application explicite essaie d'ouvrir l'application. Je vérifie si l'URL est nulle ou non. C'est tout. –

+0

vérifiez la modification. –

0

Utilisez un schéma d'URL. Vous pouvez ajouter différents chemins ou arguments pour différentes tâches. Par exemple, j'ai une application qui affiche plusieurs éléments dans une extension aujourd'hui. Si vous appuyez sur un élément, l'application est ouverte.

- (void)_openItem:(SPItem *)item 
{ 
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"myapp://localhost/open_item?itemID=%@", item.itemID]]; 
    if (url != nil) 
    { 
     [self.extensionContext openURL:url completionHandler:nil]; 
    } 
} 

Comme vous l'avez déjà mentionné en vous la question, vous devez mettre en œuvre - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options

Dans mon cas, plus ou moins ressemble à ceci:

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options 
{ 
    BOOL ret; 
    if ([url.scheme isEqualToString:@"myapp"]) 
    { 
     if ([url.path isEqual:@"open_item"]) 
     { 
      @try 
      { 
       NSDictionary *query = [url.query queryDictionary]; 
       NSString* itemID = query[@"itemID"]; 
       [self _gotoItemWithID:itemID completionHandler:nil]; 
      } 
      @catch (NSException *exception) { 
      } 
      ret = YES; 
     } 
    } 
    else 
    { 
     ret = NO; 
    } 
    return ret; 
} 

Comme vous pouvez le voir, je d'abord vérifier, si le schéma d'URL. Si c'est celui que j'attends, je vérifie le chemin. En utilisant des chemins différents, je suis en mesure d'implémenter différentes commandes l'extension aujourd'hui est capable de exécuter. Chaque commande peut avoir des arguments différents. Dans le cas de la commande "open_item", j'attends le paramètre "itemID". En renvoyant OUI, vous indiquez à iOS que vous étiez en mesure de gérer l'URL avec laquelle votre application a été appelée.

Dans mon application [self _gotoItemWithID:itemID completionHandler:nil] toutes les tâches nécessaires pour afficher l'élément. Dans votre cas, vous aurez besoin d'une fonction pour afficher le second contrôleur de vue.

Edit:

j'oublié de mentionner que queryDictionary est une méthode dans une extension NSString. Il prend une chaîne (self) et essaie d'extraire le paramètre URL et de le renvoyer en tant que dictionnaire.

- (NSDictionary*)queryDictionary 
{ 
    NSCharacterSet* delimiterSet = [NSCharacterSet characterSetWithCharactersInString:@"&;"]; 
    NSMutableDictionary* pairs = [NSMutableDictionary dictionary]; 
    NSScanner* scanner = [[NSScanner alloc] initWithString:self]; 
    while (![scanner isAtEnd]) 
    { 
     NSString* pairString; 
     [scanner scanUpToCharactersFromSet:delimiterSet 
           intoString:&pairString] ; 
     [scanner scanCharactersFromSet:delimiterSet intoString:NULL]; 
     NSArray* kvPair = [pairString componentsSeparatedByString:@"="]; 
     if ([kvPair count] == 2) 
     { 
      NSString* key = [[kvPair objectAtIndex:0] stringByRemovingPercentEncoding]; 
      NSString* value = [[kvPair objectAtIndex:1] stringByRemovingPercentEncoding]; 
      [pairs setObject:value forKey:key] ; 
     } 
    } 
    return [NSDictionary dictionaryWithDictionary:pairs]; 
} 
1

J'ai trouvé la solution. La réponse est un lien profond. Voici ma méthode appDelegate:

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


    let urlPath : String = url.path as String! 
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 

    if(urlPath == "/Action"){ 

     let ActionView: ActionViewController = mainStoryboard.instantiateViewController(withIdentifier: "ActionViewController") as! ActionViewController 
     self.window?.rootViewController = ActionView 
    } else if(urlPath == "/VoiceCommandView") { 

     let VoiceCommandView: ViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
     self.window?.rootViewController = VoiceCommandView 

    } 
    self.window?.makeKeyAndVisible() 

    return true 

Et dans le TodayExtensionViewController I défini deux schémas d'URL avec la même hôte, mais des chemins différents d'URL. Et fait un simple:

 self.extensionContext?.open(startAppURL! as URL, completionHandler:nil) 

pour le premier bouton, mais a changé l'urlPath pour le second bouton.