Користувачі все частіше очікують, що поділитися контентом з сайту можна через нативний діалог операційної системи — як у мобільних застосунках. Замість громіздких блоків з десятком кнопок соцмереж достатньо однієї кнопки «Поділитися», яка викликає системний інтерфейс: Telegram, WhatsApp, Notes, AirDrop та інші застосунки. Web Share API — вбудована можливість браузера — дає це без встановлення сторонніх SDK. Ми вже реалізували такий шарінг для 15+ проєктів, і він стабільно працює на iOS та Android. Наш досвід у нативних API — понад 5 років, і ми гарантуємо коректну роботу на всіх підтримуваних браузерах.
Однак у API є особливості. На десктопах підтримка неповна: у Firefox та Safari macOS нативний діалог не відкривається. Тому критично важливо передбачити fallback — копіювання посилання в буфер обміну. У цій статті розберемо, як правильно інтегрувати Web Share API з урахуванням усіх нюансів: перевірка підтримки, шарінг файлів, обробка помилок та React-компонент із запасним варіантом.
Чому Web Share API кращий за кастомні кнопки?
Кастомні кнопки соцмереж вимагають інтеграції окремого SDK для кожної платформи, оновлення при змінах API і не дають нативного UX. Web Share API вирішує все однією функцією:
| Критерій | Web Share API | Кастомні кнопки соцмереж |
|---|---|---|
| Кількість коду | 1 функція | ~10 різних інтеграцій |
| Підтримка файлів | Так | Ні або складно |
| Нативний UX | Так | Ні |
| Робота на десктопі | Частково (Chrome, Edge) | Так (якщо є SDK) |
| Обслуговування | Одна точка | N точок при оновленні API |
API вбудовано в браузер, не вимагає завантаження скриптів і працює навіть офлайн (якщо сторінка завантажена).
Що таке Web Share API і як він працює?
Web Share API — це вбудований метод браузера navigator.share(). Ви передаєте об'єкт з полями title, text, url або files, і браузер відкриває системний діалог вибору застосунків. Згідно зі специфікацією MDN, API підтримується на iOS Safari 12.1+, Android Chrome 61+, Edge 79+. На десктопних Chrome та Edge (Windows) API працює, Firefox і Safari macOS — ні.
Які дані можна шейрити через Web Share API?
API дозволяє шейрити:
- Текст і URL (обов'язково хоча б одне)
- Файли: зображення, PDF, відео — через властивість
files - Дані з Canvas після конвертації в Blob
Для перевірки підтримуваного типу даних використовуйте navigator.canShare(). Якщо дані не підтримуються, викинеться помилка — її потрібно перехопити та виконати fallback.
Базовий шарінг
interface ShareData { title?: string text?: string url?: string files?: File[] } async function share(data: ShareData): Promise<void> { if (!navigator.share) { throw new Error('Web Share API не підтримується') } // Перевірка, що браузер підтримує конкретний набір даних if (!navigator.canShare(data)) { throw new Error('Цей тип контенту не підтримується для шарінгу') } await navigator.share(data) } Ця утиліта — база для будь-якої інтеграції. Зверніть увагу: canShare необов'язковий, але без нього помилка може виникнути лише під час виклику.
Шарінг файлів
async function shareFile(file: File, title?: string): Promise<void> { const data: ShareData = { files: [file], title } if (!navigator.canShare?.(data)) { // Fallback: запропонувати завантажити файл const url = URL.createObjectURL(file) const a = document.createElement('a') a.href = url a.download = file.name a.click() URL.revokeObjectURL(url) return } await navigator.share(data) } // Шарінг Canvas як зображення async function shareCanvas( canvas: HTMLCanvasElement, filename: string, title?: string ): Promise<void> { const blob = await new Promise<Blob>((resolve, reject) => canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('Помилка'))), 'image/png') ) const file = new File([blob], filename, { type: 'image/png' }) await shareFile(file, title) } React-компонент з fallback
interface ShareButtonProps { url: string title?: string text?: string fallbackCopy?: boolean } function ShareButton({ url, title, text, fallbackCopy = true }: ShareButtonProps) { const [copied, setCopied] = useState(false) const supportsShare = typeof navigator !== 'undefined' && 'share' in navigator const handleShare = async () => { if (supportsShare) { try { await navigator.share({ url, title, text }) } catch (e) { // Користувач скасував — не вважається помилкою if (e instanceof Error && e.name !== 'AbortError') { console.error('Share error:', e) } } return } if (fallbackCopy) { await navigator.clipboard?.writeText(url) setCopied(true) setTimeout(() => setCopied(false), 2000) } } return ( <button onClick={handleShare}> {supportsShare ? 'Поділитися' : copied ? 'Посилання скопійовано' : 'Копіювати посилання'} </button> ) } Як обробити помилки при шарінгу?
Основна помилка — AbortError, коли користувач закриває діалог. Її слід ігнорувати. Інші помилки (наприклад, непідтримуваний тип даних) потрібно логувати і, за необхідності, показувати fallback. У нашому компоненті ми вже обробили AbortError, а інші помилки логуємо. Якщо API недоступне, компонент автоматично перемикається на копіювання посилання.
Коли використовувати fallback для копіювання?
Fallback обов'язковий на всіх десктопних браузерах, крім Chrome і Edge (Windows). Навіть на мобільних пристроях деякі старі версії iOS не підтримують API — для них також потрібен fallback. Ми реалізуємо автоматичне визначення підтримки: якщо navigator.share не існує, копіюємо URL в буфер обміну через navigator.clipboard.writeText().
Процес роботи над інтеграцією під ключ
Ми пропонуємо готове рішення «під ключ» за 2–4 години. Процес включає:
- Аналіз вимог та аудит поточної архітектури шарінгу.
- Проектування: вибір стратегії fallback, визначення підтримуваних даних (текст, URL, файли).
- Реалізація утиліти share з перевірками та обробкою помилок.
- Інтеграція React-компонента (або компонента для іншої бібліотеки — Vue, Angular).
- Тестування на реальних пристроях: мобільні (iOS, Android), десктопні браузери (Chrome, Firefox, Edge, Safari).
- Деплой та моніторинг помилок.
| Етап | Опис | Приблизні трудозатрати |
|---|---|---|
| Аналіз | Аудит поточних кнопок, визначення сценаріїв | 30–60 хв |
| Проектування | Вибір fallback, дизайн API | 15–30 хв |
| Реалізація | Код утиліти та компонента | 60–90 хв |
| Тестування | Перевірка на пристроях | 30–60 хв |
| Деплой | Розгортання та моніторинг | 15–30 хв |
Строки: від 2 до 4 годин залежно від складності (підтримка файлів, кастомний UI). Зв'яжіться з нами, щоб оцінити ваш проєкт та отримати консультацію з інтеграції Web Share API. Ми гарантуємо коректну роботу на всіх підтримуваних браузерах і документуємо код.
Що входить в роботу
Утиліта share з перевіркою підтримки та canShare, React-компонент з fallback (копіювання в буфер), підтримка файлів та зображень за необхідності, обробка AbortError (користувач закрив діалог).
Строк: 2–3 години.
Замовте інтеграцію нативного шарінгу через Web Share API — заощадьте до 95% часу на розробку кастомних кнопок. Отримайте консультацію наших інженерів.







