2012-09-09 11 views
7

Sto provando a creare un'app che funzioni esclusivamente su iDevices jailbroken. Ho giá fatto un rilevamento jailbreak:Nessun rilevamento jailbreak

([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]);{ 
    UIAlertView *cydiaisinstalled=[[UIAlertView alloc]initWithTitle:@"Cydia is installed!" 
                  message:@"You can use Respring!" 
                  delegate:self 
                cancelButtonTitle:@"OK" 
                otherButtonTitles:nil]; 
    [cydiaisinstalled show]; 
}} 

Ma ora ho bisogno la cosa inversa. Ho bisogno di un rilevamento NON JAILBREAK.

Ho bisogno del tuo aiuto Ho bisogno di questo per Weblin. Mi aiuti per favore!!!

+2

Perché rilevare i dispositivi jailbroken se funziona solo su di essi? Se è possibile installare l'app da un'altra fonte, quindi utilizzare l'app, è un dispositivo jailbroken. – Sulthan

risposta

8

Prova ad accedere a qualsiasi file al di fuori della sandbox dell'applicazione. Ad esempio:

BOOL IsDeviceJailbroken(void) { 
    #if TARGET_IPHONE_SIMULATOR 
    return NO; 
    #else 
    return [[NSFileManager defaultManager] fileExistsAtPath: @"/bin/bash"]; 
    #endif 
} 

Si noti che avere Cydia installato e avere un dispositivo jailbroken sono due cose diverse.

5

ho scritto una funzione che rileva se il dispositivo è jailbroken per un'altra questione, ma sembra rilevante qui:

- (BOOL) isJailbroken() { 

    //If the app is running on the simulator 
    #if TARGET_IPHONE_SIMULATOR 
     return NO; 

    //If its running on an actual device 
    #else 
     BOOL isJailbroken = NO; 

     //This line checks for the existence of Cydia 
     BOOL cydiaInstalled = [[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]; 

     FILE *f = fopen("/bin/bash", "r"); 

     if (!(errno == ENOENT) || cydiaInstalled) { 

      //Device is jailbroken 
      isJailbroken = YES; 
     }    
     fclose(f); 
     return isJailbroken; 
    #endif 
} 

Questa funzione utilizza due controlli per vedere se il telefono è jailbroken: è prima controlla se Cydia è installato. Non tutti i dispositivi jailbroken hanno installato Cydia, anche se molti lo fanno, quindi controllo anche l'esistenza di bash, che appare anche solo su dispositivi jailbroken. Nota che questa funzione funzionerà in quasi tutti i casi, ma probabilmente non è al 100%. Le uniche persone che non hanno Cydia nel loro iDevice jailbroken sono probabilmente quelli che stanno sperimentando con dispositivi jailbroken e non li usano per vantaggi come tweaks e temi.

+1

non dovrebbe 'isJailbroken' essere' YES' se 'cydiaInstalled'? hai un '!' di fronte a 'cydiaInstalled' nel tuo codice. – Nate

+0

@Nate - Grazie per quello. Suppongo che l'abbia appena trascurato. – pasawaya

+0

Non è possibile che "&&" sia un "||" e perché controllare "/ bin/bash" quando abbiamo già trovato Cydia.app? – Andreas

3

OK grazie per tutte le risposte ma l'ho scoperto da solo. Ecco il codice:

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) { 
    //insert action if cydia is installed 
} 
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]] == NO) { 
    //insert action if Cydia is not installed 
} 

Con questo codice è possibile rilevare qualsiasi applicazione sul vostro iDevice fintanto che l'applicazione ha uno schema di URL si possono trovare la maggior parte lo schema URL qui: http://handleopenurl.com

PS: devi sostituire la parte verde con le tue azioni :)

+0

Come ho detto nella mia risposta, l'apertura di Cydia non è un metodo universalmente corretto per verificare se il dispositivo è jailbroken perché non tutti iDevice jailbreak hanno installato Cydia. – pasawaya

+0

Ma l'utente normale ha installato cydia :) – user1658674

+0

Questo è vero, e sono sicuro che stai prendendo di mira questa base di utenti, quindi per i tuoi scopi solo il controllo di Cydia va bene. – pasawaya

Problemi correlati