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

Удалось сформировать список слов с примерами, но их корректность нужно проверять ⚠️

Для этого написал авторам одного прекрасного сайта, где есть правильная информация по словам, артиклям и т.д. Хочу либо API получить, либо разрешение закроулить эти слова и распарить их html.

Вот пока жду ответа, пробую разные штуки.
Please open Telegram to view this post
VIEW IN 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