Реализация Clipboard-интеграции в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

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

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

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1735 услуг
Реализация Clipboard-интеграции в мобильном приложении
Простой
~1 день
Часто задаваемые вопросы

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

Этапы разработки

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

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

Реализация Clipboard-интеграции в мобильном приложении

Clipboard — один из тех API, который выглядит тривиально, пока не сталкиваешься с его поведением на разных версиях iOS и Android. Начиная с iOS 14 каждый доступ к UIPasteboard.general без согласия пользователя показывает системный баннер «[App] вставила из буфера обмена». На Android 12+ аналогичный тост. Это не баг — это намеренное поведение платформ.

iOS: UIPasteboard и ограничения

UIPasteboard.general.string — синхронное чтение. Но с iOS 14 приложение получает предупреждение при каждом чтении, если оно не инициировано явным действием пользователя (нажатием кнопки «Вставить»).

Правильный подход — использовать UIPasteControl (iOS 16+): системная кнопка, которая читает буфер обмена без предупреждения, потому что пользователь явно нажал на неё:

let pasteControl = UIPasteControl(configuration: UIPasteControl.Configuration())
pasteControl.target = self
// реализуем UIPasteConfigurationSupporting
override func paste(itemProviders: [NSItemProvider]) {
    for provider in itemProviders {
        if provider.canLoadObject(ofClass: NSString.self) {
            provider.loadObject(ofClass: NSString.self) { string, _ in
                DispatchQueue.main.async {
                    self.handlePastedText(string as? String)
                }
            }
        }
    }
}

Для iOS 14-15, где UIPasteControl недоступен, единственный способ не показывать баннер — читать буфер только в applicationDidBecomeActive или при явном tap-действии. Чтение в viewDidLoad или в фоне — гарантированный баннер.

Запись в буфер обмена — без ограничений: UIPasteboard.general.string = "text". Но если записываем сложный контент (изображение + текст), используем setItems([["public.plain-text": text, "public.png": imageData]]) с явными UTI-типами.

Android: ClipboardManager

val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
// Запись
val clip = ClipData.newPlainText("label", "text to copy")
clipboard.setPrimaryClip(clip)
// Чтение
val text = clipboard.primaryClip?.getItemAt(0)?.coerceToText(context)

На Android 13+ (API 33) ClipboardManager.getPrimaryClip() возвращает данные только для приложения на переднем плане или приложения, которое записало данные. Фоновое чтение чужих данных — SecurityException. Это изменение сломало несколько менеджеров паролей при обновлении.

Android 13 также добавил визуальное подтверждение при копировании — системный тост с превью скопированного текста. Приложение может отключить его для конкретной операции: ClipData.newPlainText("label", text).apply { description.extras = PersistableBundle().apply { putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true) } } — для чувствительных данных (пароли) тост не показывается.

Flutter и React Native

В Flutter — flutter/services package, Clipboard.getData(Clipboard.kTextPlain) и Clipboard.setData(). Возвращает Future — важно не вызывать в initState без mounted-проверки, иначе setState после dispose даёт assertion error.

В React Native — @react-native-clipboard/clipboard. На iOS под капотом тот же UIPasteboard, на Android — ClipboardManager. Проблема: пакет не абстрагирует iOS 16 UIPasteControl — при необходимости нужен нативный модуль.

Реализация clipboard-интеграции с учётом iOS 14+ и Android 13+: 1 день. Стоимость рассчитывается индивидуально.