ShareLink iOS14 for SwiftUI

本软件包提供了一个 SwiftUI 视图 ShareLinkButton,可以用于分享各种数据类型。

为什么苹果已经提供了开箱即用的 ShareLink,我还要开发 ShareLink 软件包?!

在我进行 SwiftUI 项目的经验中,我注意到在不同的 iOS 版本上实现分享链接功能存在差距。虽然 Apple 在 iOS 16 中引入了 ShareLink API,但很大一部分用户和项目仍然在使用较早的版本,例如 iOS 15 甚至 iOS 14。考虑到许多应用程序至少还需要几年时间才能停止支持这些早期版本。这种需求促使我开发了一个软件包,它提供了与 ShareLink 类似的功能,但与较早的 iOS 版本兼容。

SwiftUI 示例

特性

ShareLinkButton Example

API

ShareLinkButton 结构体

@available(iOS 14.0, *)
public struct ShareLinkButton<Label: View>: View {
    public init<T: Transportable>(
        item: T,
        icon: UIImage? = nil,
        title: String? = nil,
        printAction: Bool = true,
        applicationActivities: [UIActivity]? = nil,
        excludedActivityTypes: [UIActivity.ActivityType]? = nil,
        @ViewBuilder label: @escaping () -> Label
    )
    
    public init(
        itemSource: UIActivityItemSource,
        applicationActivities: [UIActivity]? = nil,
        excludedActivityTypes: [UIActivity.ActivityType]? = nil,
        @ViewBuilder label: @escaping () -> Label
    )
}

支持的 Transportable 类型

使用示例

使用 String 的基本用法

ShareLinkButton(item: "Hello, world!", label: {
    Text("Share Text")
})

使用自定义图标和标题的高级用法

ShareLinkButton(item: URL(string: "https://example.com")!, icon: UIImage(systemName: "link"), title: "Check this out!", label: {
    HStack {
        Image(systemName: "square.and.arrow.up")
        Text("Share URL")
    }
})

分享 CLLocation

let location = CLLocation(latitude: 37.7749, longitude: -122.4194) // Coordinates for San Francisco

ShareLinkButton(item: location, label: {
    Text("San Francisco location")  
})

自定义

按钮外观可以通过标签闭包进行自定义,从而可以与宿主应用程序的设计系统集成。此外,开发者可以指定自定义活动或排除某些活动类型,以根据应用程序的需求定制分享体验。

SwiftUI 中的 ShareLinkButton 允许开发者通过提供自己的 UIActivityItemSource 来定制分享体验。 此接口可以精确控制共享的数据及其格式,具体取决于用户选择的活动类型。

  1. 定义自定义 UIActivityItemSource:首先创建一个符合 UIActivityItemSource 协议的类。 此类将指定激活共享表单时要共享的数据。
import UIKit

class CustomItemSource: NSObject, UIActivityItemSource {
    let text: String
    let url: URL

    init(text: String, url: URL) {
        self.text = text
        self.url = url
    }

    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return text
    }

    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        return text
    }

    func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
        return "Custom Subject"
    }

    func activityViewController(_ activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: UIActivity.ActivityType?) -> String? {
        return "public.url"
    }

    func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivity.ActivityType?, suggestedSize size: CGSize) -> UIImage? {
        return UIImage(systemName: "link.circle")
    }
}
  1. 在 ShareLinkButton 中使用自定义活动项源
let source = CustomItemSource(
    text: "Check out this amazing website!",
    url: URL(string: "https://www.example.com")!
)

ShareLinkButton(item: source) {
    Label("Share", systemImage: "square.and.arrow.up")
}

许可证

本软件包采用 MIT 许可证。 更多详情请参阅 LICENSE 文件。