如何使用私有API在IOS 5.1中打开/关闭飞行模式

时间:2012-05-04 16:25:09

标签: iphone ios iphone-privateapi

我正在尝试使用私有框架在IOS 5.1中打开/关闭飞行模式。

在AppSupport.framework中,RadiosPreferences有一个属性来获取/设置飞行模式并设置值

./ AppSupport.framework / RadiosPreferences.h

@property BOOL airplaneMode;

./ AppSupport.framework / RadiosPreferences.h

- (void)setAirplaneMode:(BOOL)arg1;

我该如何使用这些方法?我是否需要以某种方式使用dlsym来创建对象并调用方法?有人可以帮我提供示例代码或方法。

2 个答案:

答案 0 :(得分:6)

作为jrtc27 describes in his answer(以及I mentioned here),您需要为您的应用授予特殊权利,才能成功更改airplaneMode属性。

以下是要添加到项目中的示例entitlements.xml文件:

<!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 是实际存储飞机模式偏好的文件,因此您需要具有写入权限。

,您无需使用dlopendlsym来访问此API。您可以直接将 AppSupport 框架添加到项目中(AppSupport.framework文件夹下的PrivateFrameworks存储在您的Mac上)。然后,只需实例化一个RadiosPreferences对象,并正常使用它。权利是重要的部分。

对于您的代码,首先是use class-dumpclass-dump-z,以生成RadiosPreferences.h文件,并将其添加到您的项目中。然后:

#import "RadiosPreferences.h"

并做

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

我只是为越狱应用测试了这个。如果设备没有越狱,我不确定是否有可能获得此权利(参见Victor Ronin的评论)。但是,如果这是一个越狱应用程序,请确保您记得使用权利文件签署可执行文件。我通常使用ldid签署越狱应用,所以如果我的权利文件是 entitlements.xml ,那么在使用Xcode without code signing构建之后,我会执行

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

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

答案 1 :(得分:3)

com.apple.SystemConfiguration.SCPreferences-write-access添加到您的权利plist并将其设置为true(您可能需要创建plist)。我相信以下内容应该有效 - 如果不能,我今晚可以看一下,当我能够测试它时:

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