2013-09-06 12 views
16

Invece di fare in modo che l'utente tenga premuto il pulsante home, vorrei avviare Siri a livello di programmazione all'interno della mia applicazione. Poiché non ci sono API pubbliche disponibili per realizzare questo obiettivo, mi piacerebbe sapere se qualcuno è stato in grado di avviare Siri a livello di programmazione tramite API privata e, in caso affermativo, quale API privata hai utilizzato?È possibile richiamare Siri a livello di programmazione all'interno della mia app utilizzando API private?

Non sono interessato a nessun valore restituito da Siri. Tutto quello che voglio fare è lanciarlo.

+0

iOS 6 in poi, richiede diritti per avviare l'app anche tramite private API. Puoi comunque avviare l'app in modo programmatico se hai un telefono jailbroken. La soluzione jailbroken è accettabile? – Jailbroken

+0

@Bugivore, Siri non è in realtà una "App", * per sé *. Quindi, non si avvia come faresti con altre app. Ma, se vedi sotto, penso di avere una soluzione che funziona (funziona per me). – Nate

+0

@Nate - Ottimo suggerimento. D'accordo che utilizza solo API private quindi non dovrebbe essere necessario il jailbroken del telefono .. – Jailbroken

risposta

13

la risposta dipende un po 'dal fatto che questo è per un app che non andrà all'App Store (app aziendale o app personale/hobby) o se verrà effettivamente eseguita sui telefoni jailbroken.

Se è possibile fare affidamento su un telefono jailbreak e utilità di jailbreak come MobileSubstrate, quindi credo che sia possibile implementare un metodo per aprire Siri proprio come Ryan Petrich's libActivator does, come I show in this other answer.

Tuttavia, se si sta costruendo per il normale, incarcerati telefoni, penso ancora che è possibile "hack" che (con le API private), simulando il modo in cui l'utente apre Siri. Per prima cosa, premi il pulsante Home, tienilo premuto per un po ', quindi rilascialo.

Questo codice funziona per me (iOS 6.1):

#import "GSEvent.h" 

e

- (void)launchSiri { 
    [self simulateTouchEvent: kGSEventMenuButtonDown]; 

    double delayInSeconds = 1.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [self simulateTouchEvent: kGSEventMenuButtonUp]; 
    }); 
} 

- (void)simulateTouchEvent: (GSEventType)type 
{ 
    struct GSEventRecord record; 
    memset(&record, 0, sizeof(record)); 
    record.type = type; 
    record.timestamp = GSCurrentEventTimestamp(); 
    GSSendSystemEvent(&record); 
} 

Questo si basa su avere l'intestazione GSEvent.h, che non fa parte del set pubblico di intestazioni . Credo di aver ottenuto il mio here, as well as GSWindow.h that it pulls in. Ovviamente, dovresti quindi scaricare queste due intestazioni e aggiungerle al tuo progetto.

Questo codice è nel framework privato GraphicsServices, quindi è necessario aggiungere tale framework al progetto. Fatelo proprio come l'aggiunta di un quadro normale, ma è necessario passare in rassegna ad un posto come

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/PrivateFrameworks/GraphicsServices.framework 

per trovarlo (percorso corretto per la directory di installazione Xcode e SDK).

Disclaimer: ha fatto prova di questo su un telefono jailbroken, ma era sicuramente all'interno di un'applicazione normale, installato nella zona /var/mobile/Applications/ sandbox, e sono sicuro che il 99% non ho fatto tutto ciò che dipende dall'essere jailbroken.

+0

Qualcuno ha capito che funziona su iOS 8? – Mark

Problemi correlati