Експертиза · Мобільні застосунки
Застосунки для телефону, побудовані так, щоб логіку можна було перевірити без телефону.
Ми будуємо нативні iOS-додатки на Swift, із сенсорами та HealthKit, і додатки з одним кодом для iOS, Android і web, коли проєкт не потребує сенсорів. Ядро логіки тестується окремо від екрана.
Вже збудованоЄ три власні реалізації, не одна. Репозиторій із п’ятьма цілями застосунку (чотири iOS і одна macOS), визначеними в `project.yml`, чиї тести логіки ми сьогодні запускали: 160 із 160 проходять. Друга iOS-застосунок, в іншому проєкті, з 40 файлами Swift і HealthKit. І третій напрямок, з одним кодом для iOS, Android і web, чия web-версія відповідає сьогодні. Резерв, що змінює відповідь на запитання, яке будь-який покупець ставить передусім: жоден із наших застосунків не опублікований в App Store або Google Play. Причина одна й має назву — `DEVELOPMENT_TEAM` порожній у конфігурації проєкту, тобто відсутній ідентифікатор команди в Apple Developer Program. Машина має чинну ідентичність підписування, достатню для встановлення на власний пристрій, недостатню для розповсюдження в магазині. Це проблема облікового запису, не коду, але вона лишається проблемою, і ми пишемо про неї тут, а не внизу.
Мобільний застосунок має дві частини, які ламаються по-різному. Частина, що читає сенсори й обчислює щось — кут, бал, стан — і частина, що малює екрани. Ми тримаємо їх окремо, і не з естетичних причин: у нашому головному iOS-репозиторії файли ядра не імпортують інтерфейс, тож їх можна компілювати напряму за допомогою `swiftc` на Mac і запускати як звичайну програму, без симулятора і без телефону. Набір має 160 перевірок, згрупованих у 16 етапів; ми запускали його сьогодні, і він проходить повністю. Саме тому ми можемо сказати, що саме робить алгоритм, замість того щоб казати, що він «добре працює».
На iOS ми працюємо в Swift 6, з мінімальною цільовою версією iOS 17. Той самий репозиторій визначає п’ять застосунків як окремі цілі: чотири для iPhone і одну для macOS, а macOS-версія повторно використовує п’ятнадцять файлів із ядра iOS-версії, без копіювання. Сенсори читаються з джерела: інтерфейс Apple для сенсорів у навушниках надає орієнтацію голови, а застосунок порівнює поточний кут із положенням, яке користувач калібрує на початку сесії. Пороги — це не «внутрішні налаштування»: нижче 7° — рівно, між 7° і 13° — відхилення, понад 13° протягом трьох секунд запускає тривогу, а згладжування використовує експоненціальне середнє з коефіцієнтом 0,15. Усі чотири значення стоять у чотирьох послідовних рядках коду і їх можна показати.
Коли проєкт не потребує сенсорів, ми не рекомендуємо нативно. Третій напрям у портфоліо — це один код, який компілюється для iPhone, Android і браузера — React Native з Expo — а веб-варіант опублікований і відповідає сьогодні. Практична різниця для клієнта: одна анкета, один калькулятор або одна панель керування не виправдовують дві команди і два репозиторії; застосунок, який слухає сенсор на двадцять вибірок на секунду, так.
Чого ми ще не можемо. Жоден наш застосунок не в App Store або Google Play. Не тому, що не компілюється — компілюється, встановлюється на симулятор і проходить тести — а тому, що в конфігурації проєкту ідентифікатор команди Apple порожній, тобто немає реєстрації в Apple Developer Program, пов’язаної з цими збірками. На Mac є дійсна ідентичність підпису, типу розробки, якої достатньо для встановлення на власний пристрій і недостатньо для магазину. Для проєкту клієнта обліковий запис розробника відкривається на компанії клієнта і лишається його — це обговорення треба вести на початку, а не наприкінці.