openURL pas de l'Action de l'Extension
Je ajouter le code suivant:
- (IBAction)done {
//Return any edited content to the host app.
//This template doesn't do anything, so we just echo the passed in items.
NSURL *url = [NSURL URLWithString:@"lister://today"];
[self.extensionContext openURL:url completionHandler:^(BOOL success) {
NSLog(@"fun=%s after completion. success=%d", __func__, success);
}];
[self.extensionContext completeRequestReturningItems:self.extensionContext.inputItems completionHandler:nil];
}
après que j'ai créer l'Action de l'Extension de la cible. Mais il ne peut pas travailler.
Mon but est que: lorsque l'utilisateur d'afficher des photos dans les Photos.app (iOS par défaut de Photos.app ou appelé galerie), et cliquez sur le bouton partager pour le lancement de notre extension de vue.
Nous pouvons transférer l'image à partir de Photos.application sur mon propre application et de les traiter ou de les télécharger l'image dans mon application.
J'ai aussi essayer de "CFBundleDocumentTypes", mais il peut également ne pas fonctionner.
Toute aide sera appréciée.
- double possible de openURL à partir d'aujourd'Hui Extension
- Vous devez également ajouter un Schéma d'URL dans l'application de l'info/propriétés de la zone. Voir la documentation de "l'application de la communication" et "à l'Aide de Schémas d'URL à Communiquer avec les Applications". <publié pour les futurs chercheurs>
- Salut, je suis en utilisant tableviewcontroller, mais pas en mesure d'utiliser extensionContext dans cette classe. peut quelqu'un m'aider plz sur ce
- Pour ceux qui recherchent plus de précisions; Apple est assez clair dans la documentation autour de ce qui peut et ne peut pas ouvrir les Url (developer.apple.com/library/ios/documentation/General/...). Le texte de cette doc:
A Today widget (and no other app extension type) can ask the system to open its containing app by calling the openURL:completionHandler: method of the NSExtensionContext class.
Une intéressante solution de contournement est ci-dessous dans les commentaires.
Vous devez vous connecter pour publier un commentaire.
C'est par la conception. Nous ne voulons pas des Actions Personnalisées pour devenir des lanceurs.
C'est ce que j'ai l'habitude de faire:
Veuillez noter que dans ce cas je suis d'instanciation de cet appel de la UIInputViewController.
Cette méthode devrait également fonctionner en utilisant le schéma de l'URL de l'application
Mise à JOUR 04/17/2015: Cela ne fonctionne pas avec iOS 8.3. Nous sommes à la recherche d'une solution et nous mettrons à jour la réponse bientôt
Mise à JOUR 06/01/2015: Nous avons trouvé une solution qui fonctionne sous iOS 8.3
Cela permettra de trouver un répondeur pour envoyer le openURL pour.
Vous avez besoin d'ajouter cette extension qui remplace le performSelector la rapidité et l'aide à la construction du mécanisme:
Mise à JOUR 06/15/2015: Objective-C
Quelqu'un a demandé pour le code en Objective-C si elle est ici. Je ne vais pas à l'exécuter comme je n'ai pas le temps maintenant, mais il devrait être assez simple:
Comme mentionné, je n'ai pas d'exécuter ce code Objective-C, c'est juste une conversion à partir du code Swift. S'il vous plaît laissez-moi savoir si vous rencontrez le moindre problème et la solution, et je vais le mettre à jour. Aujourd'hui, je suis juste en utilisant swift et, malheureusement, mon cerveau est à déconseiller Objective-C
Mise à JOUR 05/02/2016: Obsolète fonctions
Comme indiqué par @KyleKIM le Sélecteur de fonctions ont été remplacés dans Swift 2.2 par #sélecteur. Aussi, il y a une fonction qui est obsolète et sera probablement retiré dans Swift 3.0 donc je fais des recherches pour trouver une alternative.
Mise à JOUR 09/16/2016: XCode 8, Swift 3.0 et iOS10
Le code suivant est encore à travailler sur les versions indiquées. Vous obtiendrez des mises en garde:
Mise à JOUR 6/15/2017: XCode 8.3.3
if ([responder respondsToSelector: @selector(openURL:)]){
cependant la ligne de[responder performSelector: @selector(openURL:) withObject: [NSURL URLWithString:@"www.google.com" ]];
ne pas faire n'importe quoiUIApplication
, parce que c'est le seul objet qui implémenteopenURL
. Normalement, lorsque vous voulez ouvrir un URL à partir de l'app, vous utilisezsharedApplication
mais il est annoté comme n'étant pas accessible à partir d'une extension. Cependant iOS ne pouvez pas vous empêcher de regarder dans le répondeur de la chaîne. Neat.[self nextResponder]
retournenil
. J'ai joué un peu et si je commence avecself.parentViewController
au lieu deself
parfois fonctionne, par exemple, ne fonctionne pas lors de la première part et ne travail plus tard. J'ai vérifié sur iOS 9.2 (simulateur et réel de l'appareil)Essayer ce code.
Apple a accepté la solution suivante, qui est le "même" code d'une application hôte serait de l'utiliser. Il fonctionne sur tous les iOS 8 versions à ce jour (testé sur iOS 8.0 - iOS 8.3).
Travaillé solution Swift 3.0 & 4.0:
Explication:
En extension, l'api est limitée par le compilateur de ne pas vous laisser utiliser openURl(:URL) comme dans un conteneur d'application. Toutefois, l'api est encore ici.
Et nous ne pouvons pas effectuer la méthode dans notre classe, jusqu'à ce que nous le déclarer, ce que nous voulons vraiment, c'est de laisser UIApplication pour exécuter cette méthode.
Rappel à l'intervenant de la chaîne, on peut utiliser
à boucle à UIApplication objet.
Et mes applications avec cette méthode passer le processus d'examen, donc ne vous inquiétez pas pour l'utiliser.
Solution de travail (testé sur iOS 9.2) pour l'Extension du Clavier. Cette catégorie ajoute méthode spéciale pour l'accès à l'caché
sharedApplication
objet et ensuite appeleropenURL:
sur elle.(Bien sûr, alors vous devez utiliser
openURL:
méthode avec votre app régime.)Il semble être un bug, parce que les docs disent:
Je l'ai signalé aujourd'hui: http://openradar.appspot.com/17376354 Vous devriez dupe, si vous avez un peu de temps libre.
It's a duplicate of rdar://17376354
. Le rapport de bug point de la question, le mieux est l'occasion de Pomme de fixation.In some cases, it can make sense for a Today widget to request its containing app to open.
NSExtensionContext seulement de soutenir l'openURL fonction dans l'aujourd'hui de l'extension ,de ce qui est décrit dans la pomme de documents sur NSExtensionContext.Les mots d'origine est "Chaque point d'extension détermine si à l'appui de cette méthode, ou en vertu de laquelle les conditions à l'appui de cette méthode. Dans iOS 8.0, seulement aujourd'Hui le point d'extension prend en charge cette méthode."
Une solution possible:
Créer et ajouter une petite UIWebView à votre vue et à terme, c'est la méthode loadRequest avec le schéma d'url vous avez défini ci-dessus.
C'est une solution de contournement et je ne suis pas sûr de ce que Apple va dire à ce sujet.
Bonne chance!
Une version mise à jour de Julio Bailon réponse moderne Swift syntaxe:
Il n'est pas nécessaire pour une extension de NSObject maintenant.
Remarque: vous devez attendre que la vue doit être joint à la vue de la hiérarchie avant d'appeler ce code sinon le répondeur de la chaîne ne peut pas être utilisé.
Solution pour le dernier iOS SDK 10.2. Toutes les solutions précédentes utiliser l'api obsolètes. Cette solution est basée sur la recherche UIApplication UIResponder de l'hébergement de l'application (Cette application qui créent le contexte d'exécution pour notre extension). La solution ne peut être fourni en Objective-C, car il y a 3 arguments de la méthode à invoquer et c'est impossible à faire avec des
performSelector:
méthodes. Pour appeler ce pas la méthode dépréciéeopenURL:options:completionHandler:
nous avons besoin d'utiliser NSInvocation instance qui n'est pas disponible en Swift. La solution peut être appelé à partir d'Objective-C et Swift (toute version). Je dois dire que je ne sais pas encore si la solution sera valide pour apple processus d'examen.UIViewController+OpenURL.h
UIViewController+OpenURL.m
De Swift 3, Vous pouvez exécuter cette opération uniquement si Votre vue-contrôleur est dans la vue de la hiérarchie. C'est le code comment je l'utilise:
Code suivant fonctionne sur Xcode 8.3.3, iOS10, Swift3 et Xcode 9, iOS11, Swift4 sans les avertissements du compilateur:
Assurez-vous que votre application prend en charge le lien Universel, sinon il va ouvrir le lien dans le navigateur. Plus d'infos ici: https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html
UIViewController
) avec xcode 9, swift 3 et iOS 10.3.1SLComposeServiceViewController
àUIViewController
dans le ShareViewController ? Je pense que cela devrait être le problème, mais je n'en suis pas sûr.UIViewController
dans ShareViewController. Pas à l'aide deSLComposeServiceViewController
.Ma conjecture est que c'est intentionnellement pas possible. Le
openURL:completionHandler:
bloc dit qu'il ne peut être pris en charge dans tous les types d'extension, et l'action de l'extension docs explicitement dire:Je pense qu'une part de l'extension peuvent être plus approprié, mais les docs pour les deux types suggèrent que l'expérience devrait être intégré dans l'application hôte, en ne prenant pas les utilisateurs de votre application, de sorte qu'il pourrait ne pas permettre que, pour que soit. Alors, peut-être suivre de la part de l'extension de docs et il suffit de télécharger votre image à partir de l'intérieur de l'extension de l'INTERFACE utilisateur, comme il le suggère?
Chaque application type d'extension prend en charge "extensionContext openURL".
J'ai testé sur iOS 8 bêta 4 et a trouvé aujourd'Hui une extension de soutient, mais d'extension du clavier ne fonctionne pas.
Seulement l'aujourd'Hui de l'Extension semble fonctionner.
Il n'est pas 100% documentée, mais un employé d'apple indique expressément que les extensions Clavier ne prennent pas en charge openURL:completionHandler.
La documentation dit:
Si dans la pratique, l'Action, l'Action, le Clavier et le fournisseur de documents ne pas travailler pour n'importe qui (beta 5) et seulement aujourd'Hui Extension prend en charge.
Comme apple document
"Aujourd'Hui à un widget (et pas d'autres appli type d'extension) peut demander au système pour ouvrir son contenant de l'application par l'appel de la openURL:completionHandler: méthode de la NSExtensionContext classe."
Pour les autres extensions, j'ai utilisé cette solution