Главная > Apple > Публикуем приложение в AppStore

Публикуем приложение в AppStore

Опишем на будущее хинты по выкладыванию своих программ в магазин приложений Apple AppStore. Хотя, как показывает практика, дело это не очень чтобы благодарное, поскольку яблочные товарищи не склонны к постоянству в механизмах функционирования своей системы. Это было уже не раз обнаружено мной в ходе прохождения различных процедур регистраций. Читая материалы предшественников и вопросы на форумах частенько можно столкнуться с ситуацией, что один и тот же момент выглядит у тебя уже по-другому. Тем не менее, общая концепция пока что остается. И так, попробую описать своими словами всю эту махину))
Чтобы выкладывать приложения в AppStore, необходимым условием является наличие статуса iPhone Developer.
Весь процесс можно разделить на два этапа: подготовка и публикация.
Подготовка (Provisioning). Самый сложный в понимании этап (по крайней мере для меня показался).
Он включает в себя создание идентификатора приложения App Id) и сертификата для подписи приложения. Все это объединяется под общим понятием профиля (Provisioning profile). Но все по порядку. Самое сложное во всем этом — создание сертификата. Сертификат необходим для цифровой подписи приложения. Существует два вида сертификатов — сертификат разработчика (Development certificate) и сертификат дистрибуции (Distribution certificate). Из названия не трудно догадаться, что первый тип нужен для разработки, второй — для распространения. Первым можно подписывать приложение и запускать на своем гаджете (в целях отладки), второй нужен, чтобы собирать приложение для публикации в аппсторе. Чтобы иметь возможность запускать приложение на своем гаджете, необходимо зарегистрировать устройство в Provisioning Portal. Делается это следующим образом. В среде xCode открываем Organizer (Window -> Organizer), подключаем свой гаджет к компьютеру (по usb, например), видим, что он появляется в разделе Devices. Копируем его DeviceID (длинная hex-строка) в буфер и идем в Provisioning Portal в раздел Devices. Там жамкаем Add Device, далее все просто.

Добавили. Теперь создаем сертификаты. Это не очень сложно, но меня заставило повозиться. Не буду долго расписывать, все это можно найти в How-To внутри Provisioning Portal. Обозначу лишь основные шаги:
— Создание запроса на подпись сертификата (включает в себя создание пары открытого и приватного ключа). В итоге получаем на диске файл CSR.
— Сабмит запроса на подпись сертификата. В Provisioning Portal заходим в секцию Certificates, указываем файл CSR, жмем Submit, сертификат создается и переводится в состояние Pending Approval.
— В Provisioning Portal заходим в секцию Certificates и подтверждаем сертификат (жмем Approve)
— Скачиваем и устанавливаем сертификат в систему. В Provisioning Portal заходим в секцию Certifiates. Кликаем ссылку WWDR Intermediate Certificate, на что нам предлагают сохранить файл .cer. Соглашаемся, и по завершению скачивания кликаем на нем. Запускается программа Keychain Access, которая предлагает установить сертификат в систему. Соглашаемся, и вот у нас есть сертификат для разработки.
Важный этап — эппл настоятельно рекомендует сохранить сгенерированный приватный ключ. При его утрате все труды окажутся напрасными, мы ничего больше не сможем подписать. Хорошо, что я вспомнил это, так как сам до сих пор не забэкапил свой ключ. Все-таки, полезная вещь — блог)))
Для сертификата дистрибуции все то же самое, за исключением того, что ключи больше не надо генерить.
И так, сертификаты мы создали, что теперь? Теперь нужно создать так называемые Provisioning Profiles (не хватает фантазии перевести на русский). Подготовительный профиль (назовем его так) представляет собой совокупность сертификата и идентификатора приложения. Сертификат у нас уже имеется, создадим идентификатор приложения. Для этого идем на Provisioning Portal в сецкию AppIDs. Если не брать в учет «пакетную» концепцию идентификации приложений, то все просто: нажимаем New App ID, вводим
— Description (напр, My Awesome App)
— Bundle Seed ID (App ID Prefix) — если это наше первое приложение, то в списке будет всего один пункт — Generate New, в противном случае в нем будут идентификаторы ранее созданных приложений (по задумке, приложения можно объединять в пакеты (suite))
— Bundle Identifier (App ID Suffix) — рекомендуется вводить в так называемом reverse domain style. То есть домен в обратном порядке. Например, в моем первом приложении Knight Move этот идентификатор выглядел как ru.heximal.knightmove.
Жмем Sumbit. Все, идентификатор приложения создан.
Далее заходим в разлем Provisioning и создаем профили нашего приложения (жмем New Profile). Для девелопмент-профиля вводим
— Profile Name — под этим именем профиль будет отображатся в xCode. Пример: KnightMoveDevelopmentProfile
— Certificates — ставим чеку на нашем сертификате
— App ID — выбираем наше приложение
— Devices — ставим чеку на тех девайсах, которые зарегистрированы — их может быть более одного. Я вот подумываю прикупить 4-й айфон для отладки (всмысле, не четвертый по счету — он у меня пока один, а с четвертой прошивкой). Забегая чуть вперед, скажу, что на втором этапе будет задан вопрос, тестировали ли мы наше приложение под iOS 4? Мне приходится отвечать Нет. Хотя я мог бы перепрошить свой девайс, iTunes каждый раз сигнализирует, что есть новая версия фирмвэйра. Но я пока не тороплюсь, потому что при таком раскладе у меня не будет возможности тестировать на третей прошивке кроме как в симуляторе.
Создали профиль, дождались его аппрува, скачиваем файл профиля (.provisionprofile), открываем окно Organizer и кидаем туда драг-энд-дропом файл профиля. Он успешно инсталлируется. Все.
Теперь открываем Project Settings, ищем опцию Code Signing подраздел Any iPhone OS, разворачиваем список, выбираем свой профайл, закрываем опции проекта. Далее важный момент. В структуре проекта (в древовидном сайдбаре) разворачиваем ветку Targets, щелкаем правой кнопкой на таргете, выбираем Get Info. Появляются снова опции проекта, но уже с секцией Properties. Заходим туда и вписываем в поле Identifier то значение, которое мы вводили при создании App ID в поле Bundle Identifier (напр, ru.heximal.knightmove). Все. Убеждаемся, что девайс подключен, выбираем в главном окне xCode конфигурацию Device|Debug и жмем Build And Go.
После того, как мы отладили приложение на девайсе, наступает пора собирать дистрибутив для публикации. Для этого повторяем процесс создания профиля дистрибуции. Он схож с созданием девелопмент-профиля. Инсталлируем профиль в xCode, а далее нужно осуществить следующий трик. Необходимо создать новую конфигурацию Distribution. Открываем опции проекта, секцию Configuration, выбираем там конфигурацию Release и нажимаем Duplicate. Вводим название Distribution. Далее в окне Target в секции Build выбираем настройки для конфигурации Distribution и в поле Code Signing Identity — Any iPhone OS Device выбираем наш Distribution Profile. На закладке Properties не забываем вписать Bundle Identifier, если еще не сделали. Закрываем опции, и в главном окне xCode выбираем конфигурацию Device|Distribution. Далее неплохо бы проследить за процессом сборки. Для этого идем в меню Build — Build Results. Там настраиваем чтобы показывался лог компиляции. Нажимаем Build. Появляется много строчек, в конце которых ищем слова ProcessingProductPackaging … embedded.mobileprovision и СodeSign. Вот здесь у меня ушло много времени. В пакете приложения (application bundle) упорно не хотел появляться файл embedded.mobileprovision. А без него приложение никак не хотело загружаться в AppStore. Это явилось следствием того, что ранее я экспериментировал с самопальными сертификатами и отключением системы provisioning’а. Позже я восстановил (кстати, хвала своему блогу) последовательность действий, которая привела к неработоспособности системы профайлинга, но времени на это ушло… В общем, как я ранее уже заявлял, не скупитесь, вступайте лучше сразу в iPhone Developer Program, если вы конечно не мазохисты))
Пакет приложения представляет собой простую папку с расширением .app, которая содержит исполняемый файл и все потроха приложения (ресурсы). Собственно, приложения Mac OS X представляют собой ровно то же самое, поэтому их можно просто перетащить куда-либо в другое место, и оно от туда запустится, потому что содержит внутри папки все необходимое. В этом конечно бесспорное приемущество non-registry концепции. И так, зипуем бандл нашего приложения тем самым готовимся к следующему этапу.
Публикация.
Дальнейшие действия производятся на портале iTunes Connect (itunesconnect.apple.com) Заходим в раздел Manage Your Applications и жмем Add New Application. Вводим
— App Name — имя приложения, то, как оно будет выглядеть в AppStore. При публикации второго приложения я столкнулся с тем, что это название должно быть уникальным для всего AppStore. То есть, если мы задумали назвать приложение каким-либо образом, а приложение с таким названием уже существует, нам придется придумывать что-то другое. Также следует учесть требования самого Apple к названию приложения http://www.apple.com/legal/trademark/guidelinesfor3rdparties.html
— SKU Number — опять какой-то уникальный идентификатор приложения, я не понял для чего он нужен, но решил придерживаться определенного правила генерации этого параметра, навроде hex_app_0001
— Bundle ID выбираем наше приложение
Дальше вроде все понятно, нужно заполнить мета-информацию о приложении: описание, категории, локализацию, скриншоты, иконку. После всего этого приложение переходит в состояние Waiting for upload. Для загрузки бинарника требуется программка Application Loader из пакета Developer. Если таковой не имеется, требуется доустановить. Запускаем ее, она спрашивает наш Apple ID и пароль, далее показывает список приложений, ожидающих аплоада. Выбираем, загружаем. Вот на этом этапе, кстати, у меня были проблемы до тех пор, пока я не реанимировал отключенный механизм профайлинга и кодесайнинга — без них аплоадер не хотел загружать приложение.
Все, после загрузки приложение переводится в состояние Waiting for Review — ожидание рассмотрения. Рассмотрение проивзодится специалистами Apple на предмет соответствия требованиям. Эти требования описаны в мануале iPhone Application Development Guide, и включают в себя такие аспекты, как соответствие общему дизайну, грамотное использование ресурсов устройства, таких как памяти, энергопотребления, производительности ну и просто user-friendly. Apple очень ответственно к этому подходит. Могут завернуть, например, если приложение очень долго закрывается, я уж молчу про утечки памяти. Чтобы избежать этих неприятностей, приложение перед сборкой дистрибутиво следует тщательно протестировать. В пакете Developer есть набор инструментов (приложение Instruments). С помошью него можно узнать много нового о своем приложении. Например, написав первое приложение и прогнав его через программу мониторинга выделения памяти, и утечек я обнаружил, что оно безнадежно течет. Несколько дней потратил на устранение утечек. Позже накидаю небольшой мануальчик, как пользоваться инструментами.
Будучи новичком, я думал, что статус Waiting for Review означает, что приложение уже находится на рассмотрении, однако по прошествии недели я заподозрил что-то неладное и решил написать в саппорт. На следующий день мне ответили и тут же пришло уведомление о том, что приложение переведено в статус OnReview. Тут сразу все стало ясно. Прошло еще дня полтора и приложение перешло в состояние Ready For Sale. Все, победа. Путь в аппсторе окончательно завершен.
Небольшой конфуз произошел по неопытности, при неудачной попытке найти в AppStore свое приложение в тот же день. Его там не было. Как оказалось позже, это нормальная ситуация. Существует некий период индексации. По моим наблюдениям он составляет сутки. Второе приложение тоже появилось через сутки. Кстати, со вторым приложением ситуация с ожиданием рассмотрения повторилась. Правда, я выжидал подольше чем неделю, прежде чем написать в саппорт. После того, как терпение закончилось, написал, и тут же мне ответили и приложение ушло на рассмотрение. Видимо, это закономерность. Посмотрим.

И напоследок. При публикации приложения обязательным полем в мета является страница технической поддержки. Это меня сподвигло отрихтовать свою страницу feedback. Теперь она англоязычная))

  1. 3 November 2010 в 12:48 | #1

    Очень полезные посты, спасибо! :)

  2. Сергей
    6 April 2011 в 18:23 | #2

    Действительно, очень полезные статьи. Руководствуюсь как инструкцией при выкладывании своего первого приложения для AppStore.

  3. Сергей
    6 April 2011 в 18:25 | #3

    Спасибо огромное, что не поленились изложить. )))

  4. 9 April 2011 в 12:32 | #4

    Всегда пожалуйста))

  5. mactoy
    29 June 2011 в 15:42 | #5

    Полезные вещи!
    Спасибо.

  6. Анна
    6 September 2011 в 13:00 | #6

    Спасибо за Ваши статьи. Ответьте, пожалуйста, для неразбирающихся. Во-первых, на каком сайте все это проделывается, т.к. нашла достаточно большое количество сайтов AppStore и не могу выбрать тот, который нужен. Во-вторых, язык, на котором придется общаться, английский? в-третьих, если проделать все шаги, то ты зарегистрируешься как издатель приложения? следующий шаг — это продвижение и в случае успеха — прибыль? Надеюсь на ответ и возможные ссылки по этой теме )

  7. 6 September 2011 в 14:45 | #7

    Здравствуйте.
    Отправная точка для всех действий, связанных с регистрацией в программе iOS Developer, а также публикацией своих приложений в AppStore является сайт http://developer.apple.com
    Все, что не входит в домен apple.com (кроме сервисов Apple типа me.com, icloud.com etc) не имеют отношения к Apple — избегайте их))
    Конкретно для начала регистрации в программе iOS Developer нужно зайти по ссылке http://developer.apple.com/programs/ios/ и нажать кнопку Enroll Now
    Язык общения — английский, но мне лично пришлось в живую общаться только один раз при получении EIN, а эту процедуру сейчас упразднили. Несколько раз приходилось общаться в саппортом по емэйлу. Если все делать предельно осторожно, разговаривать не придется.
    Если проделать все шаги из этой статьи, то вы получите статус iOS Developer, что позволит публиковать приложения в AppStore, а также получать техническую поддержку специалистов Apple, и еще много всего другого (например, получать новые версии SDK, когда они еще официально не выпущены)
    Про продвижение — это вы правильно сказали. Я планировал описывать этот процесс у себя в блоге, но, к сожалению, пока что до него руки не дошли из-за отсутствия времени(( Но я не теряю надежды заняться этим в ближайшее время.
    Мое первое платное приложение было неделю в топе, и неплохо продавалось. Потом оно сползло вниз в виду появления новых приложений, и продажи упали.
    Третье бесплатное приложение в первые пару месяцев активно скачивались — в среднем 100 загрузок в день. Сейчас, спустя почти год, ежедневно около 8 закачек.
    Это я к тому, что даже без продвижения аудитория у AppStore настолько велика, что даже аутсайдеры имеют свой процент продаж.
    Можно обратиться к дельцам, которые за процент занимаются продвижением, можно вообще к паблишерам, в таком случае можно вообще не регистрироваться в iOS Developer Program.
    Успех обязательно будет, если вы трудолюбивы и уперты.

    Терпение и труд все перетрут.
    Без труда не вытянешь и рыбку из пруда.
    Сделал дело гуляй смело.
    Труд из обезьяны сделал человека.
    Работа не волк … ой, а вот это не надо ;))

  8. Анна
    9 September 2011 в 11:44 | #8

    Благодарю Вас за исчерпывающий ответ. В частности интересует еще вот что: как обратить внимание Apple на твое приложение и получить предложение от Apple чтобы последний стал издателем твоего приложения? Насколько это реально сделать самостоятельно или же с помощью паблишеров? Не подскажете контакты таких знающих людей?

  9. 9 September 2011 в 14:18 | #9

    Шансы обратить внимание Apple к своему приложению практически равны нулю. Apple не занимается публикацией third-party приложений — им и своих хватает.
    Создать приложение и опубликовать его самостоятельно — задача более чем реальная. Контактов паблишеров, к сожалению, не подскажу, ибо никогда не задумывался даже к ним обращаться — публикую сам. Сейчас по большей части для портфолио, но все же надеюсь когда-то создать что-нибудь грандиозное, что порвет весь AppStore)) Все разработчики на это надеются.

  10. Анна
    9 September 2011 в 14:53 | #10

    Спасибо огромное!!! )) Надеюсь о Вас еще услышать )

  11. 26 September 2011 в 11:25 | #11

    Спасибо за полезный пост, так как разобраться со всеми сертификатами и подписями весьма непросто. Есть вопрос по разшариванию сертификата между девелоперами, входящими в команду и использующими один девелоперский аккаунт на Apple. Понятное дело, что можно скопировать приватный ключ на все машины. Но может есть другой, более элегантный способ?

  12. 26 September 2011 в 13:52 | #12

    n ite_man:
    Если вы регистрировались, как индивидуал, то, пожалуй, более изящного способа нет. Но можно зарегистрироваться, как компания. Тогда у каждого девелопера будет свой сертификат, но все запросы (на публикацию, обновление и т.д.) будут проходить через team lead’a. Я, к сожалению, в виду ненадобности, не занимался пока этим. Когда будет своя команда, обязательно опишу этот процесс (:

    P.s. Интересный у вас блог. Тоже подумывал этим заняться. Начать хотя бы с софта для управления домашним компьютером. Ну там, например, чтоб с айфона можно было громкость прибавить, баланс, кино зарядить и все в таком роде. Искал в AppStore — как то все печально.
    Сейчас пользуюсь тоже собственным решением, основанным на usb IR-приемнике, который представляет собой HID-клавиатуру, и собственноручно написанной прогой, которая перехватывает комбинации клавиш, генерируемые приемником, и соответственно реагируя на них. Пока хватает, могу управлять Media Player Classic, Winamp, громкостью, балансом и монитор гасить))

  13. master
    10 November 2011 в 01:12 | #13

    Здравствуйте. Мы с приятелем готовимся опубликовать приложение. У нас уже есть оплаченный индивидуальный девелоперский аккаунт, но встал вопрос, что будет указано в графе «developer». Правильно ли я понимаю, что будут указаны имя и фамилия того, на кого зарегистрирован аккаунт? Можно ли это изменить? Можно ли указать двух человек или просто нейтральное словосочетание, типа название фирмы (хотя самой фирмы не существует)? Что бы вы посоветовали в этом случае, чтобы на странице приложения в аппсторе информация о производителе была справедливой в отношении каждого из нас?

  14. 11 November 2011 в 10:47 | #14

    Привет. Да, ситуация не из простых.
    Если индивидуальный аккаунт зарегали, то в поле Продавец будет светиться то имя, на которое зареган аккаунт. Есть еще два ваианта, где можно попробовать указать обоих. Первое — поле copyright. Это при заполнении meta информации о приложении. Ну и второе — это скриннэйм. Оно вроде заполняется один раз при регистрации аккаунта.

  15. Сергей
    13 November 2011 в 02:30 | #15

    привет.

    спасибо за статью, помогла окончательно понять «что-к-чему».

    кстати, если я правильно все понял, после выхода iOS 5 немного изменились требования к загрузке на проверку в appstore.
    у меня например приложение не загружается, если в .plist нет ключа UINewsstandapp установленного в «true». И соответствующей настройки в iTunes Connect раздела «Newsstand».

  16. 13 November 2011 в 12:04 | #16

    Привет. Как я уже и упоминал, подобная информация быстро устаревает, это ествественный процесс, система развивается и совершенствуется. Сейчас планирую написать статью, как готовить приложение к публикации в xCode 4 — там все немного по-другому. Как раз готов очередной материал к публикации, думаю, будет самому полезно на будущее описать весь процесс.
    Под iOS 5 пока ничего не кодил, поэтому не сталкивался с нюансами. Как столкнусь, обязательно опишу))

  17. Сергей
    14 November 2011 в 00:01 | #17

    @heximal

    былоб здорово ! спасибо.

  18. Сергей
    19 November 2011 в 00:28 | #18

    @Сергей

    я ошибся немного… UINewsstandapp может быть в false , но .plist не должно быть CFBoundleIcon.
    вот тут с картинками: http://stackoverflow.com/questions/6977357/xcode-gave-strange-newsstand-error-when-trying-to-submit-an-app

  19. Ян
    28 November 2012 в 23:56 | #19

    Отличная статья. Сохранил в закладках. Спасибо.

  20. Maxim
    20 February 2013 в 20:21 | #20

    Добрый день. Еще не публиковал приложение, но есть вопрос (чертовски любознательный с детства).
    Подскажите, пожалуйста, если я хочу назначить цену своему приложению, то куда будут поступать деньги за продажи?
    Нужен расчетно-кассовый счет? Объясните немного порядок.

    Заранее спасибо!

  21. 20 February 2013 в 23:03 | #21

    Добрый.
    Чтобы назначить цену на приложение, нужно будет оформить так называемый iOS Paid Applications Contract — он заключается онлайн на портале itunesconnect.apple.com.
    Там нужно будет указать свои банковские реквизиты, куда в последствие будут начисляться выплаты.
    Помню для меня это было самым тяжелым испытанием. Особенно поиск международного идентификационного кода моего банка.

  22. 20 August 2014 в 05:33 | #22

    думаю, в вашей статье нужно всё-таки указать на обязательность предварительной установки xcode, т.к. она не идёт по умолчанию с маком.

  23. Вадим
    10 January 2015 в 15:55 | #23

    От себя отмечу, что как только ваше приложение появится в App store, крайне желательно получить к нему хотя бы несколько положительных отзывов. Когда размещал свои игры, заказывал отзывы в системе fewreview. Получил около сотни положительных, а главное живых и грамотных отзывов, средняя оценка составила 4.8. Да и сто скачиваний, конечно, лишними не стали.

  24. Mixe0
    4 March 2015 в 09:47 | #24

    Очень непонятно написано!

  25. 4 April 2015 в 03:11 | #25

    Да, к сожалению, вынужден констатировать, что писать статьи на подобные темы — неблагодарный труд. С момента написания этого поста прошло (страшно подумать) 5 лет. С тех пор интерфейсы системы видоизменились до неузнаваемости.

  26. AlEX
    15 April 2015 в 13:08 | #26

    Добрый день. Подскажите, когда приложение отправляется на проверку, проверяется ли его исходный код?

  27. 15 April 2015 в 13:16 | #27

    Привет. Конечно же, никто не проверяет исходный код — он остается у вас и никуда не отсылается.
    Единственное, что может увидеть в вашем приложении review-team, это прилинкованные библиотеки, например CoreLocation или GoogleMaps. но даже и тут ничего криминального быть не может.
    Максимум, что может быть криминального, если вы в коде используете какое-то приватное/недокументированное iOS API.
    В этом случае будет реджект.

Подписаться на комментарии по RSS