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

Пользователи делятся контентом из любого приложения iOS, но ваше приложение может не справиться с потоком данных и вылететь. Мы разрабатываем расширения для Share Sheet, которые надёжно принимают URL, изображения и файлы, а наша команда реализует проект под ключ — от настройки до последующей поддержки.

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

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

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

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

Разработка расширения для 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 рабочий день. Закажите разработку под ключ и получите решение, готовое к публикации в сторах.

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

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

  • Разработка мобильного приложения для компании FEEDME
    Разработка мобильного приложения для компании FEEDME
    1010
  • Разработка мобильного приложения для компании XOOMER
    Разработка мобильного приложения для компании XOOMER
    903
  • Разработка мобильного приложения для компании RHL
    Разработка мобильного приложения для компании RHL
    1332
  • Разработка мобильного приложения для компании ZIPPY
    Разработка мобильного приложения для компании ZIPPY
    1180
  • Разработка мобильного приложения для компании Affhome
    Разработка мобильного приложения для компании Affhome
    1107
  • Разработка мобильного приложения для компании FLAVORS
    Разработка мобильного приложения для компании FLAVORS
    714