はじめに
ここでは SwiftUI で共有画面を作成する方法を解説します。
SwiftUI では、iOS16 から ShareLink 構造体がありますが、iOS15 以前は SwiftUI のネイティブサポートはありませんでした。そのため、開発者は代替アプローチを使用する必要があります。
ここでは、iOS16 と 1OS15 以前の2通りで共有画面を作成する方法を解説します。
開発環境
- Xcode15
- Swift 5.10
iOS 16以降
iOS16 から、Apple は ShareLink という新しい View を導入しました。これにより、共有画面のプレセンテーションを簡単に作成するようになりました。
body 内に、ShareLink
を使い、引数に共有したい任意の item を入れてあげれば完成します。
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
// iOS 16
let shareText = "iOS 16 or later shareItem"
+ ShareLink(item: shareText) {
HStack {
Image(systemName: "square.and.arrow.up")
Text("iOS 16 or later")
}
}
}
.padding()
}
}
#Preview {
ContentView()
}
ShareLink については以下の記事がとてもわかりやすく書かれているので、詳細はこちらの記事を参考にすると良いと思います。
iOS 15 以前
iOS 15 以前の SwiftUI では、ShareLink のような簡単に共有シートを作成する API はありません。そのため、UIKit の UIActivityViewController
を使って作成します。
import UIKit
struct ShareView {
static func showShareScreen(item: [Any]) {
let activityVC = UIActivityViewController(
activityItems: item,
applicationActivities: nil
)
let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
windowScene?.windows.first?.rootViewController?.present(activityVC, animated: true)
}
}
上記のコードは、item という [Any]
型を引数として取り扱います。これにより、任意のタイテム(URL, テキスト、画像など)を共有することを目的にしています。
UIActivityViewController
は iOS の共有画面を表示する ViewController です。これは引数を元に作成されます。
windowScene
では、iOS のメインウィンドを取得しています。UIApplication.shared.connectedScenes
で現在、接続されているすべてのシーンを取得し、first
プロパティで最初のシーンを取得します。これを UIWindowScene
にキャストしています。
次に、取得した WindowScene の最初の Window の rootViewController を通じて、UIActivityViewController
をモーダルとして表示します。
これは以下のようにして使うことができます。
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Button {
+ let shareText = "iOS 15 or earlier shareItem"
+ ShareView.showShareScreen(item: [shareText])
} label: {
Image(systemName: "square.and.arrow.up")
}
}
.padding()
}
}
#Preview {
ContentView()
}
最後に
サンプルコードを使ったリポジトリを公開しているので、よかったらスターください。
参考