Kotlin/Swift (iOS) Туда и Обратно
36 subscribers
127 photos
21 videos
9 files
84 links
Канал - журнал, рассказывающий об опыте изучения Swift & iOS backend-разработчиком на Java & Kotlin
Download Telegram
Привет друзья! 👋

Все это время я не терял ни одного момента и занимался приложением.
В основном концентрировался на 2х вещах:

🟥 Карта (MapKit)

С картами всё оказалось не так уж просто 🗺
Для выбора места где был приобретен товар, решил использовать PointsOfInterest (POI). Эта фича работает прекрасно, в больших городах многие места отмечены на карте, и это облегчает выбор магазинов/кафе/ресторанов.
Однако тут есть проблема, которую, похоже, можно решить только лишь используя UIKit (настало его время 😄). Суть - при выборе POI можно использовать механизм отслеживания изменений

Map(position: $mapPosition, selection: $selectedPlace)
.onChange(of: selectedPlace)


Но при добавлении своих аннотаций, например, уже сохраненная точка, эта функциональность ломается. POI можно выбрать, но в onChange выбранные точки не прилетают. Насколько понял, selectedPlace начинает распространяться на созданные мной аннотации. С помощью UIKit, вроде, можно разделить карту на отдельные слои, и тогда это не будет проблемой.

Поскольку эта часть оказалась слишком сложнее ожидаемого, решил отложить данную часть на потом. Зачем застревать на одном месте, верно? 🙂

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

Но вот показать точку, где пользователь находится на карте (тот самый синий кругляш) - беда. Опять же аннотации ломают трекинг POIs. Исползование .mapControls { MapUserLocationButton() } работает только при нажатии на кнопку. При последующем скролинге точка пропадает с карты.

Про overlay просто ничего, я его пробовал, но не помогло нисколько.

🟥 Share функциональность

Тут у меня всё ещё хуже, но это в отельном посте 😋

Продолжение следует…
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Большая просьба, если кто-то работал с картами, посоветуйте как с ними ладить. Возможно есть волшебная либа, которая сделает всю грязную работу? Да, я тот ещё оптимист 🥺
Документации совсем мало, в основном это видео с wwdc. Чтобы посмотреть их все нужно кучу времени потратить. Предварительно понять что нужно смотреть, а что можно пропустить не очень получается.
Please open Telegram to view this post
VIEW IN 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
👍1
Ссылка на 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
2