Подтвердить что ты не робот

Как включить/выключить режим полета в IOS 5.1 с использованием частного API

Я пытаюсь включить/выключить режим полета в IOS 5.1 с использованием частных фреймворков.

В AppSupport.framework, RadiosPreferences имеет свойство, чтобы получить/установить режим самолета и установить значение

./AppSupport.framework/RadiosPreferences.h

@property BOOL airplaneMode;

./AppSupport.framework/RadiosPreferences.h

- (void)setAirplaneMode:(BOOL)arg1;

Как я могу использовать эти методы? Нужно ли каким-либо образом использовать dlsym для создания объекта и вызова методов? Может ли кто-нибудь помочь мне с образцом кода или способами сделать это.

4b9b3361

Ответ 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

Здесь страница Saurik при подписании кода и правах

Ответ 2

Добавьте com.apple.SystemConfiguration.SCPreferences-write-access в свой экран прав и установите его в true (вам может понадобиться создать слой). Я считаю, что следующее должно работать - если это не так, я могу посмотреть позже сегодня вечером, когда смогу проверить его:

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