ttlog

日々の開発で得た知見の技術メモ。モバイルアプリネタが多いです。

SwiftUIで共有メニューを表示する

アプリのコンテンツをメールやSNS等の外部サービスに渡す共有メニューをSwiftUIで表示する方法です。

f:id:tommy10344:20191105213901p:plain

共有メニュー表示用Viewの定義

UIKitではUIActivityViewControllerを使用して表示するこの共有メニューですが、現状SwiftUIで特に専用のViewがある訳ではないようです。 そのため、UIViewControllerRepresentableプロトコルに準拠させる形でUIActivityViewControllerをSwiftUI上に表示出来るようにします。

struct ActivityView: UIViewControllerRepresentable {

    let activityItems: [Any]
    let applicationActivities: [UIActivity]?

    func makeUIViewController(
        context: UIViewControllerRepresentableContext<ActivityView>
    ) -> UIActivityViewController {
        return UIActivityViewController(
            activityItems: activityItems,
            applicationActivities: applicationActivities
        )
    }

    func updateUIViewController(
        _ uiViewController: UIActivityViewController,
        context: UIViewControllerRepresentableContext<ActivityView>
    ) {
        // Nothing to do
    }
}

共有メニュー表示

表示の際はsheet()を使用し、先ほど作成したUIViewControllerRepresentableプロトコルに準拠したViewを返すようにすれば共有メニューが表示されます。

@State private var showActivityView: Bool = false

var body: some View {
    ...
    Button(action: {
        self.showActivityView = true
    }) {
        Image(systemName: "square.and.arrow.up")
    }
    .sheet(isPresented: self.$showActivityView) {
        ActivityView(
            activityItems: ["abc"],
            applicationActivities: nil
        )
    }
    ...
}

参考