2012-05-04 17 views
13

Estoy intentando activar/desactivar el modo avión en IOS 5.1 utilizando marcos privados.Cómo activar/desactivar el modo avión en IOS 5.1 utilizando la API privada

En AppSupport.framework, RadiosPreferences tiene una propiedad para obtener/establecer el modo avión y establecer el valor

./AppSupport.framework/RadiosPreferences.h:

@property BOOL airplaneMode; 

./ AppSupport.framework/RadiosPreferences.h:

- (void)setAirplaneMode:(BOOL)arg1; 

¿Cómo puedo usar estos métodos? ¿Necesito usar dlsym de alguna manera para crear un objeto y llamar a los métodos? ¿Alguien puede ayudarme con el código de muestra o las formas de hacerlo?

+0

¿alguna vez resolver esto? – ninjaneer

Respuesta

5

Como jrtc27 describes in his answer (y I mentioned here), es necesario conceder a la aplicación de un derecho especial en orden a con éxito cambiar la propiedad airplaneMode.

Aquí hay un ejemplo de archivo entitlements.xml para agregar a su proyecto:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>com.apple.SystemConfiguration.SCDynamicStore-write-access</key> 
    <true/> 
    <key>com.apple.SystemConfiguration.SCPreferences-write-access</key> 
    <array> 
     <string>com.apple.radios.plist</string> 
    </array> 
</dict> 
</plist> 

com.apple.radios.plist es el archivo donde la preferencia modo avión se almacena, así que eso es lo que necesita escribir acceso a.

No, no es necesario utilizar dlopen o dlsym para acceder a esta API. Puede agregar el marco AppSupport a su proyecto directamente (con la excepción de que AppSupport.framework se almacena en su Mac bajo la carpeta PrivateFrameworks). Luego, solo crea una instancia de un objeto RadiosPreferences y úsalo normalmente. El derecho es la parte importante.

Para su código, primero use class-dump, o class-dump-z, para generar el archivo RadiosPreferences.h, y agréguelo a su proyecto. Entonces:

#import "RadiosPreferences.h" 

y hacer

RadiosPreferences* preferences = [[RadiosPreferences alloc] init]; 
preferences.airplaneMode = YES; // or NO 
[preferences synchronize]; 
[preferences release];   // obviously, if you're not using ARC 

sólo lo he probado esto para una aplicación de jailbreak. No estoy seguro de si es posible adquirir esta autorización si el dispositivo no tiene jailbreak (consulte el comentario de Victor Ronin). Pero, si se trata de una aplicación de jailbreak, asegúrese de recordar firmar su archivo ejecutable con el archivo de derechos. Normalmente firmo aplicaciones jailbreak con ldid, por lo que si mi archivo de derechos es derechos.xml, a continuación, después de la construcción en Xcode without code signing, me ejecutar

ldid -Sentitlements.xml $BUILD_DIR/MyAppName.app/MyAppName 

Here's Saurik's page on code signing, and entitlements

+2

Puedo confirmar que funciona en iOS 6.1. Además, asegúrese de que los derechos incorporados xml usen terminaciones de línea UNIX, de lo contrario, el kernel no ejecutará la aplicación. – Zmaster

+0

@Zmaster ¿Confirma también que esto no funcionará en un teléfono roto no retenido? – Lolo

+0

@Lolo Si está hablando de usar esto en una aplicación AppStore, definitivamente no es posible. Necesita incluir AppSupport (un Framework privado) y agregar el derecho (también reservado): si hace alguno de estos, su aplicación será rechazada. – Zmaster

3

Agregue com.apple.SystemConfiguration.SCPreferences-write-access a sus derechos y configúrelo en verdadero (puede que necesite crear el plist). Creo que el siguiente debería funcionar - si lo hace, no puedo mirar esta noche cuando estoy capaces de probarlo:

NSBundle *bundle = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/AppSupport.framework"]; 
BOOL success = [bundle load]; 

Class RadiosPreferences = NSClassFromString(@"RadiosPreferences"); 
id radioPreferences = [[RadiosPreferences alloc] init]; 
[radiosPreferences setAirplaneMode:YES]; // Turns airplane mode on 
+1

El derecho "com.apple.SystemConfiguration.SCPreferences-write-access" va más allá de la API privada. Solo está disponible en dispositivos jailbreak. –

+0

Bueno, no puede usarlo sin ese derecho por lo que sé ... – jrtc27

Cuestiones relacionadas