iOS Как использовать Entitlement.plist для указания свойства моего приложения

Я использую устройство Jailbreak + Appsync + iOS5.0.1 (без лицензии разработчика, но с некоторыми хитростями я могу запустить свое приложение на устройстве)

Теперь я хочу использовать частный API launchApplicationWithIdentifier:suspended:. Поэтому мне нужно добавить

<key>com.apple.springboard.launchapplications</key>
<true/>

в файл myApp.entitlements.plist. Тогда это должно работать, но я все еще получаю ошибку

'Receiver type 'UIApplication' for instance message does not declare a method 
 with selector 'launchApplicationWithIdentifier:suspended:''

Затем я обнаружил, что кто-то сказал, что подпись кода должна быть включена, если я хочу использовать Entitlements.plist. Это правда? У меня должна быть лицензия разработчика?

Или есть другой способ использовать этот метод? Я прочитал какой-то метод о том, как использовать частный API. Это кажется трудным. Я новичок в iOS-разработке.

Спасибо.


person wyp    schedule 17.06.2012    source источник
comment
примечание: если вам интересно, почему я сказал, что не знаю на ваш другой вопрос, но ответил на этот, это потому, что ваш другой вопрос указан с использованием Xcode. этот не сделал. В настоящее время я знаю только, как это сделать вне Xcode. Обычно я создаю с помощью Xcode (без подписи кода), а затем подписываю код вне Xcode (с ldid) при создании приложений для джейлбрейка.   -  person Nate    schedule 19.06.2012


Ответы (1)


Я вижу две проблемы/вопроса в вашем сообщении:

1) вы получаете сообщение об ошибке

'Тип получателя 'UIApplication' для экземпляра сообщения не объявляет метод с селектором 'launchApplicationWithIdentifier: приостановлено:''

Это ошибка компилятора? Звучит так, как будто это так. Вот в чем дело. В наборе общедоступных фреймворков есть множество классов Objective-C, в которых все еще есть некоторые методы private. Таким образом, в обычных заголовках (файлах .h) для общедоступных фреймворков эти частные методы не будут перечислены. Но они есть в динамических библиотеках. Если вы хотите создать приложение, которое их использует, то один из способов решить проблему — найти копию полного заголовка.

Например, вот копия полного заголовка UIApplication.h .

Затем вы можете скопировать объявление методов private и в своем собственном коде объявить их следующим образом:

// Used to disable warning for non-public methods
@interface UIApplication (Extensions)
  - (BOOL)launchApplicationWithIdentifier:(id)identifier suspended:(BOOL)suspended;
@end

Это должно помешать компилятору жаловаться на то, что закрытый метод не существует.

В будущем вам следует прочитать об class-dump, инструменте, который вы можете запускать в общедоступных или частных фреймворках в SDK и самостоятельно генерировать обратно заголовки, подобные приведенному выше. Они будут меняться с каждым выпуском SDK, поэтому хорошо иметь возможность создавать их самостоятельно.

2) вы спрашиваете об использовании прав без подписи кода.

Во-первых, прочитайте, что Саурик первоначально написал об этом здесь. Да, вам необходимо подписать права. Но нет, это не обязательно должен быть сертификат Apple на взломанных телефонах. Вы можете подделать знак кода, загрузив исполняемый файл ldid и выполнив

cd MyAppName.app
ldid -Sentitlements.xml MyAppName

при условии, что ваше приложение называется MyAppName и вы создали файл прав entitlements.xml. Я полагаю, что этот файл прав будет работать для вас, если вы подделаете его кодовой подписью с помощью ldid:

<!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.springboard.launchapplications</key>
    <true/>
  </dict>
</plist>

Будь осторожен. Я нашел ldid в Интернете в нескольких местах. Я действительно не уверен, какой из них правильный. Я помню, что однажды я пытался это сделать, и версия ldid, которую я использовал, не работала для подписания прав. Я скачал ldid из другого источника, и тогда все заработало. Так что будьте осторожны.

person Nate    schedule 19.06.2012
comment
Спасибо за ваш ответ. Наконец мне это удалось, вы можете прочитать эту ссылку. Для первого пункта. Если я импортирую UIApplication, сгенерированный с помощью class-dump, я получаю ошибку переопределения. Что касается второго пункта, я не пробовал, но вроде нормально :-). В целом, чтобы использовать launchApplicationWithIdentifier:suspended, я должен упаковать свое приложение в файл deb, чтобы установить его как системное приложение (например, «Телефон», «Сообщения»), чтобы предоставить ему корневое свойство. Затем включите этот метод там, где вы хотите его использовать, и просто вызовите его. - person wyp; 19.06.2012
comment
@wyp, спасибо, что поймали это. Это немного отличается, когда вы пытаетесь использовать закрытые методы в классах, которые находятся в общедоступном API (например, UIApplication), в отличие от классов, которые полностью закрыты. Я обновил свой ответ на (1) выше, чтобы показать, как вы можете использовать частный метод UIApplication. - person Nate; 20.06.2012