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

1. Уровень изученности слова
2. Просмотр подробной информации по слову

Всё делается по фидбэку пользователей ❤️❤️❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Как мне рекомендовали в комментариях, я затрагиваю Firebase 🔥 (да, логотип у них уже сменился).

Решил посмотреть как работает инициализация в Objective-C проектах… Осмелюсь сказать, что я знаю базовый C, но что это??? 😮

После прочтения этого, я слышу зов Ктулху🙉
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
Что за прикол от Google? Они документируют iOS лучше, чем свой Android? 🤨

Или на Android настолько суровые ребята, что A/B тесты им не нужны?
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
За прошедшие 2 вечера мне удалось реализовать:

🔸 Загрузку данных в Firestore Database
🔸 Скачивание обновленных записей в app

Как результат, не нужно ждать ревью (порой это занимает 2-3 дня), а просто обновлять контент приложения.

Дальше посмотрим на эти 2 майлстоуна чуть ближе. Совсем чуть-чуть 🙈
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Загрузка данных в Firestore Database

Firebase предоставляет крутое SDK, как минимум для простых вещей оно подходит безупречно! На мой взгляд, таким и должно быть SDK - работает при минимальной конфигурации.

Python скрипт для загрузки документов. Схема создаётся на основе json объекта, который хранится в переменной word.

creds.json - скачивается с Firebase Console.


# Некоторые части я специально исключил для краткости.
from google.cloud import firestore

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = “path/creds.json”

db = firestore.Client()

with open(json_file_path, "r", encoding="utf-8") as f:
words = json.load(f)

for word in words:
# небольшая настройка word, чтобы привести некоторые поля к определенным типам
db.collection("words").document(doc_id).set(word)


Обожаю Python 👩‍💻 за его простоту и лаконичность 🟥
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Скачивание обновленных записей в app

SDK для iOS так же порадовало!

Для начала добавил в зависимости Firebase SDK, затем скачал файл с кредами GoogleService-Info.plist, и в основном классе App добавил делегат, вызывающий
FirebaseApp.configure(). Всё! Настроено…

Дальше создал сервис, инкапсулирующий работу с Firestore:

class FirebaseWordSyncService {
private let db = Firestore.firestore()

func fetchUpdatedWords(since lastUpdated: Date, completion: @escaping ([Word]) -> Void) {
print("Fetching words updated since \(lastUpdated)")
db.collection(collection)
.whereField("lastUpdated", isGreaterThan: lastUpdated)
.getDocuments { snapshot, error in
// handle docs
}
}
}


Как я работаю с этим классом?

1️⃣ Переодически вызываю fetchUpdatedWords из приложения
2️⃣ Проверяю настало ли время идти в Firestore
3️⃣ Если да, то нахожу максимальное значение lastUpdated в базе Core Data
4️⃣ Последним шагом иду в Firestore за обновленными записями

Это позволяет уменьшить нагрузку на базу (там есть лимиты).
Пока не посмотрел детально, но вроде можно не делать polling, а подписываться на обновления в Firestore. Возможно мне это и не нужно.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Тема с Firebase была предложена какое-то время назад одним из читателей. Если тебе хочется повлиять на контент этого канала - это возможно, я открыт к идеям 😇
Please open Telegram to view this post
VIEW IN TELEGRAM
Натолкнулся на байтклик статью на Medium

SwiftUI in 2025: Forget MVVM: https://dimillian.medium.com/swiftui-in-2025-forget-mvvm-262ff2bbd2ed

В ней рассказывается материал на основе доклада с wwdc 2019 😄

Сам доклад супер! 🔥
https://developer.apple.com/videos/play/wwdc2019/226

Рассказывают про основную концепцию SwiftUI: View это функция от данных. Думаю, попробую в дальнейшем этот подход. Но переписывать готовое не буду 😵‍💫

И еще упомянутые в статье (но их еще не посмотрел):

https://developer.apple.com/videos/play/wwdc2023/10149/

https://developer.apple.com/videos/play/wwdc2020/10040/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Сегодня у меня знатно пригорело 🧨

Сижу я радостный, жду ревью версии с интеграцией с Firebase. Проверил на различных симуляторах, на физическом устройстве. Приходит реджект… 🙅‍♂️

Иду разбираться в чем дело. Они сообщили, что не работает на iPad Air (5th generation) - закрашилось при запуске. Приложили логи и инструкции как анализировать проблему. Запускаю симулятор локально… работает.

Начинаю смотреть логи 👀 которые они прислали. Там при старте приложения что-то сломалось, но что не понятно! Указывает в трейсе имя моего приложения, а вместо названий методов просто адреса с какими-то сдвигами.


13 DerDieDas DE 0x102859e7c 0x102830000 + 171644
14 DerDieDas DE 0x102858a70 0x102830000 + 166512
15 SwiftUI 0x19d23eec0 static App.main() + 164


Порылся в интернете, ссылках что ревьюеры дали, у гпт поспрашивал, говорят нужен dSYM - в нем хранится информация для дебага, как раз сопоставление между адресами и названиями методов. Положил в рабочую директорию Xcode, результата нет. Добавил архив билда, скачав его из Xcode Cloud предварительно. То же самое… 🤬

Загружаю в TestFlight пересобранную версию и буду смотреть в чем причина. Очень жаль, что воспроизвести не удалось. Ту зафейленную версию не смог через Internal Testing TestFlight проверить, т.к. интеграция сломалась и мне просто не дали потестировать тот билд.

Пока заметил через git status, что Xcode менял активную Core Data модель на предыдущую версию (с чего бы вообще 😮). Может каких-то полей при старте не было видно из-за этого…
На всякий случай, заменил имена моделей на что-то содержащее v1, v2, v3, …
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬1
Мне, пожалуйста, 2 такие бригады
Заметил следующую штуку

Краш репорты представлены файлами с расширением ips. Если открыть их в VS Code, то они выглядят как json. Но если открыть их с помощью Console (на скриншоте) или Xcode, то открывается отформатированный трейс по потокам, с заголовком (как на 2ой картинке).

Адреса там не найти, т.к. они представлены чуть в другом формате. Но суть в том, что json преобразуется в форматированный и более понятный человеку (пока не мне 🙈) вид.

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

Ужасное ощущение осталось, но я постараюсь на нем не зацикливаться. Ведь упало не у любимых пользователей 🟥🟥
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
tg_image_765229706.png
69.1 KB
С помощью утилиты atos получилось хоть что-то понять без кофейной гущи ☕️
Please open Telegram to view this post
VIEW IN TELEGRAM
Я всё же не смогу уснуть не докопавшись до причины падения 🤣

Похоже, 146%, что приложение пыталось обратиться к новому полю в Core Data модели lastUpdated. Как раз его я и добавил, чтобы отслеживать обновления в данных при синке с Firebase.

Ну видимо, действительно, модель на Xcode Cloud переставилась на предыдущую версию, прям как у меня локально! Она переставилась именно там, в облаке, т.к. я делаю коммиты очень аккуратно, и даже под действием паранойи, я проверил по истории коммитов: там стоит новая версия в файле .xccurrentversion!!!!

Извините, конечно, но это какое-то магическое 💩 и у меня просто нет слов 🪲🐛🪲

Без тестов по итогу никуда? Как с таким жить?
Please open Telegram to view this post
VIEW IN TELEGRAM
Начинаю реализацию приложения “Любимые товары” ⚫️

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

⌨️ Для начала нужно познакомиться как работать с камерой и библиотекой фото, т.к. это одна из самых важных функциональностей - создание или загрузка изображений.

Попробую немного другой формат изучения: https://developer.apple.com/tutorials/sample-apps/capturingphotos-camerapreview

Это официальные туториалы на основе проектов в Swift Playground. Некоторые части реализации можно будет взять прям оттуда 📱
Please open Telegram to view this post
VIEW IN TELEGRAM
Изучаю код Capturing Photos

Я думал, что @Binding как раз позволяет не пересоздавать View каждый раз, а только пересчитывать body
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2🤔1
😯 Не очень удачная идея делать такой перенос одного слова. Я пару секунд искал метод Photo(), оказалось метод takePhoto()

Это из оф. туториала https://developer.apple.com/tutorials/sample-apps/capturingphotos-captureandsave

Но в остальном туториал мне нравится 👍
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Все эти “магические” числа, указанные в width, height, и других местах, вызывают у меня вопросы “почему именно столько…”
Но я понемногу привыкаю
👍1
Красиииииво 🫠
2
Попробовал пересобрать приложение на Xcode 26, бесплатный обновленный дизайн 😁
Чтобы минимизировать ошибку связанную с рандомным переключением версии модели, добавил Smoke Test. Тест очень простой - запустить приложение.
Когда погружусь в тестирование, смогу что-то уже “хорошее” писать. Но пользу смоук теста сложно переоценить 😊
Please open Telegram to view this post
VIEW IN TELEGRAM