Kotlin/Swift (iOS) Туда и Обратно
36 subscribers
130 photos
21 videos
9 files
88 links
Канал - журнал, рассказывающий об опыте изучения Swift & iOS backend-разработчиком на Java & Kotlin
Download Telegram
Добавлю немного скринов:
🔸 список сохраненных вкусняшек (или наоборот)
🔸 большое вью с картой, где можно выбрать место
🔸 вью редактирования/просмотра с превьюшкой карты (тут можно увидеть кнопку share)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Через полгода как я завел девелоперский аккаунт, apple почему-то поинтересовался моим паспортом и заблокировал 👨‍💻 AppStore Connect.

Через полдня после того, как я отправил всё, что им было нужно, доступ восстановили 😊
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Всем привет 👋 Давно не было от меня новостей

Так вот, несу прикольный апдейт.
Я начал параллельно смотреть на геймдев, и познакомился с Godot 👩‍💻

Так уж вышло, что для меня классикой является змейка, поэтому вот моя версия:
Please open Telegram to view this post
VIEW IN TELEGRAM
Оказалось достаточно просто экспортировать godot проект под iOS.

Причем логирование из godot сохранятся, и в iOS проекте при дебаге видно всё, что нужно
Так уж получается, что я прыгаю от одного проекта к другому. Мне не хочется сделать проект и забросить его. К тому же, пользователи, знакомые и я пользуемся и хотим видеть какие-то улучшения в приложениях.

Это время я занимался улучшением стратегии подбора слов в DerDieDas 🇩🇪

Вот самое интересное:

🔸 Создал отдельный Package в котором храню бизнес логику, и линкую его в основной проект.

Воспользовался подходом, который подсмотрел в упоминаемом ранее проекте: https://github.com/Dimillian/IcySky/tree/main

Самые классные плюшки тут:
- это можно легко тестировать (алгоритм получился не очень простой)
- мокаю всё, что захочу
- дизайн классов построенный на абстракциях
- разбиение проекта на модули, single responsibility наше всё (несмотря на то, что проект небольшой, поддерживать его становится сложнее со временем)

🔸 Алгоритм подбора слов основанный на комбинации стратегий:

- due words (слова, которые пора повторить) способом 4х колод
- примерный уровень пользователя (давать слова из этого же уровня и выше)
- калибровка, если уровень ещё не известен

То, что меня тут больше всего цепляет, это https://en.wikipedia.org/wiki/Sigmoid_function
Я использую её, чтобы откорректировать вес среднего по каждому уровню.

Например, пользователь ответил правильно на 5 из 5 на уровне A2 - вроде в среднем 100%, но 5 вопросов это мало, поэтому с помощью Сигмоида это всего лишь 24%. Как? Сделаю небольшой отдельный пост (там всё просто).

🔸 Отказ от CoreData?

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

Более конкретный пример: сложно реализовать локальные кэши, в которых я хочу сделать оптимизации. Например, мне нужно хранить среднее. При реактивном подходе, среднее нужно пересчитывать. Иначе - все изменения под контролем, я могу использовать переменные для хранения различных счетчиков, и использовать их оптимальнее.

Может это излишняя оптимизация, но мне так легче. А это главное!

Не спешу с этим, но похоже придется убрать CoreData. Посмотрим ещё 😮
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21👌1
Похоже, получилось громоздко 🤔 Какой размер постов вам удобнее (спасибо, что читаете)?
Final Results
0%
Короткие
67%
Средние
17%
Большие
67%
И так сойдёт!
Всем привет! 👋 Пора бы заполнить тишину 😂

Сейчас я активно работаю над приложением 🇩🇪
Переделываю дизай - да, задумку про минимализм не получается реализовать на 💯 Хочется чего-то большего, и тут не получится без “Настроек” и прочих мелочей.

Обновляю не только визуал, хотя это большая часть. Но так же разобрался с локальными нотификациями - приложение само планирует когда и что показать. Либо само приложение, но чаще пользователь, настраивает расписание.
Есть ещё и серверные push-нотификации, когда с сервера присылаются уведомления. Это сложнее, и в моём случае пока не нужно было.

Помимо этого, поскольку я планирую использовать Firebase 🔥 и для других приложений, то этот проект выступает в роли подопытного кролика, на котором я реализую:

🔸 anonymous login - вполне говорящее название. Даже без регистрации (и смс) можно будет различать пользователей.

🔸 App Check - Firebase может проверять, что запросы приходят именного из твоего приложения. Работает через интеграцию с сервисами Apple. Когда сделаю - потестирую и отпишу о результатах #todo
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥1
Saga. Но не паттерн, а история как я пытался перехитрить Firebase/GCP.

В предыдущем посте я рассказывал о планах подключить anonymous login и App Check в 🇩🇪

С этими задачами я разобрался относительно быстро. Больше времени ушло на изучение документации. А у гугла, так уж получается, документация настолько хороша, что после её прочтения всё заводится с полпинка.

❗️ Anonymous Login
В кратце, в приложении всё что нужно сделать - это:

Auth.auth().signInAnonymously { authResult, error in


При успешном выполнении, получаем uid пользователя и используем его как хотим.
В моём случае я использую его репортинга ошибок. Так я могу видеть какие баги были зарепорчены одним и тем же пользователем. Как минимум это может быть полезно, если кто-то захочет просто так порепортить всё подряд.

❗️ App Check
Эта фича позволяет проверить, что запросы прилетают из приложения. Firebase интегрируется с Apple и проверяет входящие запросы на валидность.
Настройка так же не занимает много времени. Нужно на стороне Apple выпустить private key, зарегистрировать в Firebase, и настроить приложение выполнив

private func configureFirebaseAppCheck() {
#if DEBUG
// для симуляторов
let providerFactory = AppCheckDebugProviderFactory()
AppCheck.setAppCheckProviderFactory(providerFactory)
#else
// для прода
// хотя, возможно, эта часть не обязательна - в документации об этом ни слова :’(
let providerFactory = DeviceCheckProviderFactory()
AppCheck.setAppCheckProviderFactory(providerFactory)
#endif
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🧨 А вот тут самое интересное

Поскольку это ужасно неудобно - проверять firebase console на наличие новых документов в Firestore Database (именно тут я и храню репорты о багах), в добавок у Firebase нет мобильного приложения. Я решил изобрести велосипед нотификатор на базе Telegram Bot.

Радостный я - узнал, что можно использовать Firebase Functions. Идея известная, похожие на триггеры в субд - функции (на nodejs 💪) вызываются всякий раз, когда добавляется (обновляется, и другие события тоже) документ в базе.

Довольный я - написал функцию, но при попытке деплоя обнаружил, что нужно перейти на платный Pricing Plan - Blaze… (Spark дефолтный и полностью бесплатный). В целом платишь, если только используешь выше квоты.

С этим я мириться не смог, стал изучать как можно обойти это ограничение. И тут обнаружил, что Google Cloud отлично интегрируется с Firebase, ведь Firebase работает поверх Google Could. Небольшой сложностью было то, что сообщения в функции (Cloud Run) приходят в формате Proto (protobuf). Ну ничего, нашел на гитхабе пример (от гугла) и воспроизвел его. Поковырялся около 4 часов с этим безобразием, я всё же смог задеплоиться. И знаете что? 🤣 Они меня автоматом перевели на Blaze в Firebase. Обнаружил я это только на следующий день, увидев письмо с “поздравлениями”.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
На этом хитрость века закончилась…

Разочарованный я - решил всё же использовать Firebase Functions, поскольку помимо упрощения, когда приходит сразу json, а не proto, Firebase предоставляет локальные симуляторы. Очень просто и красиво поднимается web server, с помощью которого, можно создавать документы (прям как в `Firestore Database`) и тестировать свои супер функции.

В Cloud Run такого функционала я не нашел, поэтому приходилось на каждое изменение деплоить их в клауд. Мало того, что это долго, так ещё и тестирование усложняется в разы.

Но всё же по итогу у меня получился “бесплатный” функционал нотификаций из Firestore Database в Telegram ✈️ через бота.
Через Bot Father создал бота и в Firebase Functions посылаю себе в личку нотификации каждый раз как появляется новый документ.

Сообщение представляет собой markdown форматированный текст с метаданными и некоторыми полезными полями в форме json.
Однако редактировать приходится руками. Если придется заниматься этим часто - буду автоматизировать 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🆒1
Спасибо, что остаётесь со мной, читаете, комментируете и поддерживаете 🙏
6
Я наконец-то вернулся из отпуска - но времени я не терял, поэтому есть много чего рассказать. Stay tuned 🏖
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👀1
Даже хейтерам ChatGPT это будет интересно.

🌴 Лежу я значит на пляже - солнце, шум моря, загар ложится ровно, телефон в руке. Но мозг, как обычно, не умеет отдыхать. В голове вертится: "А что если добавить в приложение простенькую фичу? Можно то, и можно это… а ещё и так, да эдак”

И тут я вспоминаю про Copilot в GitHub. Проверил - он доступен с телефона. Думаю: “Дай-ка напишу ему, пусть скажет насколько это вписывается в текущий проект”. А он в ответ предлагает создать Pull Request.

o_O ничоси

Попросил его сделать easy mode для 🇩🇪. Он создает Pull Request, запускается Xcode Cloud CI, сборка проходит успешно, а Copilot ставит меня ревьюером. После нескольких замечаний, он исправляет, то что мне не нравится, объясняет что не понятно. Мой клик на Мерж, сборка Xcode Cloud, отправка в Test Flight, и я не взяв в руки ноутбук и не написав ни единой строчки кода устанавливаю приложение… Итс факинг крейзи 😆
Самое классное, что я понимаю по итогу, что я получаю в проекте, и контролирую, что туда попадает. Ревью как ни как.

До этого я использовал Github Copilot в режиме Agent. Он помогает со всеми делами (жаль не по дому) в VS Code 👩‍💻
У него есть контекст проекта - умеет читать README (для него можно даже писать специальные инструкции в `.github/copilot-instructions.md`), может создать тесты, запустить что-нибудь в терминале, поревьюить, или написать логику.

Это вызывало огромный дискомфорт, поскольку это занятие не высвобождает свободное время - приходится постоянно переписываться и смотреть, что он делает. И главное, я в это время не могу заниматься ничем другим. Мне хотелось, чтобы это было больше похоже на поручение задачи своему коллеге.

Создатели GitHub Copilot coding agent поняли это достаточно быстро. По пути в магазин, на работу, на вечеринку или просто на прогулке, меня посещает мысль - я закидываю её в агента и в свободную минуту могу посмотреть результат, даже с телефона.

Вот это реально экономит время и позволяет больше эксперементировать! 😺
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Ссылка на Github Copilot coding agent

https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent

Накидайте лайков, если эта тема интересна. Могу про схожее ещё написать 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Продолжаю осваивать Firebase 👩‍💻

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

🟥 Документация - на уровне!
Достаточно пройтись по инструкции: https://firebase.google.com/docs/crashlytics/get-started?platform=ios

Отдельно понравилась настройка Xcode для загрузки Apple Debug Symbols (dSYM), не сам процесс, а идея. После этого отчёты об ошибках становятся человекочитаемыми: вместо адресов памяти видно имена методов.

Главной мотивацией подключения Crashlytics был баг, который я обнаружил после релиза. Снова ною про тесты, они очень нужны, но писать их сложно - мешает интеграция с Firebase.
Как делать UI тесты и “мокать” Firebase - до сих пор загадка для меня 🤔💭
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Зарегал домен 🌐

У меня появился мой первый домен, и этого первенца зовут grocemelier.app

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

✍️ Регистрация не заняла много времени, напротив, это было одно из самых простых. Плати и получай 🤑

Но даже при регистрации домена мне удалось узнать что-то новое. В интерфейсе настройки обнаружил типы записей в DNS. Если я знал, что такое A, NS, то MX и CNAME стали для меня открытием. Разрабатывая backend очень редко приходится сталкиваться с этими вещами, а времени, свободного времени, всегда мало. Даже сказал бы - его нет!

✍️ Создание landing страницы порядком меня помучало (я потратил на это 5 часов)

Поскольку я уже повязан Firebase, то и тут я решил воспользоваться их продуктом Firebase Studio.

Firebase Studio по своей сути является генератором сайтов, приложений, ai решений. И да, это снова AI - Gemini.
Интерфейс представляет собой VS Code 👩‍💻 запущенный на виртуалке (поэтому доступ к терминалу имеется). Туда накинуты расширения, которые показывают Preview сайта, интегрируются с Gemini Agent, и отсюда же можно задеплоить приложение на Google Cloud инфраструктуру посредством Firebase Hosting.

Я создал несколько версий, но на текущий момент оставил только одну - самую простую. Сейчас я смогу собирать emails потенциальных пользователей для участия в Beta тестировании (для этого буду использовать TestFlight). Возможно стоит разместить сразу TestFlight кнопку, но так целостность страницы нарушается, я оставил это немного на попозже - пока буду инвайтить руками.

✍️ По пути применяю полученный опыт

В качестве базы использую Firebase Firestore. Есть функции для отправки нотификаций в телеграм. Firebase Studio умеет работать только с nextjs фреймворком (просил написать на Vue.js - отказался, сказав, что не такой умный), но другие языки/платформы так же поддерживаются.

В общем я получаю очень много интересного опыта и позитивных эмоций занимаясь этим проектом 🥰
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Добавил кнопу логина через Google 🖥

Над этой темой пришлось попотеть.

🔴 Во первых, почему-то Google Sign-In не включен в Firebase SDK

В Firebase Console можно включить различные механизмы Authentication. Но по какой-то непонятной мне причине, https://github.com/google/GoogleSignIn-iOS нужно подключать отдельно.

🔴 Во вторых, документация расходится с практикой

Хорошо описано как добавить Firebase Auth. Есть примеры, и много сторонних статей. Но есть такой пример:

https://firebase.google.com/docs/auth/ios/google-signin


guard let clientID = FirebaseApp.app()?.options.clientID else {
fatalError("Firebase clientID not found. Ensure GoogleService-Info.plist is properly configured and added to the project.")
}
let config = GIDConfiguration(clientID: clientID)
GIDSignIn.sharedInstance.configuration = config


Который у меня не сработал.
Нашел, что я не единственный столкнулся с этой проблемой: https://github.com/firebase/firebase-ios-sdk/issues/15151

Помимо того, что в файле GoogleService-Info.plist CLIENT_ID, это же значение нужно прописать в Info.plist в поле GIDClientID

В документации https://firebase.google.com/docs/auth/ios/google-signin про это ни слова…

🔴 Ну и в третьих, это линковка аккаунтов (тут телеграм сходит с ума и рисует красный кружок 😁)

Если залогинился под одним провайдером, потом под другим, их можно слинковать как одни и те же. Но похоже только 2… Для большинства проектов это совсем не проблема. Но штука не очевидная 🥵 (а тут супер-эмодзи совсем перестали работать)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Ну что друзья, время порадоваться!

Наконец приложение выпущено, конечно, сырое, но уже получившее пару апдейтов:

https://apps.apple.com/de/app/grocemelier/id6745146245

Основная цель, по которой я заводил этот канал, в какой-то степени достигнута, и даже года не прошло 😅

Но это не конец пути, а скорее начало. В частности, это и начало обратного пути, к Kotlin.

За это время я узнал очень много, плюсом оно совпало с бумом AI, и от этого стало только увлекательнее.

Раздумываю сейчас над созданием версии для 👩‍💻 и заодно реализацией некоторых важных фич (трудоемких, но все же нужных), от которых приложение должно стать на 999,99% удобнее и полезнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1