[Swift] iOS の共有メニューに追加できるアプリを作る(その1:アプリが表示されるまで)

共有メニューを使うための方法はわかってますが、共有メニューに共有先アプリとして表示されるための方法を調べたのでメモ。

Appleのドキュメント: App Extension Programming Guide

まず、読むべきはこの Apple のドキュメントです。

上記を読むと、どんなExtensionポイントがあるかが分かります。それぞれの想定される使い方も説明されています。

ここでは、写真を共有する先として自分のアプリが表示できるようにする方法を調査・説明していきます。

読んでみたところ、上記のドキュメントの中では、以下を使うことになります。

  • Share (iOS and MacOS) Post to a sharing website or share content with others

まずは、App Extension の使い方から見ていきます。

App Extension の動作

App Extension と普通のAppはどう違うの??という疑問については、ここで説明されています。

ざっくり説明すると、以下のような手順になってます。(上記ページの絵のまんまです)

  • Host App(共有メニューを表示している側のアプリ) からApp Extensionが選択される
  • System が App Extension を起動する
  • App Extension のコードが実行される
  • System が App Extension を終了させる

Host App と App Extension の間のやりとりは、NSExtensionContext の openURL:completionHandler: で行われます。(NSExtensionContext は、App Extension 専用のクラスです。)

App Extension がデータを受け取ろうとしても、その時点で Host App は動いていないかもしれないので、システム(OS)側で共有リソースを用意してくれます。

App Extension から使える Host App の情報は制限されていて、例えば、shardApplicationには、App Extension からは、アクセスできません。

App Extension 向け Xcode プロジェクトの作成

App Extension 向けプロジェクトは、Xcode でテンプレートを作ってくれますが、ポイントは、App Extension のみのプロジェクトは存在できないということです。

普通にプロジェクトを作ろうとしても App Extension は選択できません。

NewProjectForiOS

例えば、iOS 向けの Single View プロジェクトを作成した後に、App Extension 向けのターゲットを追加することができるようになります。

AppExtension Template

途中で聞かれる App Extension の名前ですが、Apple は、次のような名前を推奨しています。<Containing app name>—<App extension name>

ドキュメントでは、App Extension でのCFBundleDisplayName が共有メニューで表示されると書いてありますが、Xcode11.5 では、App 側のCFBundleDisplayName が表示されています。

# アプリと同名で表示されることで特に困ることはないと思いますが・・・




コードを動作させてみる

この状態で、App Extension の Scheme を Active にして動作させようとすると(⌘-R)、どのアプリ上で動作させるか聞いてきます。Safari がお勧めされたので、そのように指定しました。

Safari の起動を待って、共有メニューを押すと、以下のように、自分の App Extension が表示されることが確認できます。

ScreenShot

テンプレートとして、SLComposeServiceViewController を継承したクラスが用意されているため、メニューを選択すると、以下のような画面が表示されます。

templateShareMenuApp

まとめ:自分で作った App Extension を表示できるようにするまで

アプリのプロジェクトに、Xcode から App Extension のテンプレートを利用してターゲットを追加すると、すぐに表示されるようになります。

今回の説明は以上です。




実際に、App Extension を作るためには、以下のようなことを考える必要があります。
順番に説明していく予定です。

  • 自分のアプリとApp Extension でのコード共有
  • App Extension で使えるAPIの確認
  • Host App と App Extension のデータやりとり

続きの説明は、こちら




2 COMMENTS

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です