0Pricing
Swift Academy · Урок

Обзор расширений приложений

Разберитесь в расширениях для отправки, действий и других задач.

«Обзор расширений приложений» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Что такое расширения приложений

Расширение приложения позволяет приложению предоставлять функции внутри других приложений или системных интерфейсов — обмениваться содержимым, использовать настраиваемые клавиатуры, индексировать данные в Spotlight и многое другое. Каждое расширение является отдельной целью со своим жизненным циклом, изолированной средой и точкой входа, определённой системой.

// Extensions run in their own process, launched
// by the host (Photos, Safari, Messages, the system),
// not by your main app.

Основное приложение, контейнер и изолированная среда

Здесь участвуют три компонента: содержащее приложение запускает расширение, Ваше приложение-контейнер поставляет его, а само расширение работает в изолированной среде. Расширение не может свободно взаимодействовать с приложением: они обмениваются данными через группу приложений, без прямого доступа к памяти.

import Foundation
// Container app + Extension target share data via
// an App Group, e.g. group.com.example.app
let group = "group.com.example.app"
_ = group

Расширения для обмена

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

import Foundation
// Share extension reads incoming items:
// extensionContext?.inputItems
//   each NSExtensionItem has attachments (NSItemProvider)
let share = "appears in the share sheet"
_ = share

Чтение общих элементов

Общее содержимое поступает как вложения NSItemProvider. Проверьте идентификатор типа и асинхронно загрузите значение. Так расширение для обмена получает URL-адрес или изображение, которым пользователь делится.

import UniformTypeIdentifiers
func handle(_ provider: NSItemProvider) {
    if provider.hasItemConformingToTypeIdentifier(
        UTType.url.identifier) {
        provider.loadItem(
            forTypeIdentifier: UTType.url.identifier) {
            value, _ in
            print("shared url:", value ?? "none")
        }
    }
}

Расширения действий

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

import Foundation
// Action extension may return modified items:
// extensionContext?.completeRequest(
//     returningItems: outputItems)
let action = "acts on content, can return a result"
_ = action

Расширение службы уведомлений

Расширение службы уведомлений перехватывает входящие push-уведомления с mutable-content: 1, чтобы изменить их перед отображением — расшифровать содержимое, загрузить медиавложение или переписать заголовок — в течение короткого доступного интервала.

import UserNotifications
// Override in UNNotificationServiceExtension:
// didReceive(_ request:, withContentHandler:)
//   mutate bestAttemptContent, then call the handler
let service = "modifies push before it shows"
_ = service

Расширение содержимого уведомлений

Расширение содержимого уведомлений предоставляет пользовательский интерфейс для развёрнутого уведомления — карту, медиапроигрыватель или интерактивные элементы управления, — который отображается, когда пользователь нажимает и удерживает баннер. Оно связано с категорией уведомления.

import UserNotifications
// UNNotificationContentExtension renders a custom view
// for a given UNNotificationCategory when expanded.
let content = "custom expanded notification UI"
_ = content

Жизненный цикл completeRequest

Расширения работают недолго. После завершения вызовите extensionContext?.completeRequest(returningItems:completionHandler:), чтобы сообщить о завершении и позволить содержащему приложению закрыть расширение. Для досрочного выхода используйте cancelRequest(withError:). Если процесс продолжит работать без необходимости, это приведёт к расходу ресурсов, и система может его завершить.

import Foundation
func finish(context: NSExtensionContext?) {
    context?.completeRequest(
        returningItems: [], completionHandler: nil)
}

Другие точки расширения

iOS предлагает множество точек расширения: настраиваемые клавиатуры, поставщики документов, индексирование в Spotlight, блокировщики содержимого Safari, действия Siri, редактирование фотографий и расширения поставщиков файлов. Каждое расширение соответствует протоколу, определённому системой и объявленному через NSExtensionPointIdentifier в файле Info.plist.

// Info.plist of an extension declares its point:
// NSExtension > NSExtensionPointIdentifier
//   e.g. com.apple.share-services
//        com.apple.usernotifications.service
let point = "each extension declares its point"
_ = point

Ограничения памяти и времени

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

import Foundation
// Tight memory + short runtime.
// Pattern: extension stages data in the App Group,
// the main app processes it fully on next launch.
let limits = "keep extensions lean and fast"
_ = limits

Общий код для разных целей

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

import Foundation
// Shared Swift package 'AppCore' linked by:
//   - main app target
//   - share extension target
//   - widget extension target
let shared = "one source of truth for models"
_ = shared

Быстрая проверка

Вспомните, как расширение взаимодействует с приложением-контейнером.

Повторение

Вы познакомились с расширениями приложений:

  • Расширения — это отдельные цели в изолированной среде, запускаемые содержащим приложением; к ним относятся расширения для обмена, действий, службы уведомлений и содержимого уведомлений.
  • Читайте входящее содержимое через NSItemProvider и завершайте работу с помощью completeRequest.
  • Каждое расширение объявляет свой NSExtensionPointIdentifier и работает с жёсткими ограничениями памяти и времени.
  • Передавайте данные через группу приложений и повторно используйте код с помощью общего пакета.

Часто задаваемые вопросы

Урок «Обзор расширений приложений» бесплатный?

Да — полный текст урока «Обзор расширений приложений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Обзор расширений приложений»?

Разберитесь в расширениях для отправки, действий и других задач. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Обзор расширений приложений»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Создание виджета WidgetKit
  2. Поставщики временных шкал и снимки
  3. Обзор расширений приложений
  4. App Intents и быстрые команды
← Назад к Swift Academy