Скачивание обновленных записей в app
SDK для iOS так же порадовало!
Для начала добавил в зависимости Firebase SDK, затем скачал файл с кредами
Дальше создал сервис, инкапсулирующий работу с Firestore:
Как я работаю с этим классом?
1️⃣ Переодически вызываю
2️⃣ Проверяю настало ли время идти в Firestore
3️⃣ Если да, то нахожу максимальное значение
4️⃣ Последним шагом иду в Firestore за обновленными записями
Это позволяет уменьшить нагрузку на базу (там есть лимиты).
Пока не посмотрел детально, но вроде можно не делать polling, а подписываться на обновления в Firestore. Возможно мне это и не нужно.
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
}
}
}
Как я работаю с этим классом?
fetchUpdatedWords
из приложенияlastUpdated
в базе Core DataЭто позволяет уменьшить нагрузку на базу (там есть лимиты).
Пока не посмотрел детально, но вроде можно не делать 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/
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) - закрашилось при запуске. Приложили логи и инструкции как анализировать проблему. Запускаю симулятор локально… работает.
Начинаю смотреть логи👀 которые они прислали. Там при старте приложения что-то сломалось, но что не понятно! Указывает в трейсе имя моего приложения, а вместо названий методов просто адреса с какими-то сдвигами.
Порылся в интернете, ссылках что ревьюеры дали, у гпт поспрашивал, говорят нужен dSYM - в нем хранится информация для дебага, как раз сопоставление между адресами и названиями методов. Положил в рабочую директорию Xcode, результата нет. Добавил архив билда, скачав его из Xcode Cloud предварительно. То же самое…🤬
Загружаю в TestFlight пересобранную версию и буду смотреть в чем причина. Очень жаль, что воспроизвести не удалось. Ту зафейленную версию не смог через Internal Testing TestFlight проверить, т.к. интеграция сломалась и мне просто не дали потестировать тот билд.
Пока заметил через😮 ). Может каких-то полей при старте не было видно из-за этого…
На всякий случай, заменил имена моделей на что-то содержащее v1, v2, v3, …
Сижу я радостный, жду ревью версии с интеграцией с 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
Заметил следующую штуку
Краш репорты представлены файлами с расширением ips. Если открыть их в VS Code, то они выглядят как json. Но если открыть их с помощью Console (на скриншоте) или Xcode, то открывается отформатированный трейс по потокам, с заголовком (как на 2ой картинке).
Адреса там не найти, т.к. они представлены чуть в другом формате. Но суть в том, что json преобразуется в форматированный и более понятный человеку (пока не мне 🙈) вид.
Но в итоге я так и не понял, как заставить их сматчить адреса и дебаг информацию. Пробовал так же консольные инструменты, но не сработало.
Ужасное ощущение осталось, но я постараюсь на нем не зацикливаться. Ведь упало не у любимых пользователей🟥 🟥
Краш репорты представлены файлами с расширением 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!!!!
Извините, конечно, но это какое-то магическое💩 и у меня просто нет слов 🪲🐛🪲
Без тестов по итогу никуда? Как с таким жить?
Похоже, 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. Некоторые части реализации можно будет взять прям оттуда📱
Думаю, что это момент, когда можно приостановить разработку 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
Чтобы минимизировать ошибку связанную с рандомным переключением версии модели, добавил Smoke Test. Тест очень простой - запустить приложение.
Когда погружусь в тестирование, смогу что-то уже “хорошее” писать. Но пользу смоук теста сложно переоценить😊
Когда погружусь в тестирование, смогу что-то уже “хорошее” писать. Но пользу смоук теста сложно переоценить
Please open Telegram to view this post
VIEW IN TELEGRAM
💨 Что такое smoke tests и откуда они взялись?
Когда я впервые услышал про smoke tests, почему-то сразу подумал про проверку печки - типа, протопил и смотришь, не идёт ли дым не оттуда 😄
Я нашёл несколько версий происхождения этого определения. Но, похоже, печи и камины - самое вероятное, т.к. они существуют уже очень давно.
Итак, где применяется это понятние:
🔹 Электроника - когда собирали новое устройство, его включали в первый раз и просто смотрели: не задымится ли? Если всё ок - можно тестировать дальше.
🔹 Сантехника (plumbing industry) - проверяли герметичность труб, закачивая внутрь дым. Если дым выходит - есть утечка.
🔹 Печи, камины и дымоходы - ну тут всё логично: пошёл дым не туда - значит, проблема.
https://en.wikipedia.org/wiki/Smoke_testing
Всё это объединяет один простой принцип: первая, базовая проверка, чтобы убедиться, что система хотя бы “не горит”.
В программировании smoke test - это:
🟢 Проверка, запускается ли приложение
🟢 Работают ли основные функции (например, логин)
🟢 Отвечает ли сервер
🟢 Загружается ли интерфейс
Если всё это прошло - можно переходить к более серьёзному тестированию. Если нет - чинить основу, а не искать баги глубже.
Зачем нужны smoke-тесты?
🟢 Быстро понять, «жив» ли билд после сборки или деплоя
🟢 Не тратить время на детальное тестирование, если всё и так сломано
🟢 Держать команду в здравом уме и не ловить баги в том, что даже не стартует
Когда я впервые услышал про smoke tests, почему-то сразу подумал про проверку печки - типа, протопил и смотришь, не идёт ли дым не оттуда 😄
Я нашёл несколько версий происхождения этого определения. Но, похоже, печи и камины - самое вероятное, т.к. они существуют уже очень давно.
Итак, где применяется это понятние:
https://en.wikipedia.org/wiki/Smoke_testing
Всё это объединяет один простой принцип: первая, базовая проверка, чтобы убедиться, что система хотя бы “не горит”.
В программировании smoke test - это:
Если всё это прошло - можно переходить к более серьёзному тестированию. Если нет - чинить основу, а не искать баги глубже.
Зачем нужны smoke-тесты?
Please open Telegram to view this post
VIEW IN TELEGRAM
Wikipedia
Smoke testing
Wikimedia disambiguation page
👍1
Страдания продолжаются
Совсем недавно я обнаружил огромный и неожиданный всплеск на графике использования Firebase Firestore.
Дневная квота была израсходована😢
Поначалу я обвинил в этом мой скрипт для загрузки слов. Но просто попробовав запустить его несколько раз обнаружил, что он тут ни при чём.
Следующим подозреваемым стали тесты.
Добавил ещё логов в приложении в виде
Запускаю тесты, они отрабатывают. И тут начинаются страдания.
Простой вопрос - где логи? А кто бы знал… Я отказываюсь понимать почему их не видно в интерфейсе Xcode.
Я посмотрел и различные окна, и результаты тестов, и пробовал успеть приатачиться к дебагеру (пока тест запущен).
Почитал форумы https://developer.apple.com/forums/thread/93369, где рекомендую статьи как посмотреть логи приложения https://michele.io/test-logs-in-xcode/
По-моему это перебор 🤪
Совсем недавно я обнаружил огромный и неожиданный всплеск на графике использования Firebase Firestore.
Дневная квота была израсходована
Поначалу я обвинил в этом мой скрипт для загрузки слов. Но просто попробовав запустить его несколько раз обнаружил, что он тут ни при чём.
Следующим подозреваемым стали тесты.
Добавил ещё логов в приложении в виде
print
. Запускаю тесты, они отрабатывают. И тут начинаются страдания.
Простой вопрос - где логи? А кто бы знал… Я отказываюсь понимать почему их не видно в интерфейсе Xcode.
Я посмотрел и различные окна, и результаты тестов, и пробовал успеть приатачиться к дебагеру (пока тест запущен).
Почитал форумы https://developer.apple.com/forums/thread/93369, где рекомендую статьи как посмотреть логи приложения https://michele.io/test-logs-in-xcode/
По-моему это перебор 🤪
Please open Telegram to view this post
VIEW IN TELEGRAM
😢3
Вроде получилось получить доступ к логам с помощью
Там тот ещё лес дремучий, но где-то в глубине есть файл
Есть ли способ сделать это проще?🤔
xcrun xcresulttool export diagnostics --path ‘/Users/user/Library/Developer/Xcode/DerivedData/MyApp-abc/Logs/Test/Test-MyAppUITests-2025.06.21_07-56-42-+0200.xcresult' --output-path ./diagnostict
Там тот ещё лес дремучий, но где-то в глубине есть файл
…/StandardOutputAndStandardError-MyApp.txt
Есть ли способ сделать это проще?
Please open Telegram to view this post
VIEW IN TELEGRAM
В общем я решил убрать тесты, спайк на графике действительно был связан с ними.
Поскольку тестируется сразу несколько версий, включая различную локализацию, то создавалось много запусков приложения.
Ключевая проблема заключалась в том, что в тест бандл не был добавлен json с изначальными данными. И также я не отключил обращение к Firestore, поэтому на каждый запуск была попытка скачать все данные из Firestore.
Мокать Firestore, добавлять различные проверки на текущий контекс (тесты или нет) требую намного больше усилий (да и выглядит это супер криво), буду тестировать руками через TestFlight. Релизи довольно таки редкие, поэтому не проблема.
Всё же через трудности я учусь и познаю новое. Это несомненно радует 😊
Поскольку тестируется сразу несколько версий, включая различную локализацию, то создавалось много запусков приложения.
Ключевая проблема заключалась в том, что в тест бандл не был добавлен json с изначальными данными. И также я не отключил обращение к Firestore, поэтому на каждый запуск была попытка скачать все данные из Firestore.
Мокать Firestore, добавлять различные проверки на текущий контекс (тесты или нет) требую намного больше усилий (да и выглядит это супер криво), буду тестировать руками через TestFlight. Релизи довольно таки редкие, поэтому не проблема.
Всё же через трудности я учусь и познаю новое. Это несомненно радует 😊
👍1
Когда я узнал, что iPhone позволяет делать отмену введенного текста, а это было пару лет назад, просто обычным встряхиванием телефона, то сразу взял на заметку, что это можно использовать каким-нибудь прикольным образом.
Теперь я могу собирать фидбэк от пользователей таким образом. Нужно просто потрясти телефон, и приложение предложит зарепортить «неправильное слово».
На гугл картах тоже есть такая фишка🔵
Теперь я могу собирать фидбэк от пользователей таким образом. Нужно просто потрясти телефон, и приложение предложит зарепортить «неправильное слово».
На гугл картах тоже есть такая фишка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1