【Swift】Share Extensionでデータを取得・操作する方法!

この記事からわかること
- Swiftで共有メニューに表示させる方法
- Share Extensionの使い方
- 送信されたデータを取得する方法
- 画像やテキスト、URLを取得する
- SLComposeServiceViewControllerクラスの役割
- 共有シートのデザインを変更するには?
index
[open]
\ アプリをリリースしました /
環境
- Xcode:15.0.1
- iOS:17.0
- Swift:5.9
- macOS:Sonoma 14.1
この記事は以下の記事の続きです。Share Extensionの導入方法や基盤の作成方法を知りたい方は以下の記事を参考にしてください。
SLComposeServiceViewController継承クラス
Share Extensionのターゲットを追加するとSLComposeServiceViewController
を継承したShareViewController
クラスが自動生成されます。
それぞれのメソッドの役割は以下のとおりです。
- isContentValid:投稿ボタンのバリデーションロジック
- didSelectPost:投稿ボタン押下後の処理
- configurationItems:共有シート下部のリスト管理
isContentValid:投稿ボタンのバリデーションロジック
isContentValid
メソッドでは投稿ボタンがどの条件の時にアクティブでどの条件の時に非アクティブにするかを設定することができます。例えば共有テキストが0文字の場合は非アクティブにする場合self.contentText
で入力文字に参照できるのでそのcount
が0ならfalse
を返すように実装します。
didSelectPost:投稿ボタン押下後の処理
didSelectPost
メソッドでは投稿ボタンを押下した後の処理を行うことができます。まずは投稿されてきたテキストを取得してみます。テキストを取得するには先ほど同様にself.contentText
を参照します。最後に実行するcompleteRequest
メソッドは投稿が成功したことをシステムに通知する役割を持っています。
URLを取得する
URLを取得するには少し複雑になってきます。投稿された情報はextensionContext
プロパティの中にあるので対象のデータを掘り進めて取得する必要があります。詳細なコードの役割はコメントに記述しておきました。
公式リファレンス:hasItemConformingToTypeIdentifier(_:)メソッド
hasItemConformingToTypeIdentifier
メソッドの引数にはタイプ識別子(Uniform Type Identifiers)を渡す必要があります。URLの場合はpublic.url
ですが、UniformTypeIdentifiers
をimportすることで定数UTType.url.identifier
が使えるようになります。
公式リファレンス:UniformTypeIdentifiers
画像(Image)を保存する
URLの画像を取得するにはloadPreviewImage
メソッドを使用して以下のように実装します。
画像単体の場合は以下ですかね。(未検証)
データを保存してアプリ側で取得する
投稿されたデータをiOSアプリ側で受け取るためにはApp Groupsを使用してUserDefaultsに保存して、データを渡す必要があります。
おすすめ記事:【Swift UI】App GroupsでWidgetやアプリ間でデータを共有する方法!
アプリ側ではUserDefaultsからデータを取り出すだけです。
configurationItems:共有シート下部のリスト管理
configurationItems
メソッド内では表示される共有シートの下部に追加でリストなどを追加し、アクションを追加することができます。例えば以下のようにテキストや画像を選択させる行を追加することができます。

UIImagePickerController
の使い方に関しては以下の記事を参考にしてください。
共有シートのデザインをカスタマイズする
共有シートのデザインはある程度であればカスタマイズすることが可能です。しかしタイトルの色を変更する方法が見つけられませんでした。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。