2012-09-09 10 views
7

Estoy tratando de hacer una aplicación que funcione únicamente en iDevices jailbreak. Ya hice una detección de jailbreak:No hay detección de 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]; 
}} 

Pero ahora necesito lo contrario. Necesito una detección NON JAILBREAK.

Necesito tu ayuda Necesito esto para Weblin. ¡¡¡Por favor, ayúdame!!!

+2

¿Por qué detectar dispositivos con jailbreak si solo funciona en ellos? Si puede instalar la aplicación desde otra fuente y luego con la tienda de aplicaciones, entonces es un dispositivo con jailbreak. – Sulthan

Respuesta

8

Intente acceder a cualquier archivo fuera de la zona de pruebas de la aplicación. Por ejemplo:

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

Tenga en cuenta que tener Cydia instalado y tener un dispositivo con jailbreak son dos cosas diferentes.

5

escribí una función que detecta si el dispositivo es jailbreak para otra pregunta, pero parece relevante aquí:

- (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 
} 

Esta función utiliza dos comprobaciones para ver si el teléfono es jailbroken: en primer lugar comprueba si Cydia esta instalado. No todos los dispositivos Jailbroken tienen instalado Cydia, aunque la mayoría sí, así que también compruebo la existencia de bash, que también solo aparece en los dispositivos con jailbreak. Tenga en cuenta que esta función funcionará en casi todos los casos, pero probablemente no sea 100%. Las únicas personas que no tienen Cydia en su iDevice jailbreak son probablemente aquellos que están experimentando con dispositivos jailbreak y no los utilizan para obtener ventajas como ajustes y temas.

+1

no debería 'isJailbroken' ser' SÍ' si 'cydiaInstalled'? tiene un '!' delante de 'cydiaInstalled' en su código. – Nate

+0

@Nate - Gracias por eso. Supongo que simplemente lo pasé por alto. – pasawaya

+0

Souldn't el "&&" ser un "||" y ¿por qué hacer el control de "/ bin/bash" cuando ya encontramos Cydia.app? – Andreas

3

OK gracias por todas las respuestas, pero me enteré por mi cuenta. Aquí está el código:

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 este código se puede detectar cualquier aplicación en su iDevice, siempre y cuando la aplicación tiene un esquema de URL se puede encontrar la mayor parte del esquema de URL aquí: http://handleopenurl.com

PD: tiene que reemplazar la parte verde con sus acciones :)

+0

Como dije en mi respuesta, abrir Cydia no es un método universalmente correcto para verificar si el dispositivo tiene jailbreak porque no todos los i-device con jailbreak han instalado Cydia. – pasawaya

+0

Pero el usuario normale hase cydia instalado :) – user1658674

+0

Eso es cierto, y estoy seguro de que está apuntando a esta base de usuarios, por lo que para su propósito, solo revisar Cydia está bien. – pasawaya

Cuestiones relacionadas