14

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

在 AppSupport.framework 中,RadiosPreferences具有获取/设置飞行模式和设置值的属性

./AppSupport.framework/RadiosPreferences.h

@property BOOL airplaneMode;

./AppSupport.framework/RadiosPreferences.h

- (void)setAirplaneMode:(BOOL)arg1;

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

4

2 回答 2

7

正如jrtc27 在他的回答中所描述的我在这里提到过),您需要授予您的应用程序特殊权利才能成功更改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存储在 Mac 上的PrivateFrameworks文件夹下的例外情况除外)。然后,只需实例化一个RadiosPreferences对象,并正常使用它。权利是重要的部分。

对于您的代码,首先使用 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 中构建之后,我会执行

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

这是 Saurik 关于代码签名和权利的页面

于 2012-11-19T23:18:40.483 回答
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
于 2012-11-15T08:04:00.210 回答