iOS 16.0 부터는 ShareLink 를 제공하여 SwiftUI 자체적으로 공유 Sheet 를 사용할 수 있게 되었습니다
iOS 16 이전에는 UIViewControllerRepresentable 이 존재하여 UIViewControllerRepresentable 로 대체 구현이 가능했습니다.
ShareLink 간단한 사용법
var body: some View {
ShareLink(item: URL(string: "https://developer.apple.com/xcode/swiftui/")!)
ShareLink(item: URL(string: "https://developer.apple.com/xcode/swiftui/")!) {
Label("Share", image: "MyCustomShareIcon")
}
}
- ShareLink 의 간단한 사용법으로는 위처럼 공유할 데이터를 item 파라미터에 넣어줍니다.
- 추가로 클로저 내부에 원하는 UI 를 따로 제공할 수도 있습니다.
ShareLink 더 알아보기
ShareLink 를 사용하여 커스텀 데이터 또한 내보낼 수 있습니다.
대신 해당 데이터가 Transferable 프로토콜을 준수해야 합니다.
Transferable 이란?
Transferable 프로토콜은 데이터를 앱 내에서 공유하거나 다른 앱으로 전송할 때 사용되는 프로토콜입니다. 여러 프레임워크 타입이 이미 이 프로토콜을 따르고 있으며, 예를 들어 URL 같은 타입은 기본적으로 Transferable을 따릅니다. 뿐만 아니라, 개발자는 자신의 커스텀 타입을 만들 때도 이 프로토콜을 채택하여 데이터를 공유할 수 있습니다.
공유 가능한 데이터 만들기
🟢 기존적으로 Transferable 데이터는 바로 사용 가능하지만 특정 데이터는 직접 공유 가능한 데이터로 만들어야 할 수 있습니다
🍎 애플은 공식 문서에서 사진을 공유할 수 있는 구조체 코드를 구현해 제공하고 있습니다.
struct Photo: Transferable {
static var transferRepresentation: some TransferRepresentation {
ProxyRepresentation(\.image)
}
public var image: Image
public var caption: String
}
- 커스텀 Photo 구조체를 만들어 Transferable 프로토콜을 준수하도록 만들었습니다.
- transferRepresentation 이란 이 속성은 어떤 형태로 데이터를 전송할지 정의하는 역할을 합니다.
- ProxyRepresentation 이란 Transferable 타입을 프레임워크 타입으로 변환하는 데 사용됩니다.
위의 코드에서는 Photo 타입에서 정의한 image 속성을 사용해 Transferable을 구현하고 있습니다.
- ProxyRepresentation 이란 Transferable 타입을 프레임워크 타입으로 변환하는 데 사용됩니다.
ShareLink 로 데이터 공유하기
🔵 ShareLink 를 사용하면 원하는 데이터를 공유할 수 있습니다.
🍎 애플은 공식 문서에서 사진을 공유할 수 있는 기본적인 예시 ShareLink 코드를 구현해 제공하고 있습니다.
struct PhotoView: View {
let photo: Photo
var body: View {
photo.image
.toolbar {
ShareLink(
item: photo,
preview: SharePreview(
photo.caption,
image: photo.image))
}
}
}
위 코드에서 ShareLink 에는 2가지 파라미터값이 들어가게 됩니다.
- item: 공유할 데이터를 넣습니다. (Transferable 프로토콜을 준수해야 합니다)
- preview: SharePreview 를 사용하여 데이터를 공유하기 전에 공유할 데이터를 미리 사용자한테 보여줍니다.
ShareLink 종류 파악하기
이 외에도 매우 많은 ShareLink 사용 방법들이 많습니다.
단일 데이터 공유하기
- 데이터를 공유하기 위한 공유 인터페이스를 제공하는 인스턴스를 만들어냅니다.
- item: Transferable 를 준수하는 데이터입니다.
- subject: 제목으로 공유 대상이 이메일, 메시지 앱 등일 때 이 필드들이 미리 채워집니다.
- message: 메시지로 공유 대상이 이메일, 메시지 앱 등일 때 이 필드들이 미리 채워집니다.
preview 로 데이터 공유하기 전에 확인하기
init(_:item:subject:message:preview:)
- 데이터를 공유하기 전에 공유 인터페이스에서 데이터를 미리 확인할 수 있습니다.
- preview: 사용자한테 제공할 데이터 미리보기 SharePreview 가 들어갑니다.
ShareLink(item: photo, subject: Text("Title"), message: Text("Check this out!"), preview: SharePreview("이미지를 제공합니다"))
ShareLink(item: photo,
subject: Text("Title"),
message: Text("Check this out!"),
preview: SharePreview(
photo.caption,
image: photo.image))
여러 데이터 공유하기
- 여러 데이터를 공유하기 위한 공유 인터페이스를 제공하는 인터페이스를 만들어냅니다.
preview 로 여러 데이터 공유하기 전에 확인하기
init(_:items:subject:message:preview:)
- 여러 데이터를 공유하기 전에 공유 인터페이스에서 데이터를 미리 확인할 수 있습니다.
ShareLink("Share Photos", items: [photo, photo], subject: Text("Title"), message: Text("Check these out!"), preview: { item in
SharePreview(item.caption, image: item.image)
})
SharePreview 로 공유 인터페이스 미리보기 만들기
SharePreview 를 활용하면 공유 인터페이스에서 사용자한테 미리 데이터에 대한 설명 등을 제공할 수 있습니다.
SharePreview(titieKey: LocalizedStringKey, image: Transferable, icon: Transferable))
titleKey: 사용자한테 보여줄 Text 를 의미합니다.
image: 사용자한테 보여줄 image 를 의미합니다. Transferable 프로토콜을 준수해야 합니다.
icon: 사용자한테 보여줄 icon 을 의미합니다. Transferable 프로토콜을 준수해야 합니다. (아직 어떻게 사용되는지 파악안됐습니다..)
'SwiftUI' 카테고리의 다른 글
WidgetKit - UserDefault 로 위젯과 앱 데이터 공유하기 (0) | 2024.10.23 |
---|---|
WidgetKit 에서 SwiftData 로 저장된 데이터 사용하기 (0) | 2024.10.22 |
SwiftUI - 드래드 기능 On Off 할 수 있게 만들기 (0) | 2024.10.11 |
프로그래머스 - 최댓값과 최솟값 (0) | 2024.10.10 |
WWDC 20 - Meet WidgetKit (위젯 도입) (19) | 2024.10.09 |