ShareLink для Swift: полное руководство с примерами
ShareLink — это встроенная структура в фреймворке SwiftUI, предназначенная для создания кнопок «Поделиться» в приложениях на Swift. Она предоставляет простой и интуитивно понятный интерфейс для интеграции системного листа «Поделиться» (UIActivityViewController) без необходимости писать сложный UIKit-код. Библиотека появилась в iOS 16, macOS 13, tvOS 16 и watchOS 9, и с тех пор стала стандартным способом реализации шаринга контента в современных SwiftUI-приложениях.
Зачем нужна ShareLink? В современном мире пользователи постоянно делятся контентом: ссылками, фотографиями, текстом, файлами. Ручная реализация шаринга требует создания UIActivityViewController, настройки делегатов и обработки различных типов данных. ShareLink берет на себя всю эту работу, предоставляя готовый SwiftUI-компонент, который автоматически адаптируется под платформу и системные настройки. Это не только ускоряет разработку, но и гарантирует единообразный пользовательский опыт на всех устройствах Apple.
Библиотека идеально подходит для: социальных приложений (шаринг постов), новостных агрегаторов (поделиться статьей), фоторедакторов (экспорт изображений), мессенджеров (отправка файлов) и любых других приложений, где требуется функция «Поделиться». ShareLink поддерживает все стандартные типы данных: строки, URL, изображения, файлы и пользовательские элементы, соответствующие протоколу Transferable.
Установка
ShareLink является частью фреймворка SwiftUI, поэтому не требует отдельной установки через пакетные менеджеры. Для использования достаточно импортировать SwiftUI в ваш проект:
import SwiftUI
Минимальные требования:
- iOS 16.0+ / macOS 13.0+ / tvOS 16.0+ / watchOS 9.0+
- Xcode 14.0+
- Swift 5.7+
Если вы используете более старые версии iOS, вам потребуется использовать UIActivityViewController напрямую через UIViewRepresentable.
Быстрый старт
Самый простой способ использовать ShareLink — передать ему строку или URL. Вот минимальный рабочий пример:
import SwiftUI
struct ContentView: View {
var body: some View {
ShareLink(item: URL(string: "https://pythonlib.ru")!) {
Label("Поделиться ссылкой", systemImage: "square.and.arrow.up")
}
.padding()
}
}
Этот код создает кнопку с иконкой «Поделиться». При нажатии открывается системный лист, где пользователь может выбрать приложение для отправки ссылки.
Основные методы и классы
ShareLink предоставляет несколько инициализаторов и модификаторов для настройки. Рассмотрим 8 ключевых возможностей.
1. ShareLink(item:)
Сигнатура: init(item: T, subject: Text? = nil, message: Text? = nil, @ViewBuilder label: () -> Label)
Что делает: Создает кнопку шаринга для одного элемента. Параметр item может быть строкой, URL, изображением или любым типом, соответствующим протоколу Transferable.
ShareLink(item: "Привет, мир!") {
Text("Поделиться текстом")
}
2. ShareLink(items:)
Сигнатура: init(items: [T], subject: Text? = nil, message: Text? = nil, @ViewBuilder label: () -> Label)
Что делает: Позволяет поделиться несколькими элементами одновременно (например, массивом фотографий).
let images = [UIImage(named: "photo1")!, UIImage(named: "photo2")!]
ShareLink(items: images) {
Label("Поделиться фото", systemImage: "photo.on.rectangle")
}
3. ShareLink(item:preview:)
Сигнатура: init(item: T, preview: SharePreview<T>, @ViewBuilder label: () -> Label)
Что делает: Добавляет кастомный превью для шаринга. Позволяет задать заголовок, иконку и изображение, которые будут отображаться в системном листе.
let url = URL(string: "https://pythonlib.ru")!
let preview = SharePreview("PythonLib", image: Image(systemName: "book.fill"))
ShareLink(item: url, preview: preview) {
Text("Поделиться сайтом")
}
4. ShareLink(item:subject:message:)
Сигнатура: init(item: T, subject: Text?, message: Text?, @ViewBuilder label: () -> Label)
Что делает: Позволяет задать тему письма (subject) и тело сообщения (message) для почтовых клиентов и мессенджеров.
ShareLink(
item: "Отличная статья о Swift!",
subject: Text("Рекомендую прочитать"),
message: Text("Посмотри эту статью, она очень полезная")
) {
Text("Поделиться")
}
5. .shareSheet(isPresented:content:)
Сигнатура: func shareSheet(isPresented: Binding<Bool>, content: () -> ShareSheetContent) -> some View
Что делает: Модификатор для программного вызова системного листа без использования кнопки. Полезно для автоматического шаринга после выполнения действия.
@State private var showShare = false
Button("Автошаринг") {
showShare = true
}
.shareSheet(isPresented: $showShare) {
ShareSheetContent(item: "Автоматический шаринг!")
}
6. ShareLink(item:data:uti:)
Сигнатура: init(item: T, data: Data, uti: UTType, @ViewBuilder label: () -> Label)
Что делает: Позволяет поделиться бинарными данными с указанием типа UTI (Uniform Type Identifier). Используется для кастомных файлов.
let jsonData = try! JSONEncoder().encode(["key": "value"])
ShareLink(
item: "data.json",
data: jsonData,
uti: .json
) {
Text("Экспорт JSON")
}
7. ShareLink(item:image:)
Сигнатура: init(item: T, image: Image, @ViewBuilder label: () -> Label)
Что делает: Упрощенный способ шаринга изображения. Параметр image — это SwiftUI Image, который будет передан в системный лист.
let myImage = Image("logo")
ShareLink(item: myImage) {
Label("Поделиться логотипом", systemImage: "photo")
}
8. ShareLink(item:url:)
Сигнатура: init(item: T, url: URL, @ViewBuilder label: () -> Label)
Что делает: Позволяет поделиться URL вместе с дополнительным контентом. Полезно, когда нужно отправить ссылку и сопутствующий текст.
let articleURL = URL(string: "https://pythonlib.ru/article1")!
ShareLink(item: "Прочитай эту статью!", url: articleURL) {
Text("Поделиться статьей")
}
Реальный практический пример
Создадим полноценное приложение для шаринга статей с кастомным превью и поддержкой нескольких платформ.
import SwiftUI
import UniformTypeIdentifiers
struct Article: Identifiable, Transferable {
let id = UUID()
let title: String
let description: String
let url: URL
let imageName: String
static var transferRepresentation: some TransferRepresentation {
CodableRepresentation(contentType: .article)
}
}
extension UTType {
static let article = UTType(exportedAs: "com.pythonlib.article")
}
struct ArticleShareView: View {
let article: Article
var body: some View {
VStack(spacing: 20) {
// Превью статьи
VStack(alignment: .leading, spacing: 10) {
Image(systemName: article.imageName)
.font(.system(size: 60))
.foregroundColor(.blue)
Text(article.title)
.font(.title)
.fontWeight(.bold)
Text(article.description)
.font(.body)
.foregroundColor(.secondary)
}
.padding()
.background(Color.gray.opacity(0.1))
.cornerRadius(12)
// Кнопки шаринга
VStack(spacing: 15) {
// 1. Простой шаринг URL
ShareLink(item: article.url) {
Label("Поделиться ссылкой", systemImage: "link")
}
.buttonStyle(.bordered)
// 2. Шаринг с кастомным превью
let preview = SharePreview(
article.title,
image: Image(systemName: article.imageName)
)
ShareLink(item: article.url, preview: preview) {
Label("Поделиться с превью", systemImage: "eye")
}
.buttonStyle(.borderedProminent)
// 3. Шаринг текста с темой
ShareLink(
item: article.description,
subject: Text("Рекомендую: \(article.title)"),
message: Text("Посмотри эту статью: \(article.url.absoluteString)")
) {
Label("Поделиться текстом", systemImage: "text.alignleft")
}
.buttonStyle(.bordered)
// 4. Шаринг как Transferable объект
ShareLink(item: article) {
Label("Поделиться статьей", systemImage: "doc.text")
}
.buttonStyle(.bordered)
// 5. Программный вызов
Button("Автоматический шаринг") {
shareArticle()
}
.buttonStyle(.borderedProminent)
}
}
.padding()
.navigationTitle("Шаринг статьи")
}
func shareArticle() {
// Здесь можно вызвать системный лист программно
// через UIActivityViewController или другой механизм
print("Шаринг статьи: \(article.title)")
}
}
// Пример использования
struct ContentView: View {
let sampleArticle = Article(
title: "SwiftUI Guide",
description: "Полное руководство по SwiftUI для начинающих и профессионалов",
url: URL(string: "https://pythonlib.ru/swiftui-guide")!,
imageName: "swift"
)
var body: some View {
NavigationStack {
ArticleShareView(article: sampleArticle)
}
}
}
#Preview {
ContentView()
}
Советы по производительности и типичные ошибки
Производительность
- Кэшируйте превью: Если вы часто делитесь одним и тем же контентом, создавайте SharePreview один раз и переиспользуйте его.
- Избегайте больших данных: Для изображений и файлов используйте сжатие перед передачей в ShareLink. Например, уменьшайте разрешение фото до 1920px.
- Асинхронная загрузка: Если контент загружается из сети, используйте Task и async/await, чтобы не блокировать UI.
- Минимизируйте Transferable: При создании кастомных Transferable-объектов старайтесь, чтобы они были легковесными и не содержали избыточных данных.
Типичные ошибки
- Забыли импортировать SwiftUI: Без импорта компилятор не найдет ShareLink. Всегда добавляйте
import SwiftUI. - Неправильный тип данных: ShareLink принимает только типы, соответствующие Transferable. Для UIImage нужно использовать Image или Data.
- Игнорирование опциональности: URL и другие параметры могут быть nil. Всегда проверяйте их перед передачей.
- Отсутствие обработки ошибок: Некоторые действия (например, шаринг файла, который был удален) могут вызывать ошибки. Используйте do-catch.
- Платформенные ограничения: ShareLink не работает на iOS 15 и ниже. Для поддержки старых версий используйте UIActivityViewController.
- Забыли про preview: Без кастомного превью системный лист может отображать неинформативный заголовок.
Ссылки
- Официальная документация Apple
- GitHub репозиторий Swift
- WWDC 2022: Meet ShareLink
- Hacking with Swift: ShareLink tutorial
ShareLink — это мощный и элегантный инструмент для добавления функции «Поделиться» в ваши SwiftUI-приложения. Он избавляет от необходимости писать тонны UIKit-кода и обеспечивает нативную интеграцию с экосистемой Apple. Надеемся, это руководство поможет вам эффективно использовать его в ваших проектах!
Также в библиотеке
Ktor Client для Kotlin: полное руководство с примерами
Конфигурация приложений Node.js: лучшие инструменты и подходы
Реактивное программирование в TypeScript: библиотека RxJS