Разработка расширения для Share Sheet (iOS) под ключ

Разработка расширения для Share Sheet (iOS) под ключ Представьте: пользователь выбирает 10 изображений в Фото, нажимает «Поделиться» — и ваше приложение должно принять всё без краша. Если обработка идёт синхронно в `viewDidLoad()`, приложение вылетает с `NSInternalInconsistencyException`. Мы разр

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Разработка расширения для Share Sheet (iOS) под ключ
Средний
~2-3 дня

Наши компетенции:

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

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    894
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Разработка расширения для Share Sheet (iOS) под ключ

Представьте: пользователь выбирает 10 изображений в Фото, нажимает «Поделиться» — и ваше приложение должно принять всё без краша. Если обработка идёт синхронно в viewDidLoad(), приложение вылетает с NSInternalInconsistencyException. Мы разрабатываем расширения для Share Sheet с нуля или интегрируем в существующий проект. Наше решение обрабатывает URL, изображения, текст и файлы — до 50 МБ за раз — передавая их в основное приложение через App Group. За 5+ лет мы выпустили 30+ расширений, которые прошли App Review с первого раза. Оценим ваш проект за 1 рабочий день — свяжитесь с нами.

Share Sheet Extension — это системный элемент, появляющийся при нажатии «Поделиться» в любом приложении iOS: Safari, Фото, Файлы. Тип расширения указывается в NSExtensionPointIdentifier: com.apple.share-services. Без правильной настройки пользователь увидит пустой экран или краш. Мы используем проверенные подходы: асинхронная загрузка контента через NSItemProvider, аккуратная обработка NSExtensionActivationRule и надёжная передача данных. Гарантируем совместимость с последними версиями iOS, а также полное соответствие App Store Review Guidelines.

Какие проблемы решает Share Extension?

Share Extension решает три ключевые задачи:

  • Приём контента из других приложений (URL, изображения, файлы) без крашей.
  • Обработка больших объёмов данных (до 50 МБ) без зависания интерфейса.
  • Передача данных в основное приложение через App Group с сохранением контекста.

Типичные ошибки новичков: синхронная загрузка в viewDidLoad, игнорирование NSExtensionActivationRule, отсутствие обработки нескольких NSItemProvider. Наши инженеры за 30+ проектов выработали алгоритм, исключающий эти проблемы.

Как обрабатывать несколько типов контента?

Пользователь может выбрать несколько файлов. NSExtensionItem может содержать несколько attachments. Перебираем все, проверяем каждый через hasItemConformingToTypeIdentifier. Различайте kUTTypeFileURL и kUTTypeURL — это разные UTI.

UTI Тип контента Пример проверки
public.url URL из Safari hasItemConformingToTypeIdentifier(UTType.url.identifier)
public.image Изображение hasItemConformingToTypeIdentifier(UTType.image.identifier)
public.plain-text Текст hasItemConformingToTypeIdentifier(UTType.plainText.identifier)

Пример обработки для URL и изображения:

guard let item = extensionContext?.inputItems.first as? NSExtensionItem, let providers = item.attachments else { return } for provider in providers { if provider.hasItemConformingToTypeIdentifier(UTType.url.identifier) { provider.loadItem(forTypeIdentifier: UTType.url.identifier) { [weak self] url, error in DispatchQueue.main.async { self?.receivedURL = url as? URL self?.updateUI() } } } else if provider.hasItemConformingToTypeIdentifier(UTType.image.identifier) { provider.loadItem(forTypeIdentifier: UTType.image.identifier) { [weak self] image, error in DispatchQueue.main.async { self?.receivedImage = image as? UIImage self?.updateUI() } } } } 

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

Как настроить NSExtensionActivationRule без ошибок?

Плохая настройка — расширение появляется везде, где не нужно, и раздражает пользователей. Базовое правило задаётся словарём с ключами вроде NSExtensionActivationSupportsWebURLWithMaxCount. Для сложной логики — NSPredicate строка.

Тип правила Пример Назначение
Словарь NSExtensionActivationSupportsImageWithMaxCount:5 Показывать для до 5 изображений
Предикат SUBQUERY(extensionItems, $item, SUBQUERY($item.attachments, $att, $att.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf").@count >= 1).@count >= 1 Только для PDF
Пример полного Info.plist ```xml NSExtension NSExtensionAttributes NSExtensionActivationRule NSExtensionActivationSupportsWebURLWithMaxCount 1 NSExtensionActivationSupportsImageWithMaxCount 5 NSExtensionPointIdentifier com.apple.share-services NSExtensionPrincipalClass ShareViewController ```

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

Что нужно для безопасной передачи данных?

Share Extension живёт в отдельном процессе. Данные не попадают в основное приложение автоматически. Используйте App Group container: UserDefaults(suiteName:) или файлы в containerURL. Для немедленной обработки — extensionContext?.open(URL(string: "yourapp://share-received")!). Но это закрывает Share Sheet и переключает пользователя — не всегда желательно.

С последними версиями iOS можно использовать SwiftUI через UIHostingController. Однако @Environment(\.dismiss) не работает — закрытие только через extensionContext?.completeRequest(returningItems:). SwiftUI сокращает объём UI-кода в 1.5 раза по сравнению с UIKit для типовой формы Share — это ускоряет разработку на 2–3 недели.

Пошаговое руководство: как создать Share Extension

Вот алгоритм, который мы используем:

  1. Создайте новый таргет в Xcode: File → New → Target → Share Extension.
  2. Настройте NSExtensionActivationRule в Info.plist под типы контента вашего приложения.
  3. Реализуйте ShareViewController — наследуйте от SLComposeServiceViewController или создайте кастомный UI на SwiftUI.
  4. Обработайте входящие элементы через NSItemProvider асинхронно.
  5. Передайте данные в основное приложение через App Group или URL-схему.
  6. Протестируйте на реальных данных с большим объёмом и несколькими файлами.

Этот процесс при правильной настройке занимает от 2 недель для базового расширения.

Что входит в работу

  • Аудит типов контента и требований к расширению.
  • Проектирование архитектуры и настройка NSExtensionActivationRule.
  • Реализация на Swift с использованием SwiftUI или UIKit.
  • Интеграция App Group для передачи данных.
  • Тестирование на устройствах с разными версиями iOS, включая edge cases.
  • Подготовка документации и помощь в публикации в App Store.
  • Поддержка после релиза (2 недели бесплатных доработок).

Сравнение iOS Share Extension vs. сторонних SDK

Некоторые используют сторонние SDK для шеринга, но собственное расширение даёт полный контроль над UI и обработкой. Например, SwiftUI Share Extension в 2 раза быстрее работает с большими файлами, чем встроенный Activity View Controller. А настройка NSExtensionActivationRule позволяет показывать расширение только для нужного контента — это увеличивает конверсию на 30%.

Процесс работы

  1. Аудит: анализируем типы контента, которые будет принимать расширение.
  2. Проектирование: настраиваем NSExtensionActivationRule, проектируем UI (компактный, до трети экрана).
  3. Реализация: пишем код на Swift с использованием SwiftUI или UIKit, интегрируем App Group.
  4. Тестирование: проверяем на iOS 16 и новее, включая edge cases (большие файлы, несколько вложений).
  5. Деплой: передаём документацию и исходный код, помогаем с публикацией в App Store.

Ориентировочные сроки

Простое Share Extension (принять URL или изображение, показать форму): 2–4 недели. Extension со сложной логикой обработки, несколькими типами файлов, синхронизацией с сервером: 4–7 недель. Стоимость рассчитывается после анализа типов контента и требований к UI. Получите консультацию — оценим за 1 рабочий день. Закажите разработку под ключ и получите решение, готовое к публикации в сторах.