web-dev-qa-db-fra.com

Today App Extension Widget Appuyez pour ouvrir l'application contenant

J'ai mis en place un widget Aujourd'hui pour mon application + Devis qui affiche le devis du jour dans le centre de notification à l'aide de ces Apple Docs . Ce que j'aimerais accomplir, c’est d’ouvrir l’application contenant, dans ce cas + Quotes, lorsque l’utilisateur appuie sur le widget + Citations dans sa vue de notification Aujourd'hui. Voir aujourd'hui. J'ai essayé de superposer un bouton sur l'étiquette qui appellerait -(void)openURL:(NSURL *)URL completionHandler:(void (^)(BOOL success))completionHandler lors de son exploitation, puis ouvrez le schéma d'URL personnalisé que j'ai déclaré pour ouvrir l'application contenant. Le problème est qu'il n'ouvre pas l'application contenant.

+Quotes Today App Extension Widget

-(IBAction)myButton:(id)sender {
    NSURL *customURL = [NSURL URLWithString:@"PositiveQuotes://"];
    [self openURL:customURL completionHandler:nil];
}
56
Daniel Storm

EDIT: Ok, juste une petite correction ici. Je l'ai obtenu en plaçant un bouton sur l'étiquette, comme suggéré ci-dessus et le code suivant:

- (IBAction) goToApp: (id)sender { 
    NSURL *url = [NSURL URLWithString:@"floblog://"];
    [self.extensionContext openURL:url completionHandler:nil]; 
  }

Je l'ai associé à un événement "Retouche à l'intérieur". Toutefois, cela entraîne également le lancement de l'application lorsque l'utilisateur fait défiler la vue Aujourd'hui.

=======================================

J'ai rencontré le même problème. Cependant, il semble qu'il n'y ait pas de solution pour l'instant puisque les notes de publication pour la première version bêta d'iOS 8 mentionnent:

Problèmes connus: openURL ne fonctionne pas à partir d'une extension.

Donc, je suppose que nous devrons au moins attendre la version bêta 2.

63
sunseeker

Version Swift 2, selon Apple Doc

extensionContext?.openURL(NSURL(string: "foo://")!, completionHandler: nil)

Swift 3 version

extensionContext?.open(URL(string: "foo://")! , completionHandler: nil)

Et n'oubliez pas d'ajouter des modèles d'URL personnalisés dans Info.plist

enter image description here

49
Quanlong

La réponse de @sunseeker est la bonne mais elle est "cachée" dans les commentaires. Et comme la réponse acceptée dit que ce n'est pas possible, cela peut induire les visiteurs en erreur.

ce code fonctionne:

- (IBAction)launchHostingApp:(id)sender
{
  NSURL *pjURL = [NSURL URLWithString:@"hostingapp://home"];
  [self.extensionContext openURL:pjURL completionHandler:nil];
}

J'utilise Xcode 6.0 (6A215l) avec Yosemite Beta 1.

Et comme Apple dit dans Gestion des scénarios de communes) :

Une extension ne dit pas directement à l’application qui la contient de s’ouvrir; au lieu de cela, il utilise la méthode openURL: completionHandler: de NSExtensionContext pour indiquer au système d'ouvrir l'application qui le contient. Lorsqu'une extension utilise cette méthode pour ouvrir une URL, le système valide la demande avant de l'exécuter.

28
teriiehina

Une autre façon de le faire sans ajouter de bouton caché consiste à ajouter un UITapGestureRecognizer sur le UILabel (assurez-vous de définir userInteractionEnabled sur true sur le libellé). Vérifiez l'état du programme de reconnaissance dans le gestionnaire pour vous assurer que vous avez atteint UIGestureReconizerStateEnded (et non annulé ou en échec), puis exécutez votre code openUrl.

3
EPage_Ed

Juste au cas où, voici la version pour Swift 3 avec la version de gestion des erreurs:

let myAppUrl = URL(string: "main-screen:")!
extensionContext?.open(myAppUrl, completionHandler: { (success) in
    if (!success) {
        print("error: failed to open app from Today Extension")
    }
})

Pour que cela fonctionne, vous devez ouvrir info.plist (ouvrir en tant que code source) et, tout en haut, après cela.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

ajoutez ce qui suit pour que l’application sache quelles URL elle doit gérer Voici le exemple complet de la façon d’ouvrir l’application qui la contient et de partager les valeurs utilisateur par défaut entre application et Extension.

2
Mikita Manko