ShareLink для Swift: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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: Без кастомного превью системный лист может отображать неинформативный заголовок.

Ссылки

ShareLink — это мощный и элегантный инструмент для добавления функции «Поделиться» в ваши SwiftUI-приложения. Он избавляет от необходимости писать тонны UIKit-кода и обеспечивает нативную интеграцию с экосистемой Apple. Надеемся, это руководство поможет вам эффективно использовать его в ваших проектах!

Рекомендаций