49 votes

Injection d'événements tactiles à l'échelle du système sur iOS7

Avant iOS7, il était possible d'injecter des événements tactiles avec la fonction GSSendSystemEvent y GSSendEvent les appels d'API privés, par exemple :

Sous iOS7, ces appels semblent toutefois échouer en silence. Une alternative a été suggérée dans Simulation de touches à l'échelle du système dans iOS 7 mais ça ne fonctionne que sur les appareils jailbreakés. https://github.com/kif-framework/KIF semble être une autre option, mais il semble qu'il ne prenne en charge que l'injection d'événements pour l'application en cours plutôt que pour l'ensemble du système (vous ne pourriez donc pas injecter un événement tactile alors que votre application est en arrière-plan, par exemple).

Alors comment injecter des événements tactiles à l'échelle du système sur iOS7, sans jailbreak ?

2voto

richarddas Points 889

Je suppose que vous devez faire cela dans tout le système pour un scénario de test ? Dans ce cas, vous pourriez être bien servi par l'outil d'Apple intitulé Automatisation de l'interface utilisateur un outil basé sur JavaScript, utile pour les tests sur les appareils.

Bien que vous ne puissiez pas simuler une pression sur le bouton d'accueil, vous pouvez par exemple mettre votre application en arrière-plan pendant une durée déterminée :

UIATarget.localTarget().deactivateAppForDuration(seconds);

Voici les documents :

https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef

-4voto

CocoaChris Points 134

Vous pouvez sous-classer UIWindow et écraser sendEvent. Je l'utilise pour mettre en œuvre un modèle d'écouteurs multiples, mais vous pouvez également l'utiliser pour déclencher des événements...

- (void)sendEvent:(UIEvent*)event {
    [super sendEvent:event];
    //NSLog(@"NSEventListenerWindow.sentEvent: %@\n", event);

    // pass all events on to those who listen
    for ( id listener in listeners) {
        if ([listener respondsToSelector:@selector(sendEvent:)]) {
            [listener sendEvent:event]; 
        }
    }
    .....

-5voto

Isaka Points 15

Je pense que vous feriez mieux d'utiliser l'API du service de notification de l'iOS SDK. Ce serait le moyen le plus propre d'obtenir ce que vous voulez.

Conceptuellement, Apple n'a pas (encore) l'intention de permettre à des tiers d'émettre des événements à l'échelle du système, car cela ne cadrerait pas avec le modèle de gestion prudente d'iOS, c'est pourquoi les gens ont recours aux API privées et au jailbreak. Les API privées, comme leur nom l'indique, ne sont pas censées être fiables.

Pensez-y de cette façon, à moins que vous ne soyez responsable de l'ensemble du système, ce qu'une application utilisateur ne peut pas être, vous n'avez vraiment aucune raison de générer des événements à l'échelle du système. Je sais comment Android fait cela, mais c'est une autre histoire (qui n'a pas sa place dans ce sujet).

Sur le Mac, l'api XPC Services permet aux processus de communiquer entre eux, mais ce n'est pas encore une méthode pour générer des événements à l'échelle du système. Je vous suggère d'utiliser l'API de notification du SDK iOS, ce serait probablement la méthode la plus propre pour obtenir ce que vous voulez. Oui, cela va à Apple et revient à l'appareil, mais c'est le mécanisme qui est disponible jusqu'à présent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X