Ответ 1
Как 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 - это файл, в котором предпочтение сохраняется в режиме самолёта, поэтому вам нужен доступ на запись.
Нет, вам не нужно использовать dlopen
или dlsym
для доступа к этому API. Вы можете напрямую добавить структуру AppSupport в проект напрямую (за исключением того, что AppSupport.framework
хранится на вашем Mac в папке PrivateFrameworks
). Затем просто создайте экземпляр объекта RadiosPreferences
и используйте его в обычном режиме. Преимущество - важная часть.
Для вашего кода сначала использовать класс-дамп, или class-dump-z, чтобы создать файл RadiosPreferences.h и добавить его в свой проект. Тогда:
#import "RadiosPreferences.h"
и do
RadiosPreferences* preferences = [[RadiosPreferences alloc] init];
preferences.airplaneMode = YES; // or NO
[preferences synchronize];
[preferences release]; // obviously, if you're not using ARC
Я тестировал это только для jailbroken-приложения. Я не уверен, возможно ли получить это право, если устройство не взломанное (см. Комментарий Виктора Ронина). Но если это приложение для джейлбрейка, убедитесь, что вы не забыли подписать исполняемый файл с файлом прав. Я обычно подписываю приложения для джейлбрейков с ldid, поэтому, если мой файл прав entitlements.xml, то после создания в Xcode без подписи кода я выполнил бы
ldid -Sentitlements.xml $BUILD_DIR/MyAppName.app/MyAppName