Запускаем iPhone приложение на телефоне
Наконец-то выдалась свободная минутка, чтобы написать пост. Ну хотя бы начать…
И так, сегодня речь пойдет о том, как я заливал свое первое iPhone-приложение на этот самый iPhone (как я писал ранее, приобрел недавно сей легендарный гаджет).
Вообще, идеальный путь iPhone-разработчика таков.
Покупается официальный гаджет, затем нужно зарегаться на http://developer.apple.com/ в роли девелопера, приобрести сертификат разработчика (стоимость самого дешевого составляет 99 USD), получить ключ для подписи приложения, указать его в опциях компилятора, и вроде бы все. Только я пока не понял, как скомпилированный образ заливать официальным способом на девайс, ну да ладно. Рано или поздно мне и с этим придется столкнуться, потом и опишу.
Для меня нет страшнее животного, чем жаба, поэтому пока что пойдем по другому пути, который я сейчас и опишу.
Что нам понадобиться. Да в общем то, кроме mac-компьютера, с установленным xCode и iPhone SDK (качнуть можно все так же http://developer.apple.com/iphone), нужна всего одна вещь — аппарат iPhone c проведенной операцией jailbreak. Что такое jailbreak? Вкраце расскажу. Официально закачать приложение на iPhone можно лишь через электронный магазин AppStore. Разработчики размещают на нем свои приложения, пользователи их покупают с помощью специального стандартного приложения, все довольны. Получить доступ к файловой системе телефона, скопировать туда приложение и запустить его — задачка не из тривиальных. Но тем не менее, вполне решаема. Собственно, джейлбрейк (в переводе с англ. — побег из тюрьмы) как раз таки и заключается в том, чтобы сделать возможным запуск программ из любого места файловой системы, а также копирование программ в обход АппСторе. Есть разные способы, но я использовал такой. Обычно на джейлбрейкнутых (jailbroken) телефонах стоит приложение Cydia — это репозитарий с большим количеством полезных программок. Программки по большей части не визуальные — так называемые демоны. Нужно установить на телефон OpenSSH, AppleTalk (эппловская реализация NetTalk протокола для обмена файлами по сети), и вроде бы и все. Далее подключаем каким либо образом телефон к сети, в которой также находится мак-компьютер. Я это сделал через блютус, так как под маком вайфай карта почему-то не пашет. В перспективе связать мак-комп и айфон через туннель. Далее телефон должен появиться в Finder’е (благодаря программке AppleTalk), как устройство, на него нужно зайти и подключить том. Когда макос спросит имя пользователя и пароль, нужно ввести root/alpine. Примечание: как только я подключился по ssh к терминалу айфона, первое, что я сделал, это поменял пароль рута. Иначе, если у вас стоит на телефоне OpenSSH и при этом включен wifi, любой может подключиться к вам по вайфаю и залогиниться как root. Ну а там уж делов можно натворить…
И так. Как известно, iPhoneOS является *nix-системой. Приложения лежат в папке /private/var/stash/Applications
Установка в общем-то заключается в залитии билда приложения в эту папку и назначение ему прав на исполнение. С этим был конкретный затык, сейчас объясню, почему. Дело в том, что билд приложения xCode представляет собой папку с расширением .app, внутри которой находится исполняемый файл, а также ресурсы программы (картинки, файлы инициализации, nib-файлы и т.д.) Так вот, после того, как скопировали эту папку в /private/var/stash/Applications нужно выставить права (chmod 755) на папку, а также на исполняемый файл! Я сначала просто на папку выставлял, и ничего поэтому не запускалось. Да, чтобы приложение появилось в спрингборде (springboard), я придумал такой трик. Запускаем какое-либо приложение, закрываем его, и вот наше приложение уже и появилось. Хотя все рекомендуют перезапускать спрингборд.
Все, с тем, как залить приложение разобрались. Теперь еще одна проблема, которая возникнет у нас на пути. Заключается она в подписи приложения.
Одно дело — билдить под симулятор, другое дело — под девайс. Нужно понимать, что под симулятор xCode компилирует в машинных кодах платформы x86, если же выбрать target iPhone Device, то компиляция будет производиться уже в машинных кодах ARM-архитектуры. Но есть один нюанс. Для iPhone Device target иксКод не дает билдить без подписи. Обойдем это
Чтобы не платить за сертификат, можно сделать свой, так называемый not trusted/self-signed certicifacte, и им уже подписывать. Для этого нужно воспользоваться Keychain Tool:
— Открыть Applications > Utilities > Keychain Access.
— в меню выбрать Certificate Assistant > Create a Certificate.
— Заполнить имя сертификата (например, «iPhone Pwned Developer») – имя еще пригодится позже.
— Выставить тип сертификата в Self Signed Root.
— Поставить галочку Let me override defaults checkbox. Продолжить.
— Набрать serial number- не имеет значения что, т.к. сертификат все равно свой.
— Выбраь Code Signing в качестве типа сертифиата Certificate. Продолжить.
— Заполнить данные (произвольно). Продолжить.
Но и тут еще не все наши беды заканчиваются. При компиляции велика вероятность, что все закончится с уродской ошибкой:
code sign error: no provisioning profiles found for code signing identity ‘iPhone Developer’
Я долго искал, как это обойти, и нашел.
1. Project/Edit project settings/Build, выбрать All configuration settings и User-defined settings. Создать 2 параметра: PROVISIONING_PROFILE_ALLOWED и PROVISIONING_PROFILE_REQUIRED. Обоим выставить в качестве значения «NO»
2. Project/Edit project settings/Build, выбрать All configuration settings и All settings. В разделе Code Signing найти значение Code Signing Identity и 2. поменять на «iPhone Pwned Developer» (или другое имя, которое было использовано при создании сертификата)
3. В дереве проекта должна быть ветка Resources, а в ней файл Info.plist. Необходимо отредактировать его в Xcode и добавить новое поле SignerIdentity со значением «Apple iPhone OS Application Signing» (без кавычек)
И это еще не все, как оказалось, хотя везде было написано, что этого достаточно.
У меня лично продолжала возникать ошибка code sign error: no provisioning profiles found
В одном месте только нашел, как ее задушить окончательно. Оказывается, нужно «Set the iPhone SDK to allow the self-signed certificate to be used» (не хочу переводить))). Делается это так:
sudo /usr/bin/sed -i .bak ‘s/XCiPhoneOSCodeSignContext/XCCodeSignContext/’ /Developer/Platforms/iPhoneOS.platform/Info.plist
После этого нужно перезапустить xCode.
Вот вроде бы и все. Заливаем скопиленный бандл на девайс, перезапускаем спрингборд, запускаем наше приложение, и… вуяля.
В качестве бонуса, выложу свое первое с исходниками приложение сюда.
ай спасибо, добрый человек!
Cделал по вашему мануалу, теперь подпись не требует, а появилась другая ошибка:
Code Sign error: a valid provisioning profile matching the application’s Identifier ‘com.yourcompany.MyApp’ could not be found
Давно это было… боюсь, теперь уже и не упомню, что нужно сделать. При нормальном способе нужно либо в Build Settings установить нужный профиль в Code Sign, либо в Info прописать правильный application Identifier.
Вот лучше почитайте тут
Я давно такими вещами не практикую, так, можно сказать на заре своей iOS-деятельности баловался. Потом понял, что лучше сразу взять iOS developer program и избавить себя от мучений (:
Большое Вам спасибо, отлично работает патч по ссылке.
Приветствую. Хочу оставить фидбэк на каком-нибудь индексируемом ресурсе на эту тему. Просто последних апдейтов на эту тему я не нашел и решил что в xcode 5 прикрыли лавочку. Так вот мне удалось это. У меня xcode 5. последний на 11.2013. У меня есть iphone 3gs с джейленным 6.1.3. В общем все распоследнее и мне удалось поставить сейчас прогу на айфон без сертификата разработчика.
Как основные грабли моего поиска – совет коллегам. Все файлы на которые ссылаются этот и другие ресурсы: а именно /Developer/Platforms/iPhoneOS.platform/Info.plist. НЕВИДНЫ из под Finder. Их надо искать в терминале, копировать в доступную папке (например на десктоп) и только там править. Они все стоят с правами только на чтение так что chmod вам в помощь. Правите на десктопе и копите обратно под sudo. Это нигде в явном виде не написано и это и есть самое важное.
Удачи. И еще важно что на xcode 5 это удалось.