I am trying to toggle on/off airplane mode in IOS 5.1 using private frameworks.
In AppSupport.framework, RadiosPreferences
has a property to get/set the airplane mode and set the value
./AppSupport.framework/RadiosPreferences.h:
@property BOOL airplaneMode;
./AppSupport.framework/RadiosPreferences.h:
- (void)setAirplaneMode:(BOOL)arg1;
How can I use these methods? Do I need to use dlsym
somehow to create an object and call the methods? Can someone help me with sample code or ways to do it.
As jrtc27 describes in his answer (and I mentioned here), you need to grant your app a special entitlement in order to successfully change the airplaneMode
property.
Here's a sample entitlements.xml file to add to your project:
<!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 is the file where the airplane mode preference is actually stored, so that's what you need write access to.
No, you don't need to use dlopen
or dlsym
to access this API. You can add the AppSupport framework to your project directly (with the exception that AppSupport.framework
is stored on your Mac under the PrivateFrameworks
folder). Then, just instantiate a RadiosPreferences
object, and use it normally. The entitlement is the important part.
For your code, first use class-dump, or class-dump-z, to generate the RadiosPreferences.h file, and add it to your project. Then:
#import "RadiosPreferences.h"
and do
RadiosPreferences* preferences = [[RadiosPreferences alloc] init];
preferences.airplaneMode = YES; // or NO
[preferences synchronize];
[preferences release]; // obviously, if you're not using ARC
I've only tested this for a jailbroken app. I'm not sure if it's possible to acquire this entitlement if the device isn't jailbroken (see Victor Ronin's comment). But, if this is a jailbreak app, make sure you remember to sign your executable with the entitlements file. I normally sign jailbreak apps with ldid, so if my entitlements file is entitlements.xml, then after building in Xcode without code signing, I would execute
ldid -Sentitlements.xml $BUILD_DIR/MyAppName.app/MyAppName
Here's Saurik's page on code signing, and entitlements
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With