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

Когда я впервые услышал про smoke tests, почему-то сразу подумал про проверку печки - типа, протопил и смотришь, не идёт ли дым не оттуда 😄

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

Итак, где применяется это понятние:
🔹 Электроника - когда собирали новое устройство, его включали в первый раз и просто смотрели: не задымится ли? Если всё ок - можно тестировать дальше.
🔹 Сантехника (plumbing industry) - проверяли герметичность труб, закачивая внутрь дым. Если дым выходит - есть утечка.
🔹 Печи, камины и дымоходы - ну тут всё логично: пошёл дым не туда - значит, проблема.

https://en.wikipedia.org/wiki/Smoke_testing

Всё это объединяет один простой принцип: первая, базовая проверка, чтобы убедиться, что система хотя бы “не горит”.

В программировании smoke test - это:
🟢 Проверка, запускается ли приложение
🟢 Работают ли основные функции (например, логин)
🟢 Отвечает ли сервер
🟢 Загружается ли интерфейс

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

Зачем нужны smoke-тесты?
🟢 Быстро понять, «жив» ли билд после сборки или деплоя
🟢 Не тратить время на детальное тестирование, если всё и так сломано
🟢 Держать команду в здравом уме и не ловить баги в том, что даже не стартует
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Страдания продолжаются

Совсем недавно я обнаружил огромный и неожиданный всплеск на графике использования 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. Релизи довольно таки редкие, поэтому не проблема.

Всё же через трудности я учусь и познаю новое. Это несомненно радует 😊
👍1
Когда я узнал, что iPhone позволяет делать отмену введенного текста, а это было пару лет назад, просто обычным встряхиванием телефона, то сразу взял на заметку, что это можно использовать каким-нибудь прикольным образом.

Теперь я могу собирать фидбэк от пользователей таким образом. Нужно просто потрясти телефон, и приложение предложит зарепортить «неправильное слово».

На гугл картах тоже есть такая фишка 🔵
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Всем привет 👋

Спешу с отличными новостями! Я наконец начал реализацию приложения, с задумки которого всё началось.

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

🔸 Таргетная iOS 🍏 - хочу использовать относительно свежие инструменты.

🔸 В качестве хранилища - 👩‍💻 json документ. Причем картинки хранятся отдельно, а в json указаны их пути.

🔸 Таб с камерой 📸 находится в прогрессе, пока можно брать фото из библиотеки

🔸 Отдельная гордость - категории, они динамические, пользователь может создавать их самостоятельно

С обновлённым дизайном iOS 26 таб-навигация выглядит обалденно 😍
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Нужно ли разместить в TestFlight ✈️ или ждем полноценного релиза?
Anonymous Poll
25%
TestFlight
63%
Релиз
13%
Займись уже делом 😄
Самое большое наблюдение этого дня 😮

Есть массив изображений. При нажатии на одно из них хочется показать его на весь экран. Первое, что пришло на ум - использовать fullScreenCover(isPresented:)

Запоминаем, на каком индексе пользователь нажал на картинку, и выставляем флажок:


@State private var selectedImageIndex: Int? = nil
@State private var showFullScreenImage = false

ForEach(Array(images.enumerated()), id: \.offset) { idx, image in
Image(uiImage: image)
.onTapGesture {
selectedImageIndex = idx
showFullScreenImage = true
}


Перкрасно, но это не работает, т.к. selectedImageIndex передаётся дальше как nil.

Другой (и рабочий) вариант - запаковать selectedImageIndex в свою структуру и использовать fullScreenCover(item:)
Please open Telegram to view this post
VIEW IN 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 проекте при дебаге видно всё, что нужно