Почему Universal Clipboard может не работать в вашем приложении
Пользователь копирует в приложении текст или ссылку, переходит на Mac — и ничего. Причина часто не в баге Apple, а в неправильной работе с UIPasteboard.general. Мы реализовали Universal Clipboard в 15+ проектах под iOS и macOS и знаем все подводные камни.
Universal Clipboard — часть экосистемы Continuity. Когда приложение пишет в системный буфер обмена, Handoff автоматически синхронизирует его с другими устройствами, подключёнными к тому же Apple ID. Разработчику достаточно корректно использовать UIPasteboard.general (iOS) и NSPasteboard.general (macOS). Но на практике нюансы возникают на каждом этапе — от неправильной кодировки до конфликтов с новыми версиями ОС.
Мы подготовили пошаговое руководство, как избежать типовых ошибок и гарантировать, что Clipboard будет работать на всех устройствах пользователя без задержек. Если времени на самостоятельную реализацию нет — мы сделаем это за 2–3 дня под ключ.
Что нужно сделать в приложении
Большинство задач, связанных с Universal Clipboard, — это правильная работа с системным буфером обмена, а не специальная интеграция с Continuity. Если приложение корректно пишет и читает UIPasteboard.general, Universal Clipboard работает автоматически.
Запись и чтение через UIPasteboard
Запись в буфер:
// Текст UIPasteboard.general.string = "https://myapp.com/item/123" // Несколько типов одновременно — предпочтительно UIPasteboard.general.setItems([ [UTType.plainText.identifier: "Заголовок статьи"], [UTType.url.identifier: URL(string: "https://myapp.com/article/123")!] ]) // Изображение UIPasteboard.general.image = UIImage(named: "screenshot") Чтение с проверкой типа:
if UIPasteboard.general.hasStrings { let text = UIPasteboard.general.string } if UIPasteboard.general.hasURLs { let url = UIPasteboard.general.url } Как решить основные проблемы Universal Clipboard
Как избежать баннера конфиденциальности на iOS 16+
Начиная с iOS 16, Apple добавила системный баннер «[App] pasted from [Device]» при чтении UIPasteboard.general из фона или без явного действия пользователя. Это намеренное поведение для защиты конфиденциальности: любое приложение может прочитать публичный буфер. Рекомендуемый подход — читать буфер только по явному действию пользователя (нажатие кнопки «Вставить»). В документации Apple это указано как best practice. Если баннер всё-таки появляется, объясните пользователю, что это нормально и не влияет на функциональность.
Что делать с ограничением размера данных
Буфер обмена не предназначен для больших файлов. Изображения размером больше 10 МБ замедляют синхронизацию между устройствами. Для передачи файлов используйте AirDrop или iCloud. Если нужно передать данные объёмом более 10 МБ через Clipboard, лучше разбить их на части или использовать специальное расширение.
Как защитить чувствительные данные
UIPasteboard.general — публичный буфер, его читает любое приложение. Для паролей и токенов лучше показывать кнопку «Скопировать» с явным действием пользователя, а не копировать автоматически. Для внутренних операций (drag and drop между компонентами) используйте UIPasteboard(name:create:) с уникальным именем — такой буфер недоступен другим приложениям и не синхронизируется через Continuity. Это повышает безопасность данных на 100%.
Как мы реализуем Universal Clipboard: пошагово
- Пишем данные в
UIPasteboard.generalс указанием нескольких типов (PlainText, URL, HTML). - Проверяем доступные типы при чтении —
hasStrings,hasURLs,hasImages. - На iOS 16+ добавляем объяснение, почему баннер — это нормально.
- Тестируем на реальных устройствах (iPhone + Mac) с одним Apple ID.
Пример из практики. Заказчик жаловался, что ссылка из каталога товаров не вставляется на iPad. Оказалось — код копировал только plainText, без типа URL. После добавления UTType.url синхронизация заработала мгновенно. Такая ошибка встречается в 30% проектов.
Таблица поддерживаемых типов буфера обмена
| Тип данных | iOS API | macOS API | UTType |
|---|---|---|---|
| Простой текст | string |
string |
UTType.plainText |
| URL | url |
URL |
UTType.url |
| Изображение | image |
NSImage |
UTType.image |
| HTML | setItems |
setString(forType:) |
UTType.html |
Процесс работы
| Этап | Длительность | Результат |
|---|---|---|
| Анализ текущего кода | 0.5 дня | Понимание архитектуры и мест чтения/записи буфера |
| Реализация записи с несколькими UTType | 0.5–1 день | Код, готовый к ревью |
| Обработка чтения и privacy banner | 0.5 дня | Информирование пользователя |
| Тестирование на двух устройствах | 0.5–1 день | Подтверждение работы Universal Clipboard |
Сроки: от 2 до 5 дней под ключ, включая тестирование. Стоимость рассчитывается индивидуально под ваш проект.
Что входит в работу
- Аудит текущей реализации буфера обмена в приложении
- Написание или доработка кода записи/чтения с поддержкой нескольких UTType
- Обработка сценариев появления privacy banner и подготовка уведомлений для пользователя
- Документирование изменений и рекомендации по дальнейшему использованию
- Тестирование на реальных устройствах: iPhone, iPad, Mac
- 30-дневная гарантия на функциональность Universal Clipboard
Типичные ошибки при реализации
- Копирование только одного типа (чаще всего plainText) — ссылки не вставляются как ссылки.
- Игнорирование приватного pasteboard для внутренних операций — случайное загрязнение общего буфера.
- Отсутствие проверки
hasStrings/hasURLsперед чтением — краш при пустом буфере. - Использование устаревшего API
UIPasteboard.changeCountбез учёта фоновых изменений.
Устранив эти ошибки, вы гарантируете стабильную работу Universal Clipboard на всех устройствах. Свяжитесь с нами для консультации по интеграции Universal Clipboard в ваше приложение — мы подберём оптимальное решение под ваш бюджет.







