2
4

はじめに

ここでは SwiftUI で共有画面を作成する方法を解説します。

SwiftUI では、iOS16 から ShareLink 構造体がありますが、iOS15 以前は SwiftUI のネイティブサポートはありませんでした。そのため、開発者は代替アプローチを使用する必要があります。
ここでは、iOS16 と 1OS15 以前の2通りで共有画面を作成する方法を解説します。

開発環境

  • Xcode15
  • Swift 5.10

iOS 16以降

iOS16 から、Apple は ShareLink という新しい View を導入しました。これにより、共有画面のプレセンテーションを簡単に作成するようになりました。
body 内に、ShareLink を使い、引数に共有したい任意の item を入れてあげれば完成します。

ContentView.swift
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 をモーダルとして表示します。

これは以下のようにして使うことができます。

ContentView.swift
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()
}

最後に

サンプルコードを使ったリポジトリを公開しているので、よかったらスターください。

参考

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4