Когда-то я думала, что для того, чтобы запустить своё приложение достаточно написать код. Чуть позже я узнала, что неплохо дополнять код дизайном. Ещё позже я поняла, что необходимо искать аудиторию и продвигать ей свой продукт. Но всё это может быть лишним, если не следовать гайдлайнам. Ниже я расскажу о своём первом опыте самостоятельной разработки и почему моё приложение не увидит пользователей.  Для начала оговорюсь, что приложения я разрабатываю уже около пяти лет и это не первое моё приложение вообще, но первое абсолютно самостоятельное, в котором я прошла путь от идеи до реализации. Так вышло, что последний год я совсем не писала код, а была менеджером продукта. Мне казалось, что код я не буду писать больше никогда, что это слишком скучно. Но никогда начало ломаться через полгода, когда мне стало интересно разобраться в data science и python. И окончательно сломалось через год, когда мне очень захотелось сделать что-то руками и на свет стало появляться моё приложение.  Приложение в первой версии называлось TinderCall. Оно помогает сбегать со скучных свиданий или встреч. Я несколько раз оказывалась в такой неловкой ситуации, что проще всего мне было написать подруге: “Набери меня скорее”, и ждать. Я решила, что это можно чуть автоматизировать, и звонить себе самостоятельно. К тому же выглядело, как отличный способ поработать с CallKit и PushKit. Сама идея приложения появилась у меня от чтения одного блога в инстаграмме, в котором автор рассказывает о том, как она ходит на свидания (от инстаграмма тоже бывает польза). Там многие девушки сталкивались с подобной ситуацией. Чуть позже приложение стало называться “KateCall“ или “Катя, позвони”. Название появилось в разговоре с подругой, которая тоже очень прониклась идеей и сказала, что она обычно просит сделать это Катю: “Катя, позвони”. Мне оно кажется красивой игрой слов. Дальше я начала смотреть, а что уже есть на эту тему. Нашла несколько похожих приложений. Ничего удивительного, идея лежит на поверхности. По всем ним было видно, что это чье-то первое приложение. Без дизайна, и с необходимостью держать приложение открытым, чтобы пришел звонок. Я решила, что стоит сделать еще одно. Только оно будет красивее и функциональнее. Всё равно мне хотелось чем-то размять мышцу программирования. Функционал был определен максимально простым: возможность выбора имени звонящего и времени через которое произойдет звонок. Вначале я решила, что сделаю дизайн самостоятельно, ведь это просто: любимый цвет людей синий, сетка элементов на 8, к тому же я преподавала xCode для дизайнеров. Но когда я его сделала, поняла, что лучше обращусь к своим друзьям-дизайнерам.  Дизайнерская версия мне понравилась гораздо больше, и я приступила к реализации. Всего разработка заняла 35 дней от создания проекта до нажатия на кнопку Submit. 17 комитов и около 40 часов, включая написание кода, чтение и борьбу с багами. Самое большое количество комитов было сделано мной по четвергам. Код проекта доступен здесь. С помощью CallKit можно сделать звонки максимально правдоподобными. Есть несколько нюансов. Во-первых, в стандартный экран звонка нельзя передать любую картинку. Во-вторых, экран звонка ведет себя по-разному в зависимости от того открыто приложение или нет. Так, если звонок идет в приложении, то после ответа нужно показывать экран разговора самостоятельно. А если ответить на заблокированном экране, то появится стандартный экран разговора. В-третьих, CallKit нельзя использовать в Китае. Второй технический момент связан с пушами. Таймер мне не подходил, потому что для него нужно держать приложение постоянно открытым. Я думала в сторону локальных пушей, но они не гарантируют того, что приложение будет разбужено. Оказалось, что существует отдельный тип пушей для VoIP. Они обладают целым списком замечательных свойств: Но и использовать их можно только если есть функциональность звонков. Отдельный middleware для получения этого пуша писать не хотелось, как оказалось, и не нужно было. Библиотека OneSignal позволяет посылать любые виды remote-пушей из приложения по расписанию. Я, честно, не представляю ситуацию, где ещё могут понадобиться VoIP-пуши по расписанию, но возможность их слать есть. Для OneSignal нужно обязательно использовать отдельный voip-push сертификат. Получить его можно там же где и обычный.  Когда основной функционал был закончен, я решила, что этого не достаточно. Захотелось сделать более понятный экран с временем ожидания звонка, а потом еще информацию обо мне и обратною связь, добавить taptic, добавить возможность выбора голоса, добавить… Я смогла остановиться после первой доработки и решила, что зная AppStore и их количество ограничений, стоит отправить им приложение как есть, а потом уже доделать приятные мелочи. И не прогадала.  Моё приложение отклонили по двум пунктам: 1.1.6 Apps that enable anonymous or prank phone calls or SMS/MMS messaging will be rejected(Приложения, которые позволяют делать анонимные или разыгрывающий звонки, смс, ммс будут отклонены), и 5.2.5 Your app contains features that mimic the iOS call interface or behavior(Приложение мимикрирует под стандартный механизм звонков). Так что существующие приложения скорее всего не использовали CallKit, не потому что не догадались, а потому что нельзя. К сожалению, диалог со службой публикации ни к чему не привел. Fake calls ни в каком виде нельзя сочетать с CallKit и VoIP пушами. Доводы о том, что это сделано не шутки ради, а для полезного дела, не помогли. Я уже планировала, как буду продвигать своё приложение на ProductHunt и прочих площадках, начну общаться с пользователями, стану настоящим стартапером. Но для этого нужно обрезать функционал до уровня тех приложений, что уже есть. Эта идея мне пока не очень нравится, и я думаю просто оставить свой код на gitHub, а про приложение забыть, опыт оно уже принесло.  В следующий раз, когда я буду публиковать свои приложения, я обязательно: iOS разработчик & digital nomad