【Swift】共有メニューにアプリを表示させる方法!Share Extensionの使い方
この記事からわかること
- Swiftで共有メニューに表示させる方法
- Share Extensionの使い方
- 送信するデータに制限を設定する方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:15.0.1
- iOS:17.0
- Swift:5.9
- macOS:Sonoma 14.1
共有メニューにアプリを表示させる方法
Swiftで開発できるiOSアプリではSafariなどから共有する際に自身のiOSアプリを表示させることが可能です。これにより例えばSafariで表示しているWebサイトの情報をアプリへ送ることができます。
逆にiOSアプリからデータを他のアプリなどに共有することもできるのでこちらの実装方法は以下の記事を参考にしてください。
Share Extensionとは?
iOSアプリを共有メニューに表示させてデータを送るにはApp Extensionで提供されている機能の1つであるShare Extensionを使用します。
App Extensionとはその名の通りアプリの機能を拡張するための機能のことです。アプリの領域を超えて、ユーザーが他のアプリやシステムと利用しているときにカスタム機能やコンテンツを利用できるようになります。具体的にはWebブラウザからSNSサービスへ投稿できるようにしたり、ホーム画面などに設置できるWidget機能、Apple Watchとの連携などが実装できるようになります。
数あるApp Extensionのなかで「WebブラウザからSNSサービスへ投稿」機能を実装するために使用するのがShare Extensionになります。実際に開発する際にはShare Extension用のターゲットをプロジェクトに新規で追加し、SLComposeServiceViewController
を継承したViewControllerクラスでデータを受け取ります。
実装方法
ここからは実際にShare Extensionをプロジェクトに導入してみたいと思います。
1.Targetの追加
まずはXcode上部メニュー「File」>「New」>「Target..」から「Share Extension」を探して「Next」をクリックします。
プロダクト名を決めて「Finish」をクリックすると「プロジェクト名のスキームを有効にしますか?」と問われるので「Activate 」しておきます。
ターゲットが追加され、SLComposeServiceViewController
を継承したShareViewController
クラスファイルなどが生成されます。
2.App GroupsとKeychain Sharingの設定
続いて異なるターゲット間でデータを共有するためにApp GroupsとKeychain Sharingを設定していきます。iOSアプリ側のターゲットと追加したターゲットの両方にCapabilitiesからそれぞれを追加してください。追加できたらこのプロジェクト共有のApp Groupsを作成して、両者ともチェックを入れておいてください。グループ名はgroup. + Bundle Identifier
形式にすればOKです。
おすすめ記事:【Swift UI】App GroupsでWidgetやアプリ間でデータを共有する方法!
3.ビルドして確認
これでひとまず共有メニューに表示してデータを送信するための基盤が出来上がりました。ビルドターゲットを新規作成したShareExtensionに変更してビルドを実行してみます。起動させるアプリを選択できるので「Safari」を選択して「Run」をクリックします。
シミュレーターが起動してSafariが立ち上がるので共有マークをクリックすると該当のアプリが以下のように表示されます。
ここでアプリをクリックすると以下のようにWebページのタイトルと「投稿」ボタンが表示され、ボタンをクリックするとアプリにデータが送信される仕組みです。
4.送信できるデータを制限する
送信できるデータはInfo.plistにキーを追加することで制限をかけることができます。Share Extension側の「Info.plist」の中身を見てみると以下のようになっています。
このNSExtension
>NSExtensionAttributes
のなかでルールを指定していきます。デフォルトではNSExtensionActivationRule
にTRUEPREDICATE
が渡されているので全てのデータを許可している状態になります。
ルールを追加するにはNSExtensionActivationRule
のTypeをDictionary
に変更して中にルールを追加します。
Key | 説明 |
---|---|
NSExtensionActivationSupportsAttachmentsWithMaxCount | 添付ファイルの最大数 |
NSExtensionActivationSupportsAttachmentsWithMinCount | 添付ファイルの最小数 |
NSExtensionActivationSupportsFileWithMaxCount | ファイル全般の個数 |
NSExtensionActivationSupportsImageWithMaxCount | 画像の最大数 |
NSExtensionActivationSupportsMovieWithMaxCount | 動画の最大数 |
NSExtensionActivationSupportsText | テキストを許可するか |
NSExtensionActivationSupportsWebURLWithMaxCount | URLの最大数 |
NSExtensionActivationSupportsWebPageWithMaxCount | Webページの最大数 |
例えば「テキストを許可して画像1枚だけ」の場合は以下のようになります。
次回は送信されたデータをアプリ内から操作する方法をまとめていきます。
参考文献
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。