作为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 是实际存储飞行模式首选项的文件,因此您需要对其进行写访问。
否,您无需使用dlopen 或dlsym 即可访问此API。您可以直接将 AppSupport 框架添加到您的项目中(AppSupport.framework 存储在您的 Mac 上的 PrivateFrameworks 文件夹下除外)。然后,只需实例化一个RadiosPreferences 对象,就可以正常使用了。权利是重要的部分。
对于您的代码,首先use class-dump 或class-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