Локализация мобильного приложения на iOS: процесс, трудности и решения
Статья в прямом смысле о трудностях перевода: проблемы и их решение, про системный алгоритм выбора языка, пример перевода приложения «на лету» и многом другом в процессе локализации.
Статья в прямом смысле о трудностях перевода: проблемы и их решение, про системный алгоритм выбора языка, пример перевода приложения «на лету» и многом другом в процессе локализации.
Хабр
О, вы из Англии? Локализация Ozon Seller на iOS
Всем привет! Меня зовут Андрей, и я делаю iOS-приложение для продавцов Ozon Seller. Наша команда поставляет фичи, красит кнопки, работает над перформансом и всячески улучшает пользовательский...
👍10🔥2
Server-side Swift для AI задач
Вдруг вы решили, что вам срочно нужно приложение с фунцией классификации изображения или другой ML задачей и вы не хотите делать это на клиенте, а знаете только Swift, то для вас есть решение – Vapor + CoreML.
Не уверен, что можно масштабировать этот подход на большое количество пользователей, но сделать Proof of concept более чем можнои получить миллионы $ инвестиций
Вдруг вы решили, что вам срочно нужно приложение с фунцией классификации изображения или другой ML задачей и вы не хотите делать это на клиенте, а знаете только Swift, то для вас есть решение – Vapor + CoreML.
Не уверен, что можно масштабировать этот подход на большое количество пользователей, но сделать Proof of concept более чем можно
Create with Swift
Using server-side Swift for machine learning processing
In this tutorial learn how to use a machine learning model in a Vapor server using Swift.
👍13❤2🔥2
Шаблон Trigger в SwiftUI
В последней версии SwiftUI появился шаблон Trigger. С его помощью можно заставить UI реагировать каждый раз, когда значение свойства, которое мы установим как триггер изменилось.
Подойдет, например, чтобы заставить Scroll Indicator мигать, воспроизводить звук или выполнить анимацию при каком-либо действии. И все это можно делать как "шаблон", который можно переиспользовать на других UI элементах.
В последней версии SwiftUI появился шаблон Trigger. С его помощью можно заставить UI реагировать каждый раз, когда значение свойства, которое мы установим как триггер изменилось.
Подойдет, например, чтобы заставить Scroll Indicator мигать, воспроизводить звук или выполнить анимацию при каком-либо действии. И все это можно делать как "шаблон", который можно переиспользовать на других UI элементах.
Swift with Majid
Trigger value pattern in SwiftUI
The recent version of the SwiftUI framework introduces a trigger value pattern across its APIs. Trigger value allows us to attach a view modifier that runs its action whenever the trigger value changes. You can find this pattern while using sensory feedback…
👍11❤2
GraphQL в IOS разработке
Aльтернативный подход к разработке сетевого API, который позволяет более тонко настроить детали запросов, используя единственную конечную точку.
В отличие от традиционных RESTful API, GraphQL позволяет клиенту запросить только необходимые поля, минуя лишнюю информацию, что существенно уменьшает количество запросов в сеть и улучшает производительность приложения.
Aльтернативный подход к разработке сетевого API, который позволяет более тонко настроить детали запросов, используя единственную конечную точку.
В отличие от традиционных RESTful API, GraphQL позволяет клиенту запросить только необходимые поля, минуя лишнюю информацию, что существенно уменьшает количество запросов в сеть и улучшает производительность приложения.
Tanaschita
GraphQL essentials for iOS development
This article provides you with the essentials of GraphQL, especially those you need to know as an iOS developer.
⚡5👍3🔥3
Библиотека Apollo iOS для работы с GraphQL
В статье о том, как внедрить и использовать библиотеку Apollo iOS для создания приложений с поддержкой GraphQL.
Установка либы может показаться излишне сложной, но это тот случай, когда один раз разобрался и дальше просто применяешь на практике.
В статье о том, как внедрить и использовать библиотеку Apollo iOS для создания приложений с поддержкой GraphQL.
Установка либы может показаться излишне сложной, но это тот случай, когда один раз разобрался и дальше просто применяешь на практике.
Tanaschita
Getting started with Apollo iOS for GraphQL in Swift
Learn how to integrate GraphQL into a Swift application using Apollo iOS. Add Apollo dependency using the Swift Package Manager, install Codegen CLI, download schema and more.
💯6⚡2
Визуализация данных в SwiftUI с Swift Charts
Swift Charts - фреймворк от Apple, который позволяет преобразовывать данные в информативные и настраиваемые графики и диаграммы с очень небольшим количеством кода.
Включает в себя множество функций для создания различных типов графиков, таких как линейные, точечные или гистограммы.
Еще один плюсик в том, что теперь можно обойтись без использования сторонних зависимостей.
Swift Charts - фреймворк от Apple, который позволяет преобразовывать данные в информативные и настраиваемые графики и диаграммы с очень небольшим количеством кода.
Включает в себя множество функций для создания различных типов графиков, таких как линейные, точечные или гистограммы.
Еще один плюсик в том, что теперь можно обойтись без использования сторонних зависимостей.
AppTractor
Создаем гистограмму с помощью Swift Charts
На WWDC 22 Apple представила Swift Charts, фреймворк, позволяющий визуализировать данные в виде гистограмм. До его появления нам приходилось подключать всевозможные сторонние решения для построения графиков в SwiftUI. Визуализация данных с помощью аналогичного…
👍7✍2
This media is not supported in your browser
VIEW IN TELEGRAM
GPT-4o 🧠
Open AI выпустили новую языковую модель GPT-4o (o” значит “omni”), которая:
- мощнее других моделей
- доступна для бесплатных пользователей
-мультимодальна омниканальна: может генерировать контент или понимать команды в виде голоса, текста или изображений. Вот это просто настоящая магия ✨
- улавливает эмоции и может отвечать с разной интонацией😯
- доступна уже сейчас
Было очень много слухов, что Apple подружились с OpenAI и Siri ждет новое воплощение. К сожалению, об этом на презентации не было ни слова. Но я определенно с нетерпением буду ждать эту «One more thing» на WWDC. Такую Siri я бы очень хотел видеть.
P.S. Вы только посмотрите, как круто она отвечает голосом, как быстро и уместно она это делает. Очень советую полистать видосы про возможности у них в анонсе, для меня это взрыв мозга.
Open AI выпустили новую языковую модель GPT-4o (o” значит “omni”), которая:
- мощнее других моделей
- доступна для бесплатных пользователей
-
- улавливает эмоции и может отвечать с разной интонацией
- доступна уже сейчас
Было очень много слухов, что Apple подружились с OpenAI и Siri ждет новое воплощение. К сожалению, об этом на презентации не было ни слова. Но я определенно с нетерпением буду ждать эту «One more thing» на WWDC. Такую Siri я бы очень хотел видеть.
P.S. Вы только посмотрите, как круто она отвечает голосом, как быстро и уместно она это делает. Очень советую полистать видосы про возможности у них в анонсе, для меня это взрыв мозга.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤯4❤3💯1
Карантин UI тестов
Одна из проблем UI тестов – это их стабильность и больнее всего эта проблема ощущается, когда начинают падать UI тесты в компонентах, которые не были затронуты.
Ребята из hh.ru рассказывают как они решали эту проблему с помощью добавления таких тестов в «карантинный» тест план.
Одна из проблем UI тестов – это их стабильность и больнее всего эта проблема ощущается, когда начинают падать UI тесты в компонентах, которые не были затронуты.
Ребята из hh.ru рассказывают как они решали эту проблему с помощью добавления таких тестов в «карантинный» тест план.
Хабр
Карантин UI-тестов в iOS
Всем привет! Я Тимур — iOS разработчик в платформенной команде hh.ru . Сегодня я расскажу о нестабильных UI-тестах в iOS, и как мы с ними справляемся. Мы уделяем массу внимания UI-тестам, ведь именно...
🔥4❤1
Function Body Macros
Макросы продолжают развиваться: теперь их можно будет использовать для функций. Например, можно будет дополнить функции шаблонным кодом логирования:
Вместо привычного:
Попробовать можно уже сейчас, но для этого нужно скачать текущий снепшот и добавить:
Ждем в будущих версиях Swift'а!
Макросы продолжают развиваться: теперь их можно будет использовать для функций. Например, можно будет дополнить функции шаблонным кодом логирования:
@Logged
func g(a: Int, b: Int) -> Int {
return a + b
}
Вместо привычного:
func g(a: Int, b: Int) -> Int {
log("Entering g(a: \(a), b: \(b))")
defer {
log("Exiting g")
}
return a + b
}
Попробовать можно уже сейчас, но для этого нужно скачать текущий снепшот и добавить:
-enable-experimental-feature BodyMacros
Ждем в будущих версиях Swift'а!
🔥18👎3
Getting to Know TextKit
Многие из вас работают со стандартными дизайн компонентами, такими как UILabel и их почти всегда хватает. Но как только нам нужно сделать что-то более сложное, более производительное или что-то очень кастомное, то на помощь нам приходят более низкоуровневые фреймворки, например, TextKit.
В недавно прошедшей конференции try! Swift Tokyo Conference 2024 как раз был доклаз про TextKit 2, его внутренности и для каких задач его можно использовать.
Многие из вас работают со стандартными дизайн компонентами, такими как UILabel и их почти всегда хватает. Но как только нам нужно сделать что-то более сложное, более производительное или что-то очень кастомное, то на помощь нам приходят более низкоуровневые фреймворки, например, TextKit.
В недавно прошедшей конференции try! Swift Tokyo Conference 2024 как раз был доклаз про TextKit 2, его внутренности и для каких задач его можно использовать.
YouTube
try! Swift Tokyo 2024 - Getting to Know TextKit
After a year of developing an editor component with the TextKit 2 framework, I gained knowledge of best practices and techniques. I am thrilled to share my experience and insights.
Speaker: Marcin Krzyzanowski
try! Swift Tokyo Conference 2024 - try! Swift…
Speaker: Marcin Krzyzanowski
try! Swift Tokyo Conference 2024 - try! Swift…
👍3🔥3🤯1
This media is not supported in your browser
VIEW IN TELEGRAM
New accessibility features
Apple показали новые возможности в сфере «доступности», которые появятся в iOS 18. Что меня прям очень радует:
- отслеживание взгляда пользователя, которое поможет людям с ограниченными возможностями взаимодействовать с контентом
- Music Haptics – новый способ прослушивания музыки для глухих или слабослышащих пользователей
- «Прослушивание нетипичный речи» – улучшение распознавания голоса пользователей с приобретенными или прогрессирующими речевыми заболеваниями
- «Vehicle Motion Cues» – это вообще magic✨ для многих – обещают меньше укачивания при езде в машине и залипании в телефон
Очень круто, что многие эти вещи работаю «on-device» и благодаря вкладу Apple в AI: самое настоящее применение современных технологий для прикладных задач.
Apple показали новые возможности в сфере «доступности», которые появятся в iOS 18. Что меня прям очень радует:
- отслеживание взгляда пользователя, которое поможет людям с ограниченными возможностями взаимодействовать с контентом
- Music Haptics – новый способ прослушивания музыки для глухих или слабослышащих пользователей
- «Прослушивание нетипичный речи» – улучшение распознавания голоса пользователей с приобретенными или прогрессирующими речевыми заболеваниями
- «Vehicle Motion Cues» – это вообще magic
Очень круто, что многие эти вещи работаю «on-device» и благодаря вкладу Apple в AI: самое настоящее применение современных технологий для прикладных задач.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Подробно об акторах в Swift
Акторы в Swift 5.5 предназначены для безопасной обработки общего изменяемого состояния и предотвращения гонок данных при работе с многопоточностью.
В Swift акторами гарантируется изоляция данных: все изменяемые свойства и функции в акторе изолированы от прямого доступа извне.
В статье автор приводит примеры работы с акторами, подсвечивает основные моменты при работе с ними, а так же описывает процесс перехода на них.
Акторы в Swift 5.5 предназначены для безопасной обработки общего изменяемого состояния и предотвращения гонок данных при работе с многопоточностью.
В Swift акторами гарантируется изоляция данных: все изменяемые свойства и функции в акторе изолированы от прямого доступа извне.
В статье автор приводит примеры работы с акторами, подсвечивает основные моменты при работе с ними, а так же описывает процесс перехода на них.
Medium
Подробно об акторах в Swift
Не зубрить, но разбираться
👍7🔥3
if and switch expressions
Вдруг вы пропустили, что в Swift 5.9 заехали изменения в использование if и switch: теперь эти операторы можно использовать в качестве выражений. Это позволит писать более понятный код. Например:
можно заменить на:
Кстати, а в котлине это уже давно есть 🥲
Вдруг вы пропустили, что в Swift 5.9 заехали изменения в использование if и switch: теперь эти операторы можно использовать в качестве выражений. Это позволит писать более понятный код. Например:
let bullet: String
if isRoot && (count == 0 || !willExpand) { bullet = "" }
else if count == 0 { bullet = "- " }
else if maxDepth <= 0 { bullet = "▹ " }
else { bullet = "▿ " }
можно заменить на:
let bullet = if isRoot && (count == 0 || !willExpand) { "" }
else if count == 0 { "- " }
else if maxDepth <= 0 { "▹ " }
else { "▿ " }
Кстати, а в котлине это уже давно есть 🥲
GitHub
swift-evolution/proposals/0380-if-switch-expressions.md at main · swiftlang/swift-evolution
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swiftlang/swift-evolution
🔥11
Access-level modifiers on import declarations
На текущий момент мы можем добавлять модификаторы доступа только интерфейсам, однако для зависимостей такой функциональности не предусмотрено. При разработке библиотек это может быть проблемой, поскольку можно неявно предоставить доступ к деталям реализации, которые хотелось бы скрыть.
С приходом Swift 6 станет возможным добавлять к импортам зависимостей модификаторы уровня доступа, а именно:
public, package, internal, fileprivate и private.
По умолчанию, в Swift 5 все зависимости публичные, однако в Swift 6 станут с модификатором internal.
Чтобы потестить эти модификаторы на Swift 5.9 нужно добавить флаг:
А чтобы проверить, что будет если все импорты станут internal как в Swift 6, то нужно включить еще один флаг:
Это достаточно серьезные изменения, которые могут сломать обратную совместимость для библиотек. Поэтому советую заранее подготовиться 😉
На текущий момент мы можем добавлять модификаторы доступа только интерфейсам, однако для зависимостей такой функциональности не предусмотрено. При разработке библиотек это может быть проблемой, поскольку можно неявно предоставить доступ к деталям реализации, которые хотелось бы скрыть.
С приходом Swift 6 станет возможным добавлять к импортам зависимостей модификаторы уровня доступа, а именно:
public, package, internal, fileprivate и private.
public import PublicDependency
По умолчанию, в Swift 5 все зависимости публичные, однако в Swift 6 станут с модификатором internal.
Чтобы потестить эти модификаторы на Swift 5.9 нужно добавить флаг:
-enable-experimental-feature AccessLevelOnImport
А чтобы проверить, что будет если все импорты станут internal как в Swift 6, то нужно включить еще один флаг:
-enable-experimental-feature InternalImportsByDefault
Это достаточно серьезные изменения, которые могут сломать обратную совместимость для библиотек. Поэтому советую заранее подготовиться 😉
GitHub
swift-evolution/proposals/0409-access-level-on-imports.md at main · swiftlang/swift-evolution
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swiftlang/swift-evolution
👍6❤3🤔2
Вот и прошел основной день долгожданной презентации Apple для разработчиков. На удивление многие прогнозы и слухи сбылись, сама презентация получилась достаточно насыщенной, особенно про AI.
Что меня порадовало:
- отдельный менеджер паролей: давно пора, но искренне жаль сторонние сервисы, им точно станет не легко
- Game Porting Toolkit 2 и игровой режим – опять большой упор в игры, и кажется, Apple хочет повторить свой успех Apple Music и Apple TV, но тягаться с Гейбом будет не просто
- калькулятор на iPad – теперь хотя бы понятно, почему они так долго его не выпускали 😬
- watchOS 11 и Vitals – надеюсь, что это новый виток развития приложения «Здоровье» и задел на сентябрскую презентацию с измерениями большего числа показателей организма
- Apple Intelligence – тут и комментировать не нужно, это
- сотрудничество с OpenAI – это еще более крутая и понятная история, но если будет доступно только в Siri, нативных приложениях и там где есть UITextView, то уже не так радостно и круто
Что было очень не очень и даже обидным:
- visionOS 2 – что вообще поменялось, кроме как 8 стран добавили?
- iOS 18 / iPadOS / tvOS 18 – тут и комментировать нечего: кастомное расположение приложений и возможность их скрывать на рабочем столе, настраиваемый пункт управления и вырвиглазные иконки в темной теме. Просто amazing, который мы все заслужили 🥲
- Tap to Сash: «оплата через AirDrop» – очень крутая фича, но естественно, доступно лишь избранным странам и банкам. Никаких открытых API мы скорее всего не увидим
- Xcode Copilot – я даже засек: уделили ровно 14 секунд нашему главному инструменту. Спасибо, конечно, что рассказали про новый эмоджи генератор, но на главной презентации для разработчиков хотелось бы послушать чуть больше про Xcode.
На самом деле я думаю, что часть из пунктов выше раскроют на предстоящих сессиях и мы увидим еще много нового и интересного.
Stay tuned!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍6💯4👎2❤1🤬1
Swift Testing
Apple представила новый фреймворк для тестирования, который:
- поддерживает Swift Concurrency
- по дефолту запускает тесты параллельно
- заменяет XCTAssertTrue, XCTAssertEqual и другие на достаточно умный макрос #expect()
- позволяет запускать тесты с заранее определенным наборам данных
- более информативно сообщает в случае падения теста
- разработан как open source и он кроссплатформен
Вот пример, как теперь будут выглядеть тесты:
Попробовать можно сейчас с XCode 16 beta. Более подробно можно посмотреть в видео с WWDC.
Apple представила новый фреймворк для тестирования, который:
- поддерживает Swift Concurrency
- по дефолту запускает тесты параллельно
- заменяет XCTAssertTrue, XCTAssertEqual и другие на достаточно умный макрос #expect()
- позволяет запускать тесты с заранее определенным наборам данных
- более информативно сообщает в случае падения теста
- разработан как open source и он кроссплатформен
Вот пример, как теперь будут выглядеть тесты:
@Test("Check video metadata",
.tags(.metadata))
func videoMetadata() {
let video = Video(fileName: "By the Lake.mov")
let expectedMetadata = Metadata(duration: .seconds(90))
#expect(video.metadata == expectedMetadata)
}
Попробовать можно сейчас с XCode 16 beta. Более подробно можно посмотреть в видео с WWDC.
👍16❤1
Run, Break, Inspect: Explore effective debugging in LLDB
Познавательная сессия про отладку и поиск проблем в кодовой базе с помощью LLDB и:
- крашлогов
- обратных вызовов (backtraces)
- брейкпоинтов с действиями и сложными условиями остановки
- "p" команды
Из нового: добавили новый макрос
Познавательная сессия про отладку и поиск проблем в кодовой базе с помощью LLDB и:
- крашлогов
- обратных вызовов (backtraces)
- брейкпоинтов с действиями и сложными условиями остановки
- "p" команды
Из нового: добавили новый макрос
@DebugDescription
, который может заменить протокол CustomDebugStringConvertible
. Пример:
@DebugDescription
struct WatchLaterItem {
let video: Video
let name: String
let addedOn: Date
var debugDescription: String {
"\(name) - \(addedOn)"
}
}
👍7
Demystify explicitly built modules
С ростом кодовой базы растет число зависимостей, которые влияют на время сборки приложения.
В XCode 16 добавили опцию в Build Settings проекта: Explicitly Built Modules, которая позволит быстрее найти проблемное место. В логах сборки приложения будет генерироваться Swift modules report, в котором будут указаны все варианты собранных модулей. Так же эта опция позволит сократить время сборки за счет улучшенного планирования стадий сборки и передачи уже собранных модулей дебагеру.
В видео более подробно про то, что происходит после запуска сборки приложения.
С ростом кодовой базы растет число зависимостей, которые влияют на время сборки приложения.
В XCode 16 добавили опцию в Build Settings проекта: Explicitly Built Modules, которая позволит быстрее найти проблемное место. В логах сборки приложения будет генерироваться Swift modules report, в котором будут указаны все варианты собранных модулей. Так же эта опция позволит сократить время сборки за счет улучшенного планирования стадий сборки и передачи уже собранных модулей дебагеру.
В видео более подробно про то, что происходит после запуска сборки приложения.
👍4
Analyze heap memory
WWDC сессия про анализ часто встречающихся проблем при работе со ссылочными типами и про практики, которые помогают с решением утечек или ростом потребления памяти.
Еще в сессии про:
- устройство кучи
- анализ потребления памяти
- инструменты профилирования
- устройство autoreleasepool
- применимость unowned и weak ссылок
Забавно, что в этой сессия не рассматривается устранение проблем при помощи Swift Concurrency, а все "по старинке" 🤔
WWDC сессия про анализ часто встречающихся проблем при работе со ссылочными типами и про практики, которые помогают с решением утечек или ростом потребления памяти.
Еще в сессии про:
- устройство кучи
- анализ потребления памяти
- инструменты профилирования
- устройство autoreleasepool
- применимость unowned и weak ссылок
Забавно, что в этой сессия не рассматривается устранение проблем при помощи Swift Concurrency, а все "по старинке" 🤔
🔥13
Go small with Embedded Swift
В этой WWDC сессии рассказывается про новую область применения Swift – встраиваемые устройства (Embedded Devices).
Обязательно смотреть, если устали от привычной разработки и хочется чего-нибудь экзотического 😎 Еще интересно тем, что есть достаточно жесткие ограничения по потребляемой памяти и вычислительной мощности. Более того, не все функции языка доступны, поэтому иногда придется искать альтернативные решения.
В этой WWDC сессии рассказывается про новую область применения Swift – встраиваемые устройства (Embedded Devices).
Обязательно смотреть, если устали от привычной разработки и хочется чего-нибудь экзотического 😎 Еще интересно тем, что есть достаточно жесткие ограничения по потребляемой памяти и вычислительной мощности. Более того, не все функции языка доступны, поэтому иногда придется искать альтернативные решения.
🔥6
Explore Swift performance
Swift – лаконичный и интуитивно понятный язык программирования. Однако, за этой простотой мы не всегда явно осознаем, как то или иное решение повлияет на производительность. В том же C при вызове malloc мы всегда видим затраты по памяти.
В сессии проходятся по многим аспектам работы языка на низком уровне.
А еще видео содержит ответы на часто задаваемые вопросы по Swift на собеседованиях 🤫
Swift – лаконичный и интуитивно понятный язык программирования. Однако, за этой простотой мы не всегда явно осознаем, как то или иное решение повлияет на производительность. В том же C при вызове malloc мы всегда видим затраты по памяти.
В сессии проходятся по многим аспектам работы языка на низком уровне.
А еще видео содержит ответы на часто задаваемые вопросы по Swift на собеседованиях 🤫
Apple Developer
Explore Swift performance - WWDC24 - Videos - Apple Developer
Discover how Swift balances abstraction and performance. Learn what elements of performance to consider and how the Swift optimizer...
🔥11