
- Главная
- Каталог
- Интернет технологии
- iOS Broadcast
Статистика канала
Не часто приходится работать с in-app-ми и это то место, в котором не хочется допускать ошибки. Тут и репутационные и финансовые риски. Особенно сложно работать с нескольими уровнями подписок: как только вы добавляете несколько тарифов (например, личный / семкйный + месяц / год), появляются типичные боли:
Подход из статьи: “всегда выбираем самый высокий tier”
1) Группы подписок + уровни (Level of Service)
Apple использует “Subscription Level” (lower number = *higher tier*) для логики апгрейдов/даунгрейдов и того, какая подписка должна считаться активной
В примере:
2) Модель тиров в коде
Делаем enum
PassStatus (notSubscribed / individual / family) и маппим productID → tier, чтобы интерпретировать статусы StoreKit3) Вычисляем текущий доступ по status’ам
Фильтруем
statuses до .subscribed и выбираем max tier (чтобы Family “перебивал” Individual при overlap)4) Trust only verified
Только
.verified транзакции считаем entitlement’ом. Если verification не прошёл — считаем “нет подписки”.5) Обязательно finish + наблюдаем апдейты
finish(), иначе StoreKit может принести её сноваTransaction.unfinished (после крэша/сети)Transaction.updates для мгновенного обновления UI6) UI: SubscriptionStoreView + статус рядом
В статье используют
SubscriptionStoreView(groupID:), а текущий tier и “renews to …” строят из renewalInfo.Эмпирическое правило для подписок
Немного базы в пятницу, статья про жесты в SwiftUI.
Кейс один экран — несколько интеракций
Как только на элементе появляются drag + rotate + long press + tap — SwiftUI быстро начинает угадывать, какой жест вы имели в виду и не всегда у него это выходит успешно:
Все это создает негативный UX
.gesture(...) и надеяться... На что-то обычно заканчивается тем, что один жест побеждает всегда, а второй почти не срабатывает.Три базовых композиции жестов в SwiftUI:
Кейс: long press → drag
Используем
LongPressGesture(...).sequenced(before: DragGesture())Идея:
@GestureState обновляется через .updating(), а drag-translation читаем в .onChanged() на втором этапеКейс: drag + rotate
DragGesture().simultaneously(with: RotateGesture()).onChanged()Кейс: tap vs long press
ExclusiveGesture(TapGesture(), LongPressGesture(minimumDuration: 1.0))Небольшие но важные изменения к которым нужно подготовиться:
Добавить напоминание в дефолтный список — легко.
Но как только у вас появляются кейсы типа Проекты / Контексты / Приоритеты, всё ломается:
Искушение: писать в default list и забыть
EKReminder в defaultCalendarForNewReminders() — и кажется, что задача решена. Но это не UX, а технический костыль.Рабочий подход: создавать свои списки (reminder lists) через
EKCalendarEKCalendar c entity .reminder)Что делаем:
requestFullAccessToReminders()eventStore.calendars(for: .reminder)EKCalendar(for: .reminder, eventStore: ...), задаём title, подбираем source, сохраняем saveCalendar(..., commit: true)EKReminder, выставляя dueDateComponents и сохраняя eventStore.save(reminder, commit: true)Info.plist — Privacy - Reminders Full Access Usage Description.Списки Reminders должны сохраняться в конкретное хранилище (локально / iCloud / CalDAV). Авторы предлагают приоритет:
.local или .calDAV, иначе fallback на defaultCalendarForNewReminders()?.sourceОказывается есть аналог глобального AGENTS.md для каждого проекта. Можно настроить общие подходы через скилы.
Skills заменяют AGENTS.md
Skill — это каталог, содержащий:
Skills позволяют разделять знания по темам, например:
и использовать их во всей своей экосистеме AI-инструментов
Автор создал Swift Concurrency Skill с модульной структурой:
swift-concurrency/
├── SKILL.md
└── references/
├ async-await-basics.md
├ actors.md
├ tasks.md
├ memory-management.md
└ …
Это даёт агенту глубокий, структурированный контекст, когда он отвечает на вопросы или делает refactor/анализ кода
Преимущества подхода
Agent Skills эффективно превращают набор практик и знаний вашего стека в модульные, переиспользуемые блоки. Это даёт:
Google и Apple опубликовали совместное заявление, что само по себе редкость. Компании подчеркнули общее видение будущего цифровой экосистемы - AI с акцентом на безопасность, приватность и ответственность крупных платформ.
Факт - бизнес Apple не строится на продаже пользовательских данных
Именно поэтому Apple может:
Для компаний, живущих за счёт рекламы и данных, такой подход просто недоступен.
На этом фоне совместное заявление Apple и Google выглядит не компромиссом, а расчётливым шагом:
Gemini — один из самых зрелых AI-стеков
И ключевое — Gemini легко встраивается как внешний сервис, без передачи контроля над платформой.
Apple делает то, что умеет лучше всего:
Gemini здесь — инструмент, а не хозяин экосистемы.
Apple усиливает платформу, используя privacy как рычаг, а Gemini — один из немногих AI-партнёров, которого можно встроить, не ломая эту модель.
Верите в успех этого партнерства или расстроены тем что Apple признали свое отставание и сдались вендору в плоскости AI?
Новая лекция из курса iOS Development with SwiftUI от Stanford University продолжает тему архитектуры приложений на SwiftUI — от базового разделения Model/View/ViewModel к более сложным паттернам устойчивости и масштабируемости. Лекция полностью состоит из демонстрации, на основе которой после лекции формируется домашнее задание.
Продвинутая архитектура SwiftUI-приложений:
Observable, @MainActor, ViewModelsСвязь Model ↔️ ViewModel ↔️ View
@Published, Binding, @StateObject)Работа с навигацией и состоянием
Домашнее задание:
Создать игру, похожую на CodeBreaker (которую создают в курсе), но с буквами английского алфавита вместо цветных меток, а также со следующими требованиями:
#cs193p
Первые дни новогодних праздников позади, а значит пора возвращаться к контенту. Что может быть лучше для начала года чем лекции Стенфорда. Пятая лекция сосредотачивается на архитектуре приложений, модели состояния и связке с UI — это следующий логичный шаг после первых четырёх лекций
@StateObject, @ObservedObject, @Binding и реактивное обновление View.enum, структуры и Optional для описания состояния приложенияВсе эти подходы помогают перейти от простого UI к полноценному приложению с бизнес-логикой, состояниями и тестируемой моделью
Почему это полезно?
#cs193p
В Swift 6.2 появилась превью новой фичи, под флагом
NonisolatedNonsendingByDefault. В комьюнити и форумах swift обсуждается идея, которая набирает отклик в Swift-сообществе: начинать проект с non-Sendable типов и добавлять Sendable / actor только там, где действительно нужна безопасность между потоками. Этот подход предлагает более простой путь к переходу на Swift Concurrency, чем повсеместное использование акторов и Sendable. В чём суть Non-Sendable First Design:
non-Sendable, пока они не пересекают границы изоляции (то есть не должны быть переданы в Task, actor или другой изоляционный контекст)@MainActor, @Sendable, акторов, пока код фактически не требует потокобезопасного обменаПочему это может быть полезно:
Sendable, пока они используются в одном доменеSendable/actor именно туда, где это важно📌 Статья от Apple
📌 Оригинальный пропоузал
📌 Обсуждение на reddit
Большинство разработчиков используют LLM (ChatGPT, Claude, Cursor) из коробки и получают рабочий, но недостаточно качественный код: он компилируется, но не соответствует архитектуре, стилю и практикам, которые вы используете в своем проекте. Это особенно заметно в Swift, так как в тренировочных данных таких примеров меньше, чем, скажем, JavaScript/Python. LLM обучены на статистике текста — они средние по трендовым паттернам интернета, а не специфичным корпоративным/производственным стилям. Поэтому они генерируют код, который компилируется, но:
AGENTS.md Это “README для LLM” - высокоуровневое описание архитектуры, команд, workflow, договорённостей:
Rule Files - Набор правил на уровне доменов:Каждый файл содержит чёткие директивы и примеры кода, которые LLM подгружает только тогда, когда это нужно.
Что это даёт
Отзывы канала
Каталог Телеграм-каналов для нативных размещений
iOS Broadcast — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 3.5K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 7.2, количество отзывов – 0, со средней оценкой 0.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 7132.86 ₽, а за 0 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий