Выход на публику: два магазина, два отказа, ноль спокойствия
English Deutsch Español Français Português 中文 Italiano 日本語 한국어 Türkçe Polski Nederlands Bahasa Indonesia
Moneyflow теперь в App Store и в Google Play. Мы бы с радостью рассказали, что всё прошло гладко. Не прошло. По пути мы получили два отказа от Apple, научили скрипт сборки говорить «нет», выяснили, что Lambo всё это время был клетчатым флагом, и починили ошибку, на которую Google пожал плечами, а Apple — нет.
Это вся история целиком, собранная из наших заметок о релизах, наших инструкций и коммитов, которые мы писали в спешке. Она длинная, немного дерзкая, и если ты собираешься запускать собственное приложение, в ней есть настоящие советы. Налей кофе или возьми небольшой кредит под залог своих активов.
Коротко, по датам
- Версия 1.2.8 выходит в Google Play. Анонс появляется в тот же вечер, на шести языках.
- iOS догоняет Android на версии 1.2.8, после того как мы спасаем заставку, которую никто не мог прочесть.
- Первая отправка уходит в Apple без покупок в приложении. Вторая уходит со всеми 39. Первый ответ Apple: Information Needed.
- Весенняя уборка товарных знаков и сборка 31, чтобы вернуть в приложение пропавший ключ.
- Отказ второй, с iPad: обе кнопки входа показывают ошибку, а проверяющий не может найти Магазин.
- Виновник — один пропущенный параметр. Android всё это время тихо его прощал.
- Сборка 34, подписана как положено. Вход через Apple наконец работает.
- Версия 1.2.9 выходит в Google Play.
- Игроки сообщают, что их телефоны сильно греются. Мы заставляем игру перестать это делать.
- Пять версий за одни выходные, от 1.2.10 до 1.3.1.
- Ссылка на App Store появляется на нашей главной странице. Ты здесь.
До IPO: браузерная игра, которая боится обязательств
Moneyflow начинался как браузерная игра. Ты выбираешь персонажа с настоящей работой, настоящими счетами и настоящей зарплатой, бросаешь кубики и пытаешься нарастить достаточно пассивного дохода, чтобы вырваться из рутины с девяти до шести и оплатить две мечты. Сделать и то и другое — единственный способ победить, и в одиночной игре, и в мультиплеере. Есть ещё свадьба, брачный договор и развод, до них мы тоже дойдём.
Потом мы решили, что ей место на твоём телефоне, и выяснили, что магазин приложений — совсем другая игра. Ни кубиков, ни карточек, только формы, анкеты и казино, которое всегда в выигрыше. О бумажной работе для Google Play мы писали раньше, в посте Как мы выкладывали Moneyflow в Google Play. Это сиквел: что случилось дальше, в обоих магазинах, и что мы сказали бы себе, если бы могли вернуться назад.
Раунд первый: Google Play говорит «да» (после того как попросил всё на свете)
Google Play пошёл первым и вёл себя как банк, когда просишь ипотеку: дружелюбно, дотошно и жаждуще увидеть каждый документ, какой у тебя есть. Форма «Безопасность данных», рейтинг контента, страница удаления аккаунта, период закрытого тестирования. Предыдущий пост рассказывает обо всём этом, так что здесь — что мы изменили, когда первая карточка была готова.
Мы перестали кликать. Все 39 покупок в приложении (18 фишек, 14 дизайнов кубиков, 4 темы поля и 3 набора, и каждая из них косметическая) создавались скриптом, а не вручную, а между приложением и обоими магазинами стоит RevenueCat, так что логика покупок везде одна и та же. Релизы мы тоже выпускаем через Android Publisher API. Один скрипт открывает правку, загружает бандл, назначает трек и фиксирует, а если какой-то шаг падает, удаляет правку, так что неудачный запуск ничего не оставляет после себя. Это самая аккуратная вещь во всей этой истории.
У Play свои причуды. Он отвергает любой номер сборки, который когда-либо видел, включая те, что ты загрузил и так и не выпустил, поэтому номера сборок ведут себя как наличные в игре: потратил один — и он ушёл, получил ты что-нибудь взамен или нет. Ещё у нас два сервисных аккаунта, и публиковать разрешено только одному. Другой может открыть правку, загрузить целый бандл, назначить его на трек и на самом последнем шаге получить 403. Столько усилий и твёрдое «нет», когда торт уже стоит на столе.
7 сентября версия 1.2.8 вышла. В тот же вечер мы опубликовали анонс на шести языках, потому что если уж радоваться публично, то на немецком, испанском, французском, португальском и китайском — тоже.
Google Play сказал «да». У Apple были другие планы.
Раунд второй: Apple строит из себя недотрогу
Пока Android мчался вперёд, iOS всё ещё стоял в App Store Connect на версии 1.2.1. 10 сентября он догнал: версия 1.2.8, сборка 30, десять новых скриншотов и промотекст на восьми языках. До всего этого нужно было решить небольшой вопрос с соглашением Paid Apps. Apple не даст создать ни одной покупки в приложении, пока ты его не примешь и не подашь банковские и налоговые данные. До тех пор каждая попытка возвращает 409, а это способ Apple сказать: «Пока нет, и не будет, пока я не увижу твои бумаги».
Потом мы автоматизировали все 39 покупок через App Store Connect API. Первый запуск упал на 24 из них с UNEXPECTED_ERROR. Мы запустили снова, и всё прошло чисто. Теперь в инструкции самое дзен-предложение во всём репозитории: перезапусти, а не отлаживай.
Заставка, которой не было
На настоящем телефоне наш стартовый экран было не прочесть, и по двум разным причинам. Раскадровка заполняла экран квадратной картинкой, так что на высоком телефоне она масштабировалась, пока не совпадёт высота, и обрезала около 54% ширины. Логотип и вся декоративная рамка уходили за край. Хуже того, тёмные версии были просто голой фигурой размером около 5% на кремовом полотне, то есть невидимым логотипом на каждом телефоне с тёмной темой.
Мы перешли к тому, чтобы вписывать картинку в экран на её собственном кремовом фоне, убрали тёмные варианты и поставили логотип с надписью на 88% полотна. Папка с изображениями сжалась с 55 МБ до 9,1 МБ. Первое впечатление не должно весить 55 МБ.
Как отправить приложение, в Магазине которого нечего продавать
Вот ловушка с превосходной маскировкой. Покупки в приложении — отдельные объекты проверки, и Apple не станет проверять ту, которой нет в твоей отправке. В первый раз приложение ушло на проверку, а все 39 продуктов остались стоять на «Ready to Submit». Одобри его Apple — мы бы выпустили игру о купле-продаже, в Магазине которой нечего купить. Отзыв стоил нам действия Remove from Review и места в очереди.
Ловушка в том, что Apple позволяет начать черновик отправки со страницы In-App Purchases, который никогда нельзя отправить. Без версии приложения ни один продукт не добавляется: «Unable to Add for Review», а отправка черновика падает с «add an app version for the selected platform». Ни одно из сообщений не говорит, что версию нужно добавить первой. Мы, разумеется, попытались автоматизировать исправление. В API вообще нет связи покупки в приложении с отправкой. Мы перепробовали три написания, прежде чем смириться, что эта дверь только в интерфейсе, и теперь в инструкции так и сказано, вежливо, чтобы никто больше не пробовал.
Число, которое наконец нас порадовало, — сорок: одна версия приложения плюс тридцать девять вещей, которые можно к ней купить.
Отказ номер один: Apple хочет узнать нас получше
11 сентября Apple ответила. В теме письма стояло Guideline 2.1, Information Needed. Это была не ошибка, не сбой и не нарушение. Apple не сообщала ни о каком дефекте. Это анкета, которую Apple отправляет аккаунтам с короткой историей проверок, и к ней прилагалось требование записи экрана. Считай это не отказом, а проверкой биографии.
В списке было семь пунктов: запись экрана, для чего приложение и для кого, как войти и всё попробовать, какие внешние сервисы оно использует, меняется ли что-то по регионам, регулируется ли оно и не построено ли на чужих материалах, и как работают покупки. Вопросы были разумные, примерно как вопросы на первом свидании. Resolution Center ограничивает ответ 4 000 символов, а наш занял 3 917, и это самое длинное, что мы когда-либо говорили человеку, с которым только что познакомились.
Потом запись. Apple хотела настоящий сценарий на настоящей скорости на настоящем телефоне: холодный запуск, одиночная игра, Магазин и окно покупки, регистрация, вход, лобби мультиплеера и снова удаление аккаунта. Четыре минуты видео с iPhone в 60 кадров в секунду весят около 240 МБ, а это слишком много для вложения, поэтому ffmpeg сжал его до менее 10 МБ с читаемым интерфейсом. Мы записали весь список кадров, потому что если этот проект чему-то нас и научил, так это тому, что мы всё забываем.
Ответы мы положили в двух местах: в ответ в Resolution Center и в заметки для проверяющих в карточке приложения, чтобы каждая следующая отправка приходила уже с ответами на эти вопросы. Проверяющие следуют этим заметкам буквально. Пиши их для того, кто никогда не видел твоё приложение, у кого есть сорок секунд и в руках iPad. Всё это окажется правдой.
Пока мы репетировали, всплыло ещё кое-что. Удаление аккаунта один раз зависло на «Deleting...» и сработало со второго раза. Мы подозреваем, что сервер задремал, а для проверяющего это выглядит ровно как сломанная кнопка. Не давай серверу спать, пока проверяющий в городе.
Весенняя уборка товарных знаков
Пока Apple держала наше внимание, мы прошлись по игре в поисках всего, что звучит как бренд. Правила Apple о правах на контент заставили нас присмотреться, и найденное нам не понравилось. У двух персонажей были «BMW 3 Series (CPO)» и «Honda Civic». Эти названия ничего не добавляли игре и приглашали кучу проблем, поэтому теперь это «Спорткар (с пробегом)» и «Простой седан». Слово «monopoly» ушло из наших ключевых слов в App Store.
Потом был Lambo. Выяснилось, что фишка Lambo никогда не была машиной. Всё это время она была эмодзи клетчатого флага, так что прежнее название обещало суперкар, а выдавало гоночный флаг. С финансовой точки зрения это просто маркетинг. Теперь она называется Chequered Flag. Тема поля The Tank стала Shark Pool.
Единственное правило, которое мы не нарушили.
Мы изменили отображаемые названия, а каждый ID продукта оставили ровно там, где он был. Клетчатая фишка по-прежнему pawn.lambo под капотом и всегда ею останется. Эти ID работают в обоих магазинах, привязаны к ценам и названы в выдаче наборов, а переименование любого из них отобрало бы предмет у всех, кто им уже владеет. Названия — это текст. ID — это контракты.
Отказ номер два: инцидент с iPad
17 сентября Apple вернулась, и на этот раз нашла настоящие проблемы. Проверяющий использовал iPad Air (11 дюймов, M3) с iPadOS 27, потому что приложения только для iPhone запускаются на iPad в режиме совместимости и проверяются там. Замечаний было два. Guideline 2.1(a): нажатие на «Продолжить с Apple» или «Продолжить с Google» показывало ошибку. Guideline 2.1(b): проверяющий не смог найти наши 39 покупок в приложении.
Обе проблемы были наши, и в некотором смысле это была одна и та же проблема.
Баг
Плагин входа требует объект options при каждом вызове. На iOS, если его нет, плагин отклоняет запрос с «Missing provider or options» ещё до того, как успеет появиться окно входа. На Android тот же плагин молча подставляет пустой объект и работает дальше. Поэтому одна и та же строка кода прошла проверку Google Play и упала при первом нажатии на стороне Apple, на каждом iPhone и на каждом iPad.
Один пропущенный параметр. Android его простил. iOS — нет.
Магазин, который никто не мог найти
Покупки были отдельным недоразумением, которое идеально легло на первое. В старых заметках для проверяющих мы писали, что для покупок нужен вход. Вход был сломан. Поэтому проверяющий так и не дошёл до Магазина, в замкнутом круге нашего собственного изготовления.
Дальше стало хуже, когда мы присмотрелись, потому что у Магазина нашлось ещё три способа разочаровать. Если список продуктов загружался без пакетов, Магазин считал это «ничего не продаётся» и прятал все предметы, которых у тебя ещё не было. Три набора (из 5 фишек, Темы и Стартовый персонаж) были скрыты с июня. А гость, купивший Набор из 5 фишек, заплатил бы и ничего бы не разблокировал, потому что наш сервер раскладывал наборы на предметы только для вошедших игроков. А гость, конечно, — именно то, кем является проверяющий. Забрать у человека деньги и вручить пустую коробку — отличный финансовый урок. Просто не тот, который мы хотели преподать.
Список исправлений, для протокола. Передать параметр. Сделать так, чтобы оба окна входа цеплялись к активному окну приложения на iPad, потому что плагин привязывался к первому окну, а на iPadOS оно не всегда видимое. Научить Магазин, что ноль загруженных продуктов означает «ещё не загружено», а не «пусто». Вернуть наборы. Научить приложение раскладывать наборы для гостей. И переписать заметки для проверяющих, чтобы простыми словами сказать: для покупки вход не нужен, и вот точный путь к Магазину.
Результатом стала 1.2.9. Её заметка о релизе открывается двумя предложениями, которые стоили нам больше всего: «Исправления входа: „Продолжить с Google“ показывает выбор аккаунта при осознанном нажатии, а нативный вход больше не выдаёт ошибку. Магазин всегда показывает свои товары, даже до загрузки цен». Два предложения, десять дней нашей жизни.
Сборки 32 и 33: о них мы не говорим
Можно подумать, что мы могли просто выпустить исправление. Мы выпустили, дважды, и оба раза неверно. В сборках TestFlight 32 и 33 вход через Google работал, а вход через Apple, собственная кнопка Apple в собственной тестовой программе Apple, падал с AuthorizationError 1000.
Причина очевидна потом и невидима до. Права (entitlements) путешествуют в подписи кода. Наш скрипт загрузки архивировал приложение с отключённой подписью и оставлял подпись шагу экспорта, который может подписать приложение, но не может дать ему права, которых у него никогда не было. Права для входа через Apple в сборку так и не попали. На языке разработчиков приложение вышло из дома без штанов.
Теперь скрипт загрузки подписывает на этапе архива и отказывается загружать любой архив, в подписи которого нет нужных прав. Мы построили вышибалу. Он проверяет документы. Сборки 32 и 33 мертвы, а сборка 34, одетая как положено, — та, что мы отправили Apple обратно.
А потом Apple сказала «да».
Горячая штучка
К 24 сентября игроки говорили нам, что их телефоны нагреваются. iPhone 15, iPhone 16 Pro Max, а веб-версия тоже была чуть тёплой. Мы бы с радостью сказали, что это сырая сексуальность сложного процента. Это был таймер.
Игра тикала счётчиком раз в секунду, в любом режиме, и каждый тик перерисовывал всю игру: поле, каждую клетку, каждую панель. Вечно. Тем временем анимированные фишки перерисовывались до 120 раз в секунду на телефонах с быстрыми экранами, чтобы нарисовать анимацию в 30 кадров в секунду. Размытие на весь экран за каждой картой пересчитывалось на каждом кадре, потому что под ним всё время двигалась фишка. А свечение, из-за которого поле выглядело живым, анимировало тени, что заставляет перерисовывать каждый кадр.
Мы починили все четыре. Счётчик стал одним тайм-аутом. Фишки рисуют только целые кадры и встают на паузу, когда они за экраном, при уменьшении движения или когда их закрывает карта. Свечение и кольца анимируют прозрачность и положение вместо теней, и пульсируют три раза, а потом отдыхают. Простой на поле упал с 624 мс до 15 за десять секунд безголового тестирования. С открытой картой и фишкой-драконом на поле он упал с 1 188 мс до 11. Наши анимации теперь демонстрируют больше самообладания, чем мы проявляли где-либо ещё в этом проекте.
Выпущено как 1.2.10, с заголовком «Телефоны прохладнее», вместе с более честным правилом увольнения. Останавливается только твой оклад, когда тебя увольняют. Пассивный доход продолжает платить, а счета всё равно нужно оплачивать. Быть уволенным должно быть чувствительно. Это не должно удалять твою подработку.
Бухгалтерская книга: все заметки о релизах подряд
Заметки о релизах мы храним в одном файле, том самом, из которого питаются оба магазина. Если прочитать их по порядку, получается странный дневник, и вот он, с добавленным подтекстом. Даты — это даты коммитов. В файле нет записей между 1.0.1 и 1.2.6, так что всё, что случилось между ними, случилось без дневника. Номер каждой версии ниже ведёт на её собственный пост.
1.0.0
Первый релиз Moneyflow. Строй финансовую империю на недвижимости, акциях и бизнесе. Вырвись из офисной рутины, выйди на Скоростную дорожку и гонись за своими мечтами.
Искренне, коротко и слегка в ужасе. Посмотри, какой она была маленькой.
1.0.1
Google Play Веб-покупки теперь доступны на playmoneyflow.com. Улучшена стабильность и удобство по всему приложению.
App Store Улучшены стабильность и производительность. Исправлены разные ошибки на панели финансового отчёта и в анимации кубиков.
Одна версия, два набора заметок. У магазинов разные представления о том, что можно говорить людям, поэтому мы держим по набору на каждый и стараемся их не путать.
1.2.6
Налоги введены: подоходный налог с зарплаты, 15% с пассивного дохода, 15% налога на прирост капитала с прибыльных продаж. Персонажи теперь получают реальные американские зарплаты 2025 года. Аренда и доходность бизнеса следуют за экономикой — скудны в кризис, щедры в бум.
Появляется налоговая. Никто об этом не просил, и всем это было нужно. Любая доходность в игре теперь оценивается после налогов, потому что только она и имеет значение.
1.2.7
Торгуйся по сделкам, предложениям и условиям кредита: один раз подбрасывается монета, на 20% лучше или на 20% хуже. Выбирай, какую недвижимость продать в «Борьбе за недвижимость» и какие активы отдать при разводе — или подпиши брачный договор.
Торг в невинной первой форме. А ещё первое появление брачного договора, что многое говорит о том, что было у нас на уме.
1.2.8 7 сентября
Торгуйся дважды: поторгуйся, а потом ещё раз — но собеседник может уйти (10%, затем 15%). Карты теперь подходят твоей жизни: никакого развода до свадьбы, никакой продажи акций без акций. Развод делит чистое имущество, а бывший супруг может взять на себя кредиты.
Романтичная. Попросишь дважды — и они обидчивы. До этой версии колода могла выдать развод до свадьбы, а это хаотичнее, чем часовня в Вегасе. Это ещё и версия, которая привела нас к дверям Apple.
1.2.9 22 сентября
Исправления входа: «Продолжить с Google» показывает выбор аккаунта при осознанном нажатии, а нативный вход больше не выдаёт ошибку. Магазин всегда показывает свои товары, даже до загрузки цен.
Написана под давлением двух отказов и одного пропущенного параметра.
1.2.10 26 сентября
Телефоны прохладнее: игра больше не заставляет твоё устройство работать на износ, пока ты играешь. Анимации в простое пульсируют несколько раз и затихают, а поле перестаёт перерисовываться каждую секунду. Увольнения честнее: останавливается только оклад, пассивный доход продолжает приходить, а расходы по-прежнему нужно платить в пропущенные зарплаты.
Та, в которой мы перестали давать твоему телефону температуру.
1.2.11 26 сентября
Новое в меню покупок: городская квартира, химчистка и мотель у трассы. … У каждой карты своя иллюстрация, а варианты выбора расположены прямо под картой. Приглашай друзей в приватную комнату мультиплеера.
Самый насыщенный релиз и один из самых недолгих, потому что в тот же вечер вышла 1.2.12. Приватные комнаты — главное для всех, у кого есть друзья: хост, от двух до четырёх мест и код из шести символов.
1.2.12 26 сентября
Не хватает денег? Теперь ты сам выбираешь, как покрыть нехватку, и видишь, как близко банкротство: экстренные кредиты подряд, запас для займов и сколько зарплат осталось. Экстренные кредиты теперь стоят дешевле кредитной карты.
Банкротство теперь идёт с обратным отсчётом, а это самый дружелюбный из известных нам способов научить страху. Экстренные кредиты теперь стоят дешевле кредитной карты, а это больше, чем сделает для тебя реальная жизнь. Ещё исправлено: кубики раньше бросались сами после закрытия карты, что было либо ошибкой, либо нашей самой пассивно-агрессивной функцией.
1.3.0 27 сентября
24 новые карты, от мотеля у трассы и SaaS-компании до «Игры на понижение», плюс редкость: теперь выпадают необычные и редкие карты. Скрой карту, чтобы посмотреть на поле, а потом нажми «К карте». Увольнения и ЧП больше нельзя закрыть.
Двадцать четыре новые карты, система редкости и, тихо, самое важное изменение месяца: карты теперь приходят с сервера. Об этом ниже.
1.3.1 27 сентября
Займы под залог активов: любой объект недвижимости, бизнес или акции без кредита теперь могут обеспечить более дешёвый кредит с выплатой только процентов по рыночной ставке плюс 0,5%.
Опять плечо. Это финансовая игра, и мы ничего не можем с собой поделать. Она вышла после 1.3.0, позже в тот же день.
1.4.0 1 октября
Новые боты уровня «Профи» планируют каждый ход и читают экономику, и теперь любой бот может покупать мечты, побеждать и занимать под залог своих активов. Экономика влияет сильнее: ставки следуют циклу подъём-спад, в рецессию снижаются налоги, а арендная плата с твоих активов растёт в подъём и падает в рецессию.
Та, в которой боты научились побеждать. До сих пор ни один из них не мог, потому что ни один никогда не покупал мечту. Пришли боты «Профи», экономика начала двигать ставки, налоги и аренду в такт своему настроению, а приложение выучило ещё восемь языков.
1.4.1 1 октября
… Ипотека теперь гасится за 25 лет, бизнес-кредиты за 15, автокредиты за 6; по банковским кредитам платятся только проценты, а занимать можно, пока платежи не дойдут до 67% дохода. …
У ипотеки наконец есть дата окончания. Работа над кредитами появилась после того, как 1.4.0 была уже собрана, поэтому вышла как 1.4.1 в тот же вечер, вместе с новостной карточкой на главном экране.
1.4.2 1 октября
Одна ошибка, исправленная меньше чем через двадцать минут после 1.4.1: кнопка «Бридж-кредит» теперь предлагает ту сумму, которую банк действительно одобрит. У неё нет собственных заметок для магазинов.
Выходные пяти версий.
Суббота, 26 сентября
- 14:241.2.10Телефоны прохладнее, увольнения честнее
- 16:271.2.11Объекты, условия кредитов, иллюстрации карт
- 19:401.2.12Обратный отсчёт до банкротства
Воскресенье, 27 сентября
- 09:311.3.024 новые карты, редкость, удалённый контент
- 13:191.3.1Кредит под залог активов
Время коммитов, по времени Софии. Не каждая версия дошла до каждого магазина под собственным номером: в Google Play 1.2.12 ушла в продакшен вместо 1.2.11, а в iOS была отправлена вместо неё. За те же выходные колода пополнилась 130 иллюстрациями, нарисованными кодом.
Лучшее обновление — то, которое никому не нужно одобрять
К концу тех выходных мы узнали кое-что полезное. Самая медленная часть выпуска обновления — не его сборка. Это ожидание, пока магазин на него посмотрит. Поэтому 1.3.0 сделала кое-что иное: научила приложение принимать доставки.
Новые карты теперь приходят с наших серверов, так что большинству нового контента обновление приложения больше не нужно. Чтобы поставить механику, потребовался один релиз приложения. После этого новые карты — это деплой, переводы и иллюстрации включены.
Магазин работает так же. Apple проверяет новую покупку в приложении отдельно, без новой сборки, поэтому новой фишке тоже не нужна новая версия.
Хитрая часть — страховка. Никому не выпадет карта, которую его приложение не умеет разыграть, поэтому старые и новые версии могут сидеть за одним столом без проблем. Когда мы придумываем действительно новую механику, мы всё равно встаём в очередь, как все.
Тот же релиз принёс редкость, а это значит, что некоторые карты выпадают гораздо реже других. Насколько реже — наш секрет, но самые редкие появляются примерно так же часто, как App Review проходит с первого раза. Нам выпала обычная.
Табло
Для тех, кто любит таблицы.
- 10номеров сборок за 20 дней, с 30 по 40
- 39покупок в приложении, и каждая косметическая
- 2отказа от Apple, плюс одна отправка, которую мы отозвали сами
- 3 917символов в нашем ответе из 4 000 допустимых
- 24 из 39покупок не создались при первом запуске скрипта. Второй запуск прошёл чисто
- 2мёртвые сборки, 32 и 33, ушли без своих прав
- 5версий закоммичено за одни выходные
- 624 → 15миллисекунд простоя за десять секунд, до и после того, как мы охладили игру
Что мы сказали бы себе в самом начале
То, что раньше было вечером кликов, теперь — повышение версии, заметка и горсть команд на магазин. Ожидание — единственное, что мы не можем автоматизировать. Всё остальное вошло в этот список.
- Сначала добавляй версию в отправку, потом покупки в приложении. Apple позволит сделать наоборот, а потом откажется объяснить почему.
- Пиши заметки для проверяющего так, будто он никогда не видел приложение. У него сорок секунд и iPad, и он следует заметкам буквально. Дай ему точный путь ко всему.
- Никогда не ставь вход перед своим Магазином. У гостей тоже есть кошельки, а проверяющие — гости.
- Подписывай архив, а потом сделай так, чтобы скрипт отказывался загружать тот, в котором нет прав. Построй себе вышибалу.
- Пусть пропавшие ключи кричат. Сборка 30 вышла без ключа платежей, и ничего громко не пожаловалось, так что Магазин был просто пустым. Тихий сбой — это отказ с задержкой.
- Тестируй на обеих платформах, даже если код общий. Android простил то, от чего iOS отказался, и у одной строки кода оказалось два разных характера.
- Переименовывай продукты, но никогда их ID. Названия — это текст. ID — это контракты.
- Автоматизируй, делай повторяемым, записывай. У API Apple порой просто бывает момент, так что перезапусти, прежде чем отлаживать. Наши инструкции существуют, потому что мы всё забыли дважды.
- Держи отдельные заметки о релизе, когда у магазинов отдельные правила. Одна версия, разные предложения.
- Отдавай контент с сервера, а очередь магазина оставляй для новых механик. Лучшее обновление — то, которое никому не нужно одобрять.
- Тестируй на горячем железе, которое действительно есть у твоих игроков. Симулятор никогда не краснел. iPhone 16 Pro Max покраснел.
- Не давай серверу спать, пока проверяющий в городе. Спящий сервер выглядит точно как сломанная кнопка.
Ну же, прокатись с нами
Moneyflow бесплатна в App Store, бесплатна в Google Play и бесплатна в любом браузере. Рекламы нет, а чтобы начать, аккаунт не нужен. Всё в Магазине косметическое. Ничто в нём не помогает победить, а в игре про деньги это либо очень принципиально, либо очень плохой бизнес.
Что дальше? Больше карт, которые теперь приходят с сервера, больше способов играть с друзьями и, если вселенная будет добра, одна полная неделя без номера версии.
До встречи на поле.