Пользователь
0,0
рейтинг
29 мая 2014 в 22:35

Разработка → Тестируем iOS приложения без Apple Developer Program Membership

Мне было интересно попробовать написать приложение для iOS, чисто в познавательных целях, но 99USD платить Apple за «любознательность» не очень то и хотелось. Не отчаивайтесь, для таких как мы есть способы и запустить приложение и отладить его на целевом устройстве.


После курения доков и разного рода экспериментов у меня получилось. К счастью однажды я сохранил туториал с одной странички, но откуда, уже вряд ли найду, поэтому это можно считать переводом. Ну и плюс дополнил от себя.

Итак, версии софта, которые я использовал:
  • OS X Mavericks 10.9.2
  • Xcode 5.1.1
  • iOS 6.1.2 iPhone 4
  • iOS 7.0. iPad mini


Итак, что же потребуется для «любознательности»? Всего то:
  1. Заджейлить наше iOS устройство
  2. Подготовить iOS к установке само-подписанных приложений
  3. Подсоединить iOS к Xcode и настроить девайс для разработки
  4. Создать свой сертификат
  5. Настроить Xcode для использования само-подписанного сертификата
  6. Настроить Xcode для отладки на целевом устройстве


Джейлим iOS


Тут в общем всё просто. На данный момент прошивка, поддающаяся взлому 7.0.6. Все остальное можно почерпнуть с сайта evasi0n.
Если нет взломанного устройства — то закрываем данный туториал и платим 99USD Apple.

Подготавливаем наше iOS устройство к установке само-подписанных приложений


Довольно известный факт, что того чтобы ставить само-подписанный приложения (суть взломанные) необходимо установить в Cydia так называемый AppSync. Я ставил AppSync из нашенского русского репозитория smolk — http://smolk.myrepospace.com. Насколько я наблюдал за этим репозиторием, Smolk сам пишет/тырит AppSync и выкладывает его одним из первых, поэтому и рекомендую воспользоваться его трудами.

Если же ничего не получилось, то Xcode выдаст примерно следующее:


Подключаем и настраиваем наше iOS устройство к Xcode


  1. Запускаем Xcode
  2. Цепляем iOS устройство к USB
  3. Открываем Organizer (Window\Organizer)
  4. Выбираем подключенное устройство
  5. Жмем «Use for development»
  6. Скорее всего Xcode попытается подключиться к серверу Apple и проверить наличие аккаунта разработчика, если так — жмем Cancel


Всё, наше устройство теперь при подключении всегда будет распознаваться как использующееся для разработки.

Создаем сертификат разработчика


  1. Запускаем приложение «Keychain Access»
  2. Меню «Certification Assistant > Create a Certificate»
  3. На первой страничке заполним данные и жмем «Continue».

    • Name: iOS Developer
    • Identify Type: Self Signed Root
    • Certification Type: Code Signing
    • Отмечаем галочку «Let me override defaults»

  4. Жмем «Continue» для создания сертификата.
  5. Изменяем «Validity Period» например на 3650 — это 10 лет срока действия, жмем «Continue».
  6. Оставляем поле «Email address» пустым и жмем «Continue».
  7. Оставляем значения по умолчанию в полях «Key Size» и «Algorithm», жмем «Continue».
  8. Жмем «Continue» на всех следующих страницах, пока не появится окошко с кнопкой «Create».
  9. Жмем «Create» и «Done» соответственно.


Настраиваем Xcode для использования само-подписанного сертификата


  1. Закрываем Xcode, если он открыт.
  2. Открываем Terminal
    cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
    # create copy of Info.plist
    sudo cp -p Info.plist Info.plist.orig
    # convert to editable xml format
    sudo plutil -convert xml1 ./Info.plist
    # replace each occurrence of XCiPhoneOSCodeSignContext with XCCodeSignContext in Info.plist
    sudo sed -i .bkup 's/XCiPhoneOSCodeSignContext/XCCodeSignContext/g' ./Info.plist
    
  3. Открываем Xcode
  4. Открываем или создаем проект и идем в настройки проекта, в закладку «Build settings». Выбираем в поле «Code Signing Identity» созданный сертификат:
  5. Около кнопки «Run» выбираем наше подключенное iOS устройство.
  6. Жмем «Run» и Xcode транслирует исходники в исполняемый файл и загружает его в устройство.
  7. Далее Xcode показывает нам следующую ошибку:

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


Настраиваем Xcode для отладки приложения на целевом устройстве


Компилируем ldid

  1. Если не стоит GIT, устанавливаем отсюда
  2. Далее в терминале:
    cd ~/Documents
    git clone git://git.saurik.com/ldid.git
    cd ldid
    git clone git://git.saurik.com/minimal.git
    ./make.sh
    sudo mkdir /usr/local/bin
    sudo cp ldid /usr/local/bin
    
  3. Создаём файл /usb/local/bin/ldid3.py с содержимым:
    #!/usr/bin/env python
    
    from sys import argv
    from subprocess import check_call
    from os.path import basename, dirname, splitext, join
    from tempfile import NamedTemporaryFile
    
    app = argv[-1]
    ldid_path = join(dirname(__file__), 'ldid')
    obj_path = join(app, splitext(basename(app))[0])
    
    if '-gta' not in argv:
        check_call([ldid_path, '-S', obj_path])
    else:
        with NamedTemporaryFile('w+b', 0) as f:
            f.write("""
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
      <dict>
        <key>get-task-allow</key>
        <true/>
      </dict>
    </plist>
            """)
            f.flush()
            check_call([ldid_path, '-S' + f.name, obj_path])
    
  4. Делаем ldid и ldid3.py запускаемыми:
    sudo chmod +x /usr/local/bin/ldid
    sudo chmod +x /usr/local/bin/ldid3.py
    

Настраиваем Xcode

  1. Закрываем Xcode, если он открыт.
  2. Обновляем файл конфигурации iPhoneCodeSign.xcspec, для этого в терминале:
    cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications
    # create a backup copy of iPhoneCodeSign.xcspec 
    sudo cp -p iPhoneCodeSign.xcspec  iPhoneCodeSign.xcspec.orig
    # convert to editable xml format
    sudo plutil -convert xml1 iPhoneCodeSign.xcspec
    # replace codesign with /usr/local/bin/ldid3.py
    sudo sed -i .bkup 's/codesign/\/usr\/local\/bin\/ldid3.py/g' iPhoneCodeSign.xcspec
    

  3. Открываем Xcode
  4. Теперь, чтобы включить отладку, нам необходимо добавить ключик "-gta" в командную строку утилиты codesign, предыдущим шагом мы её заменили на наш ldid3.py
  5. Собираем приложение и запускаем н целевом iOS устройстве.


Надеюсь данное руководство поможет начинающим программистам iOS просто и незатейливо попробовать свои силы в написании программ для устройств Apple.
Maxim Filippov @mefikru
карма
31,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (34)

  • –11
    Разработку можно вести и на симуляторе. Он практически ничем не отличается от настоящих устройств на этапе попробовать систему, более того поддерживает разные платформы и версии операционной системы.
    • +6
      Есть такое, но иногда хочется погонять приложение на устройстве. А OpenGL на устройстве сильно отличается по производительности. А когда еще и виртуалку под VMWare пользуешь, то тут вообще такие тормоза с симулятором. Я не способ разработки описал, а способ тестирования.
      • +5
        Да и пальцами пощупать иногда хочется + геолокацияю и акселерометр в некоторых специфических случаях на устройстве хочется проверить, в общем мне кажется полезно для тех кто начинает
        • –2
          Исхожу из своего опыта. Проделать все выше описанные операции знакомясь с платформой может быть довольно трудно. Геолокация в симуляторе приемлемая, со вторым дела не имел.
          • +7
            Я как то игрался с Box2D, ну и на симуляторе у меня было 60fps, я сильно удивился, когда получил на устройстве 3 кадра в секунду.
      • 0
        поддерживаю.
        Есть ещё один забавный баг в стимуляторе: он не case sensitive, а девайс чувствителен к регистру.
        я как-то чуть с ума не сошёл пока не понял почему у меня одна кнопка на реальном девайсе пропущена :)

        [UIImage imageNamed:@"Case sensitive on real Device, but OK on simulator. Be careful with first capital latter!"];
        • +1
          Это не баг, это файловая система. На Mac OS она чувствительна к регистру (файлы file1.txt и File1.txt разные файлы), а на iOS нет.
          • 0
            благодарю за уточнение (не знал про данные отличия на уровне операционных систем), однако всё таки буду настаивать что это баг, а не фича т.к. iOS Simulator должен таки симулировать работу iOS :)
            • +1
              ну так оно и симулирует, можете рездел сделать не чувствительный к регистру, в Mac OS это можно сделать. А по поводу симулятора, то вы от симулятора ожидаете, что он будет эмулятором. Симулятор iOS отлично сравляется со своими функциями. Я за 5 лет работы с ним не могу предъявить особых нареканий.
          • 0
            я может вас не совсем правильно понял, но буквально на этой неделе сам столкнулся с тем что файловая система в mac osx не чувствительна к регистру

            $ touch file1.txt
            $ touch File1.txt
            $ ls fil*
            file1.txt
            • +1
              можно отформатировать раздел и указать, чтоб файловая система была чувствительна к регистру.
            • 0
              $ ls *ile1.txt
              • 0
                и?
                разница то вот тут
                • 0
                  Ну просто приведённая Вами последовательность команд даже на case-sensitive системе выведет 1 файл.
                  • +1
                    # touch file1.txt
                    # touch File1.txt
                    # ls fil*
                    file1.txt
                    # ls *ile1.txt
                    file1.txt  File1.txt
                    
          • 0
            Как раз-таки наоборот.
            Если не путаю, OSX предлагает при установке выбрать тип ФС (case-sensitive or case-insensitive).
            Видимо, в iOS всегда используется только case-sensitive.
            • 0
              Ну я об этом и говорю. В Маке не чувствительна, в iOS чувствительна. Очевидно, что в iOS нет возможности переформатировать раздел, а в Mac OS есть.
          • 0
            По умолчанию при установке МакОСи выбирается ФС, нечувствительная к регистру букв
    • +3
      А использование камеры вы тоже на симуляторе сделаете?
    • +3
      Приложения можно и для собственного использования писать
  • +2
    Мммм… а зачем дополнительные телодвижения с ldid? Чем плохо

    $ codesign -s - --entitlements yourentitlements.plist -f yourexecutable
    

    Я так debugserver переподписывал (чуть поменяв ему plist) перед тем как запихнуть его на iPhone — работает.
  • +3
    Зачем переписывать одну и ту же статью, которой уже лет пять, другими словами?
    Вот то же самое, но 2010 года: macpages.me/blog/development/327.html
    • +3
      Потому что статьи тратят актуальность. Из за изменения путей, имен конфигурационных файлов, форматов этих файлов и т.п. Так же я попытался объединить в одной статье все, включая компиляцию и использование отладчика ldid.
      • +1
        ldid — не отладчик, а тул для изменения entitlements бинарников. Отладчики под iOS — это GDB (теряет актуальность) и LLDB.
        • 0
          Блин, я почему то был уверен, что ldid отладчик. Спасибо, буду знать.
  • 0
    Что, без взлома совсем никак? А как же всякие службы вроде hockeyApp или TestFlight?
    • 0
      без влома нельзя. Каждый зарегистрированный девайс на TestFlight – это минус один девайс из годовой лицензии (лимит в год — регистрация 100 девайсов)
      • 0
        И нет аналогов? За 4 года (примерный возраст статьи) могли и появиться.
        • +1
          OS X Mavericks 10.9.2
          Xcode 5.1.1

          угу, четыре года статье ;)

          без jailbreak нельзя запустить стороннее приложение (не из Apple Store) если ваш UDID (уникальный номер iOS устройства) не указан в provision profile.
          • 0
            Это хорошо, конечно, что метод доступен и проверен сейчас, на современном ПО; но тут чуть выше OnYourLips упоминает статью от 13 октября 2010 года, которая ссылается на статью от 4 августа 2010 года.
          • 0
            строго говоря...Enterprise-сертификат позволяет не указывать UDID и запускать на всех девайсах
            разумеется юзеру говорится при установке чье это и точно ли он уверен, ну и по условиям Apple — это для _сотрудников_ компании (знаю минимум один пример где заказчик (американский) прямо сказал — «сотрудники»=«я им плачу ну ОЧЕНЬ немного за установку так что с Apple это не проблема», приложение- достаточно навороченный сбор статистики использования девайса, для маркетинговых исследований)
  • 0
    Предложенный AppSync глючит(вылетает Сафари, синий экран на некоторых приложениях включая хабр) на 5S(IOS7.1.2) помог AppSync Unified из репозитория cydia.angelxwind.net и вообще, судя по описанию, сделан он на много толковее.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.