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

https://apps.apple.com/de/app/derdiedas-de/id6745122637

Маленький, но огромный шаг 😎

Буду планировать шаги по реализации своего основного приложения
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍1
Как я делал скриншоты

Одним из обязательных требований Apple является наличие скриншотов, соответствующих диагонали 6.9 дюйма.
Для этого я использовал симулятор iPhone 16 Pro Max и сделал снимки двух основных экранов приложения.

Где-то пишут, что требуется скриншот для iPad, но ревью пройденно без них.

После этого загрузил изображения на theapplaunchpad.com, чтобы добавить фон и надписи.

Существуют и другие подобные сервисы, но большинство из них платные. Этими изображениями удалось воспользоваться бесплатно.
👍1
Всем привет! 👋 Хочу поделиться забавной историей.

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

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

Так вот пообщавшись с моим другом с утреца 📱 получил от него идею воспользоваться spaCy - Python библиотека для NLP (Обработка естественного языка). Инструмент действительно хороший, но не без ошибок.

А вечером я пошёл на мини-конференцию по Python 👩‍💻
Расписание я подробно посмотрел буквально перед входом - и был приятно удивлён, т.к. первый же докладчик была CEO из компании, которая занимается разработкой spaCy.

Я просто не мог уйти без их стикер 🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1😁1
Сегодня смотрел как правильно вносить изменения в модели CoreData.

В текущей модели у меня предложения представлены массивом, который хранится в Core Data напрямую.
Переделал так, что каждое предложение представляет собой набор токенов (слово или знак препинания) и индексы токенов, которые нужно будет подсветить.

Наивным путём удалил одно поле и добавил другое 😮
В симуляторе и на телефоне отработало идеально. Но вот с preview всё сломалось. Ни перезагрузка, ни очистка рабочих директорий - ничего не помогало.

🚫 Ошибка была вида: Persistent store migration failed, missing mapping model

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

Сейчас всё снова работает как часы!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Мой микро апдейт висит уже 3 дня, и его еще не начинали ревьюить.

По кому они статистику собирают? 🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
Вау 😯 Рассказывает дочка Пола из hackingwithswift про неочевидные вещи в swift (не сложные, но забавные), ей всего 15, а уже на сцене. Невероятный буст мотивации!

https://www.youtube.com/watch?v=dQJUoNIbDsg

Как быстро растут чужие дети 🥲
Please open Telegram to view this post
VIEW IN TELEGRAM
Когда опыт не спасает от неуверенности

Будучи синьёром 🍅 backend разработчиком, я привык понимать, почему код устроен так или иначе. Привык сразу закладывать масштабируемость, отказоустойчивость, где нужно, думать о поддержке и развитии проекта.

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

Несмотря на то, что ловлю себя на мысли, что так и должно быть, это неприятное ощущение сопровождает меня. Конечно, это нормально, будучи в начале пути совершать ошибки. Да даже и где-то посреди, это тоже неизбежно. Осознаю, понимаю, но бороться с этим не так уж просто.

Ну хватит ныть! Главное - продолжаем, с выводами по пути (и неприятными тоже), но движемся вперед!

Возможно среди вас есть те, кто прошел через это, и, естественно, те, кто только будет проходить. Не забываем, что это временно 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Немного о прогрессе и успехах

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

У меня двоякое ощущение, т.к. одно из названных достоинств было - простота, а новые фичи такие, что сильно усложнят интерфейс. Как быть дальше 🤔



Пока в голове я ношу и перевариваю идею как будет выглядеть приложение - трекер товаров. То как я хочу его видеть, понимаю, что технически будет очень сложно реализовать. Моего опыта явно не хватит. А из предыдущего поста, как вы могли заметить, я хочу сделать всё относительно правильно 😁
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Мультиэкран без навигации

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

Основная идея - иметь одно вью, которое меняет своё отображение в зависимости от текущего состояния.


struct WordsGameView: View {
@StateObject private var viewModel = WordsGameViewModel()

var body: some View {
ZStack {
switch viewModel.currentScreen {
case .welcome:
WelcomeView {
viewModel.startQuiz()
}
case .question(let question):
QuestionView(question: question) { answer in
viewModel.submit(answer: answer)
}
case .result(let result):
ResultView(result: result) {
viewModel.goToMainMenu()
}
case .mainMenu:
MainMenuView {
viewModel.startQuiz()
}
}
}
.animation(.none, value: viewModel.currentScreen)
}
}



😎 На счет перформанса не уверен, но для квиз подобных приложений удобно!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Вау, обновление Xcode сломало билд. Возможно, у меня что-то с настройками не так, но до обновления билд работал!
Пока не пойму как это пофиксить, но запуск на устройстве так же не работает.

Обновлялся с надеждой, что Preview Canvas пофиксили. До этого он сбрасывал свой размер до половины экрана, что жутко неудобно.
😢1
Вроде этой панельки в редакторе до обновления не было. Либо она была выключена, а теперь настройки просто сбросились
😢1
Дорабатываю дизайн отображения слов.

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