imageЯ люблю мобильную разработку, а когда глаза горят от идеи — то оторваться от работы очень сложно.

Так и случилось в этот раз. Вспомнилась мне старая игра «Братья Пилоты» и загадка по открытию холодильника. Для тех кто забыл напомню, что необходимо было повернуть все ручки в горизонтальное положение. Но, при повороте ручки вместе с ней поворачивались другие ручки, находящиеся в том же ряду и столбце. В игре задача решается достаточно просто — необходимо запомнить вертикальные ручки и прокликать по ним, игнорируя последующие состояния.

Очевидно, что ручки в игре были расставлены так, чтобы школьник мог их решить по наитию. Но мне стало интересно — можно ли решить задачу, если все ручки в горизонтальном положении? Или почти все?

Гугл сказал, что решение есть и я даже нашел математическое объяснение для матрицы 4х4. Приводить само объяснение здесь не буду, т.к. это будет нечестное использование чужих трудов и попытка казаться умным.

Раз 4х4 решается, что будет с 5х5? 6х6? Нужно пробовать. В итоге я сел писать игру. Выбрал Swift, хотя были мысли про SwiftUI. Отказаться решил, т.к. в предыдущем проекте столкнулся с «сыростью» фреймворка. А именно — невозможностью программно проскролить ScrollView к нужному значению. В том случае отсутствие данного функционала оказалось критичным, поэтому решил дождаться выхода новой версии и пока отложить SwiftUI.

Игру я сразу разбил на уровни: 1й уровень — матрица 4х4, 2й — 5х5 и тд. Прошел уровень — перешел на следующий. Теоретически — ограничений в уровнях нет.

Основной функционал написал за пару часов. Дизайн выбрал самый простой, т.к. таланта в этом деле нет от слова совсем. Больше времени заняло оформление и локализация — решил, что англоязычный мир тоже должен иметь возможность испытать себя. Для этого также добавил Game Center, тем более, что до этого с ним не работал — оказалось все просто.

Игру решил назвать Крутилки, т.к. вместо ручек холодильника в игре используются цветные крутилочки. Выглядит это все вот так:

Скриншот
image

В целом разработка главного функционала прошла легко. Больше времени ушло на оформление, локализацию и подготовку в релизу. А затем я вспомнил, что звуков в игре нет вообще. Нужно добавить. Поиск занял немного времени, но столкнулся с интересной проблемой в реализации.
Изначально был AVAudioPlayer, который хранился в property. При нажатии крутилки он проигрывался и при completion прокручивался к самому началу трека. Но запустив игру заметил, что первый раз звук проигрывается нормально, а все следующие разы — как-то приглушенно/искривленно. Нагуглил, что это называется jitter, но почему так происходит так и не разобрался. При чем в предыдущих проектов такой проблемы не возникало, но там использовался аудио файл значительно длиннее, чем 1 секунда.

Решение оказалось проще — я убрал перемотку в completion методе и все заработало. Почему первый метод не сработал — буду рад прочитать от знающего сообщества.

Что до самой игры — мне интересно, как далеко зайдут игроки? До какого уровня осилят? Да, 4х4 решается достаточно просто и гугл подскажет алгоритм. Но как насчет 5х5, 6х6? Мне кажется, что 90% максимум пройдут 1 уровень и забросят. Удивила жена, которая за 5 минут отрапортовала о прохождении сразу 2х уровней и начала штурмовать 3й. Признаюсь, сам я до 3го добрался спустя день.

Немного расскажу о трудностях с публикацией в Appstore. Отправив вечером приложение на проверку, я почти сразу получил ответ от Apple — Ваш аккаунт заблокирован и находится under investigation (под расследованием) за нарушение одного из пунктов (не указав такого).

Письмо от Apple
We are unable to continue this app’s review because your Apple Developer Program account is currently under investigation for not following the App Store Review Guidelines’ Developer Code of Conduct.

Common practices that may lead to an investigation include, but are not limited to:

• Inaccurately describing an app or service
• Misleading app content
• Engaging in inauthentic ratings and reviews manipulation
• Providing misleading customer support responses
• Providing misleading responses in Resolution Center
• Engaging in misleading purchasing or bait-and-switch schemes
• Engaging in other dishonest or fraudulent activity within or outside of the app

During our investigation, we will not review any apps you submit. Once we have completed our investigation, we will notify you via Resolution Center.We do not require any additional information from you at this time, nor do we have any additional details to share. We appreciate your continued patience during our investigation.

Best regards,
App Store Review

При этом в ответе также указано, что никакой информации предоставлять не нужно — просто ждите.

Погуглив, я нашел длинную простыню на форуме apple девов о таких ответах. Многие «счастливчики» сообщали, что ждут окончание следствия месяцами. Меня такое ожидание не радовало и я, воспользовавшись формой обратной связи, любезно поинтересовался о причинах. В тот же день пришел ответ, что приложение попало в категорию «спам» и якобы копирует функционал множества уже существующих. При том что я беглым поиском подобного не нашел. В общем я подал жалобу, в которой описал, что поиск не возвращает мне ничего подобного по функционалу и приложение точно является уникальным. Как результат — его пропустили.

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

Выводы


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

Само приложение тут. Оно, естественно, бесплатное. На главном экране может возникать небольшая реклама, которая закрывает свободное пространство внизу.

Буду благодарен за комментарии и отзывы.
Будьте здоровы.