Когда-то я думала, что для того, чтобы запустить своё приложение достаточно написать код. Чуть позже я узнала, что неплохо дополнять код дизайном. Ещё позже я поняла, что необходимо искать аудиторию и продвигать ей свой продукт. Но всё это может быть лишним, если не следовать гайдлайнам. Ниже я расскажу о своём первом опыте самостоятельной разработки и почему моё приложение не увидит пользователей.
Для начала оговорюсь, что приложения я разрабатываю уже около пяти лет и это не первое моё приложение вообще, но первое абсолютно самостоятельное, в котором я прошла путь от идеи до реализации. Так вышло, что последний год я совсем не писала код, а была менеджером продукта. Мне казалось, что код я не буду писать больше никогда, что это слишком скучно. Но никогда начало ломаться через полгода, когда мне стало интересно разобраться в 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, а про приложение забыть, опыт оно уже принесло.
В следующий раз, когда я буду публиковать свои приложения, я обязательно:
- Пробегусь хотя бы поиском по гайдам публикации в AppStore
- Буду публиковать приложение как можно раньше
- Задумаюсь, а почему такого функционала нет в существующих продуктах на рынке, и еще более внимательно пробегусь по гайдам.
- Не буду шутить с Apple.
Комментарии (83)
KevlarBeaver
19.11.2018 20:05+4Можно пойти другим путём, запустить стартап с тренингами для девушек, на которых обучать их пользоваться русским языком для того, чтобы объяснить оппоненту, что свидание себя изжило. В качестве дополнительных курсов, так сказать, PRO, можно прокачивать самоуверенность и избавлять от комплексов. Групповые тренинги, «выход в поле» и т.д. — простор для стартаперства.
malinoeshka Автор
19.11.2018 20:19Инфобизнес дело, конечно, хорошее. Но пока не мой путь) хотя может и напрасно
XanKraegor
19.11.2018 20:40Идея приложения выходит за рамки свиданий, ведь не обязательно Катя может позвонить, но скажем начальник, врач или следователь — ограничивается лишь фантазией и в некоторых ситуациях будет как раз кстати.
aalebedev
19.11.2018 20:15Вы пробовали ответить на комментарии от Apple?
Возможно стоит рассказать про пользу, про то, что это единственный эффективный способ сделать такую задачу.malinoeshka Автор
19.11.2018 20:24+1Да, у нас была достаточно длинная дискуссия, но они очень категоричны по поводу fake calls и callkit. А так же про использование voip-пушей. Я что-то забыла описать это.
1dNDN
19.11.2018 20:19А Google Play вы не рассматриваете, как платформу для продвижения? Для начала проще на андроиде стартовать
malinoeshka Автор
19.11.2018 20:20+1Мне с опытом разработки под iOS было явно проще в AppStore. Но каждый раз, когда я сталкиваюсь с таким, начинаю думать а не поменять ли мне платформу.
Kalobok
19.11.2018 21:10На андроиде хватает своих заморочек. Хрен редьки не слаще.
malinoeshka Автор
19.11.2018 21:20Везде хорошо, где нас нет) но помечтать можно
roscomtheend
20.11.2018 14:56Были уже истории когда пропускали (премодерация у них хуже что ли), а потом «упс» и приложение забанено. Не знаю как Эппл, но ТП Гугла это ад (про плей только слышал, с некоторыми другими сервисами общался) и добиться конкретики подчас почти невозможно.
Serjaru
20.11.2018 09:38там нет заморочек! а вот яблоко, это один большой геммор. уже не первый человек, кто не может разместить.
JediPhilosopher
20.11.2018 14:28Буквально пару дней назад у меня гугл удалил приложение из плеймаркета и сразу же забанил мой аккаунт разработчика (т.е. я даже исправить уже ничего не могу), о котором я писал в своей статье https://habr.com/post/421451/.
Причем эппл вон хоть на дискуссию согласны. А гугл судя по постам других людей на хабре вообще в дискуссии не вступает, причем выпиливает не только само приложение но и аккаунт разработчика (на котором приложений могло быть много). Поддержка лепит автоматические отписки в духе «наша логика неоспорима, раз удалили значит за дело, идите нахрен».lagranzh
20.11.2018 14:42А чем мотивировал удаление?
JediPhilosopher
20.11.2018 15:24Введение пользователей в заблуждение, выдача себя за другую компанию. То ли иконка у меня оказалась слишком похожа на ютубовскую, то ли еще что, никаких детальных разъяснений что именно им не понравилось они не прислали, только ссылку на пункт правил.
Я было подумал что сейчас вот через день-два все переделаю и перезалью, как мне через день прилетает полный бан аккаунта.timdorohin
20.11.2018 17:00А нефиг лезть в сервисы гугла. А уж если еще и рекламу не показывали — так вообще легко отделались. Была пара прецендентов когда подобных «гениев» лишали обслуживания сразу во всех сервисах гугла.
P.S. и в то же время иногда подобные приложения месяцами в сторе живут. Вот уж во истину правая рука не ведает что делает левая.
P.P.S. бэкапьте почту с gmail'a.
codecity
19.11.2018 20:55+2Вот и минусы всяких там магазинов приложений — пользователи хотят а хозяин запрещает. Большой брат на верху — всегда плохо.
Дедовский способ распространения софта в этом отношении куда более демократичен.malinoeshka Автор
19.11.2018 21:27Но в случае с Apple особых альтернатив не дают =(
RoboForm
19.11.2018 23:23Посмотрите в сторону PWA — я не углублялся, но по-моему все, что вам надо, там реализовать вполне можно.
Tyusha
19.11.2018 21:13А зачем делать реальный обратный звонок. Достаточно отобразить экран звонящего телефона и проиграть мелодию. А также (факультативно) на время фейкового звонка запретить приём настоящий звонков (если это не запрещено).
aalebedev
19.11.2018 21:22Как отложено запустить приложение, которое свернуто и отобразить экран звонящего?
ianzag
19.11.2018 22:57Сразу скажу — ничего не понимаю в разработке под Apple. Но с моей, чайниковской, колокольни — неужели в iOS нельзя зашедулить какое-то событие, которое бы запускало приложение XXX в заданный момент времени? А как же тогда работает будильник?
PS: Обычный будильник то есть в iOS? Не может быть, чтобы его не было!
andrew8712
20.11.2018 09:31Такие приложения после установки таймера просто показывают черный экран и просят не закрывать приложение.
Через некоторое время по таймеру экран включается и телефон якобы начинает звонить.
malinoeshka Автор
19.11.2018 21:25Сложность возникает, если хочется запустить звонок не прямо сейчас, а через какое-то время. Тогда есть две возможности:
1. Держать экран приложения всё время открытым. В добавок отключить автоблокировку экрана.
2. Использовать пуши для настоящих звонков, но в этом случае нужно делать звонки.aalebedev
19.11.2018 22:361. Автоблокировку долго отключать в настройках в приложении не получиться.
2. Тут не совсем понятно.
Я бы попробовал сделать так:
1) приложение позволяет добавить контакт сервиса с именем Катя и так далее.
2) потом делается запрос и бот звонит.
Так, конечно сложнее и затраты. Но так вроде не смогут придраться.malinoeshka Автор
20.11.2018 05:58Мне очень нравится идея со звонящим роботом, интересно не будит ли это воспринято как prank call опять. Надо потестить, спасибо)
aalebedev
20.11.2018 07:39Кстати, я еще подумал, что не обязательно делать реальный телефонный звонок.
Можно через messenger. И затраты меньше будут.ianzag
20.11.2018 08:12Через мессенжер будет неубедительно.
Как-никак Марьивана звонит. Начальница.
— Варька! Ты где ерпст??? Быстро марш на работу! Шпалы стынут!
— Дамарьвнна! Бегу!
Какой тут может быть месенжер? Только войс только хардкор.RiseOfDeath
20.11.2018 10:01Я думаю имеется ввиду голосовй звонок в месседжере. (большинство месседжеров умеют)
darthslider
20.11.2018 14:21+1Тогда вообще достаточно телеграм бота, который будет вам звонить в указанное время. Сохранить у себя бота в контактах можно же под любым именем.
Hardcoin
20.11.2018 12:39Если начальница — не убедительно. А если подруга у которой что-то там случилось — убедительно.
Я вообще с трудом представляю второго участника свидания, который скажет — а чего это подруга тебе в вотсап звонит, а не на телефон? Никуда не пойдешь, сиди, продолжаем наше первое свидание!
barbanel
20.11.2018 15:29Я конечно не девушка, но имхо, если незнакомый мне человек говорит «ты никуда не пойдешь» — это повод напрячься и м.б. даже звонить в полицию.
roscomtheend
20.11.2018 17:00А если он в странной шляпе и с посохом… то ещё и в дурку.
barbanel
20.11.2018 17:06Согласитесь,
«ты никуда не пойдешь»
и
«ты не пройдешь!»
это немного разные фразы из разных реальностей =)
andrew8712
20.11.2018 09:36Автоблокировку включать необязательно. Можно в AppDelegate прописать
UIApplication.shared.isIdleTimerDisabled = true
Ну и экран должен быть все время открытым и показывать либо черный экран, либо фейковую картинку Springboard.
tuxi
19.11.2018 23:29+2Странно, есть же решение, буквально на поверхности лежит. Приложение ставится на 2 телефона, в них прописываются телефоны друг друга. Отправка смс с кодом #call_me#08:45PM# (#call_me#30m#) или #alarm_me#08:45PM# инициирует звонок с другого телефона. Ну хотите сэкономить на смс, через какой нить вайбер высылайте. Все это можно оформить как «соцсеть для забывчивых девочек». Ни один гайдлайн не проскочит имхо :) Благодарностей не надо :)
[update] Для пущей реальности, телефон который вызвал другой телефон, после ответа, может проигрывать звуковой файл с непрерывной громкой речью. Например, куча громких криков на тему "… где тебя носит в такое время, ребенок не кормлен, няня уволилась, а я разведусь с тобой!!!" :)malinoeshka Автор
20.11.2018 05:57С смс-ками ничего не выйдет точно, в iOS их нельзя перехватывать. В чужое приложение тоже не получится вклиниться, разве что у них там ботов можно писать) А было бы неплохо
zagayevskiy
20.11.2018 16:32Второй телефон на андроиде, естественно. Зачем вам лежащий без дела айфон?)
tamtakoe
20.11.2018 01:18+1Слава Эппл! Теперь девушки не будут сбегать со свиданий. Они же такие глупенькие, что ничего лучше звонка от подружки не могут придумать :-)
roscomtheend
20.11.2018 15:03+3Напоминалка. И с криком «я же его приковала в подвале позавчера, а покормить забыла» быстро убежать.
barbanel
20.11.2018 15:31Да какая напоминалка??!
Мы все взрослые люди:
— Чувак, знаешь, не будем тратить время друг друга, мне это свидание больше не интересно. Удачи в поисках, я пошла.
Так будет намного проще, а главное — честнее и правильнее.roscomtheend
20.11.2018 17:00Хотелось бы, но страх как-то не так выглядеть перед человеком, которого видишь первый и последний раз, зачастую перевешивает. А уж если оказалось что кто-то из двоих даже слышал о том, кого когда-то видел другой, то вообще мрак начинается. Потому проблема нетехнической области решается техническими костылями.
tamtakoe
21.11.2018 17:08Но автор-то, вообще, менеджер продукта и скил общения должен быть хоть как-то развит. Бывает нужно и людей нанимать и отказывать и увольнять, а это гораздо сложнее чем просто красиво слиться со свидания
var
21.11.2018 11:36Взрослые люди играют в социальные игры, а данный подход к завершению отношений — такой вид игры (причем постоянно).
Вероятно, мир не станет лучше (но и хуже) от того что все станут говорить свои мысли прямо.
А неумение играть в подобные игры в современном обществе — это фильтры отбора, не более и не менее. :)
Ну и мир станет окончательно скучным и предсказуемым, если упорядочить еще и эту часть нашей жизни.
Так и вижу это свидание:
Здрасьвуй, мне от тебя нужен только секс.
О! Мне тоже, пошли и давай не будем тратить лишние деньги.
Я сильно утрирую, но именно из социальных игр и строятся наши сложные взаимоотношения, ИМХО.
Ну и главное, так людям проще найти партнеров, с которыми они заведут отношения.
Не смогла вам девушка прямо ответить, значит, точно мимо. :)
Gabiani
20.11.2018 06:00Что мешало сделать реальный прямой отложенный звонок? Девчонки не носят по два айфона? — на этот случай можно специально запастись вторым, как бы рабочим. И в последних айфонах вроде как две симки есть — сделать прозвон на номер на второй? А можно звонить с телефона на скайп (свой же) или другой voip-клиент, кто запретит?
malinoeshka Автор
20.11.2018 06:00А что такое отложенный звонок, как это работает? Я как-то не в теме.
PurpleTentacle
20.11.2018 19:43Две симки есть только в Китае. А в США там нет физической второй сим, эта технология работает пока только в США
j_wayne
20.11.2018 09:44А если использовать настоящий звонок с какого-нибудь Twilio — тоже не пройдет модерацию?
402d
20.11.2018 12:18если не хотите хоронить саму идею, то
можно скрестить мессенджеры и облачные атс.
Например,
Лена отсылает через телеграмм сообщение «3 мин» КатеCall_bot
бот ставит задание в очередь
когда настает его время дергается апи телефонии
zadarma.com/ru/services/calls/callback/#api
в этом случае подойдет вызов с предикатом, чтобы сперва
дозвонился до to. И на ожидание вещаем голосовое приветствие.
«Срочно.Тут такие проблемы на работе. Все не приедешь — Уволю»
malinoeshka Автор
20.11.2018 12:19Да, спасибо за идею. Мне так много людей посоветовали сделать это, что я обязательно посмотрю в эту сторону.
i86com
20.11.2018 15:05+1Тогда не забудьте ещё посмотреть по платным номерам и тарификации. А то так назвонят вашим ботом на $1000.
402d
20.11.2018 15:37Способ с реальными звонками как бы предполагает, что сие будет для девушек платным.
Городской номер это где-то 200 рублей в месяц. Минута разговора от 50 копеек.
Чтобы не прогореть за такой вызов думаю надо брать от 10 рублей.
Или подписки вводить «Все сложно» (200 руб/месяц), «В активном поиске» (500р) ;)dimka11
20.11.2018 18:08А можно проверять, что оплата действительно прошла?
А то приложение поломают и будут звонить бесплатно.
selivanov_pavel
20.11.2018 15:43Сразу чарджить за звонок — и никаких проблем. Или например, первые 2 звонка — бесплатные, дальше — докупать пакетами по 20 звонков. Главное, внятно объяснить пользователю, что из-за ограничений Apple фейковый звонок делать нельзя, а реальные стоят денег.
402d
20.11.2018 12:34Более реальным мне кажется такой сценарий. Собираясь на свидание
девушка настраивает
1) время.
2) Выбирает голос и текст.
3) узнает номер с какого будет обратный вызов.
4) Заносит его в контакты с нужным описанием.
Если на свидание все хорошо, то просто дважды сбрасывает вызов.i86com
20.11.2018 16:19Так можно и для парней доп-услугу предложить. Назвать ElonCall:
Задаёшь время, голос и контакт с картинкой и если на свидании девушка всё ещё сомневается, у тебя на телефоне (показательно лежащем на столе) раздаётся звонок и ты такой:
— Ой, погоди, это Илон Маск звонит.
Поднимаешь трубку и такой:
— Hey, Musky-boy, wassup?…402d
20.11.2018 16:42Для родителей. Звонок от деда мороза. В прошлом году короткий номер был, на который можно было самим набрать.
HattoriHandzo
20.11.2018 13:07Сделайте приложение с допустимым функционалом и так чтобы через конфиг подключался желаемый. И тогда оно пройдет проверку и будет доступно людям. К примеру какую-то безделушку типа похожую по тематике но допустимую.
Tatikoma
20.11.2018 14:14Помимо звонка, крайне желательно, чтобы там что-то адекватное проговаривалось в трубке. Нужно чтобы диалог был. Иначе подозрительно =)
Можно просить совершить звонок других пользователей приложения (+ начислять им баллы, списывать баллы, строить рейтинги итд, подключить фиатные деньги в конце-концов). Кажется это должно решить текущие проблемы (и привнести новые проблемы).dimonoid
20.11.2018 19:37Я где то видел будильник (!) с похожим функционалом под Android. Просто люди с разных временных зон будили других голосовым сообщением online в заданный временной интервал, и слушали обратную запись пробуждения). Не помню уже как называется.
Ps. Хм, странно, не могу найти в маркете. Похоже что его заблокировали.
LeshaVH
20.11.2018 16:10типичная главная ошибка — когда приложение не нужно никому кроме себя любимой и не нужно платформодержателю)))
все правильно — в топку!
nuneTka
20.11.2018 16:10Я так и не понял, что мешает сказать правду: -не интересен/а, -скучный/ая и т.д.
alexeyrossosh
20.11.2018 17:22Что интересно, недавно без каких либо проблем выпустили приложение с похожей механикой. Приложение звонит по заведенным в Google календаре событиям. Причем неважно в каком состоянии находится приложение (в бэкграунде, убито, не открывалось месяц).
Также события можно завести непосредственно из приложения, тем самым реализовав идею побега с неудачного свидания:)
Reject прилетел только по запрету CallKit в Китае.
Apple, что тут еще сказать.malinoeshka Автор
20.11.2018 17:26Да, интересно. А что за приложение? я бы посмотрела
alexeyrossosh
20.11.2018 17:36Отправил ссылку в личку)
402d
20.11.2018 20:20у Вас исходящий звонок делает приложение?
Не пропускают JokeIncomingCall. А в андроид маркете таких много.alexeyrossosh
20.11.2018 20:39Да, VOIP пуш будит приложение, а то в свою очередь вызывает системный экран входящего вызова
workbohdan
20.11.2018 17:28Можно было бы поставить будильник. Он звенит, а Вы делаете вид, что это звонок. И срочно надо бежать
XanKraegor
Да, к сожалению гайдлайны Apple, которые были направлены вроде как на защиту от мошеннических приложений и засорения AppStore всяким мусором, иногда ставят палки в колёса. Как и сам процесс публикации, кстати. У меня два своих приложения до сих пор висят без публикации, потому что лень седлать для них сайт и написать для одного из них положение о конфиденциальности, что опять же требует Apple :) Буду рад собрать ваше приложение себе на телефон с GitHub.
malinoeshka Автор
Privacy Policy можно сделать вот здесь, это прям пара минут.
Собрать из гита просто так не получится, в репо не хватает файла с ключами от oneSignal. Но если соберетесь себе ставить, то напишите в лс, я скину недостающие части.
XanKraegor
Спасибо за ссылку. А можно вместо oneSignal воткнуть пуши Эппла со своего аккаунта разработчика (чтоб ключи не просить) или там что-то завязано именно на этот сервис?
malinoeshka Автор
Нужен именно ключ от oneSignal, чтобы пуши приходили по расписанию.
XanKraegor
Сейчас сделаю его :) Можно линк на гитхаб, пожалуйста?
malinoeshka Автор
github.com/olgavorona/Kate-Call