システム開発部のTです!
ShareExtensionの話をします。
ShareExtension自体は、だいぶ以前からある機能ですが、今回利用する機会がございまして、
いろいろつまずいた点なんかも含めて、記事に上げていければと思います。
今回は、ミニマムな実装でShareExtensionを組んでいき、どういう感じで実装できるのか?
というのを実感してもらいたいと思います。
多分、これなら初めて実装する方にも受け入れてもらえるかと思います。
本件の後半で、私自身がつまづいた箇所も含めて気をつけるべき箇所も説明できればと思います。
実装内容
ブラウザの共有機能を利用したとき、共有先に自身のアプリを出せるように実装します。
ブラウザの共有をタップすると、共有先にサンプルアプリ「TestappExtensions」が表示されるところまでを実装してみましょう。

1.メインプロジェクトを生成
まずは、普通にアプリのプロジェクトを生成していきます。
普通に作成するだけとはいえ、省略すると混乱する方もいるかと思うので、省略無しでいきたいと思います。
・「Create a new project」押下

・「App」を選択

・メインプロジェクト名を設定
ProductNameに「TestappExtensions」(名前は任意でOK)と入れて「Next」押下

・任意のディレクトリに保存し、Xcode起動
その際、以下のようにファイルが配置されることを確認してください。
ここまでの手順で特別なにかするようなことがなければ、以下のようになっているはずです。

次から、サブプロジェクトを作成していくことになります。
2.ShareExtension用のサブプロジェクトを生成
共有元のアプリから共有機能で起動させるための画面は、ここで生成するサブプロジェクトが役割を担っています。
そのため、これを生成しないとアプリをインストールしたとしても、共有メニューに表示されないため、必ず実装する必要があります。
・File-New-Targetを起動する

・メニューより、「iOS」タブを選択し、「ShareExtension」を選択後「Next」を押下

・サブプロジェクト名を設定
ProductNameに「TestappShareExtension」(名前は任意でOK)と入力し、「Finish」を押下

・サブプロジェクトが生成される

・サブプロジェクト側のInfo.plistを確認
サブプロジェクト作成後、デフォルトで以下の設定が入っているかと思います。
実際は、以下の設定箇所をカスタマイズしていく必要がありますが、本件ではそのままの設定でお願いします。
(※リリース時「TRUEPREDICATE」のままだと、審査時にリジェクトになるようです)

以上で、ShareExtension用のサブプロジェクトの作成は終了です。
次はアプリを実際にインストールして、動作確認していきたいと思います。
3.アプリのインストール
これからアプリをインストールしていきます。
インストール先はシミュレーターになりますが、実機でも同じかと思いますので、ここでは割愛させてください。
・ターゲットの切り替え
サブプロジェクト作成直後、以下のように「TestappShareExtension」が選択されていると思います。

ここはメインプロジェクトである「TestappExtensions」に切り替えてから、「▶」ボタンを押下してください。

・アプリ起動を確認
当然、画面的に実装していないので、空画面が起動される。
起動できたことを確認できればOK。

ここまででShareExtensionの動作確認するための準備ができました。
以降、動作確認のための手順を説明していきます。
4.ShareExtensionの動作確認
・ターゲットをサブプロジェクトに切りかえて実行
Xcodeに戻って、今度はターゲットをサブプロジェクト「TestappShareExtension」に切り替えて、「▶」ボタンを押下してください。

・共有元のアプリを起動
実行すると、共有元アプリの選択が出ますので、今回はSafariを選択して「Run」してください。

・ブラウザアプリの共有ボタンを押下

・共有先に本件のアプリが表示されること

いかがでしょうか。
何も実装していないミニマムでの起動でしたが、皆さんは表示されましたでしょうか?
表示されない!っていうトラブルが発生した方、以降をご確認いただければと思います。
トラブルシューティング
ここまでミニマムで実装しても、共有先に表示されない!っていう人もいるかと思います。
実は私もその一人でした。
では、表示されないっていう場合、以下を注意して、解決してみていただければと思います。
1.メインターゲットのインストール忘れ
当然ですが、メインターゲットがインストールされていないと、共有するときの共有先にアプリは表示されません。
当たり前じゃん!ってお思いの方いるかと思いますが、私はこの罠にひっかかりました・・・。
例えば、本件で紹介した実装手順にて、「1.メインプロジェクト生成」〜「4.ShareExtensionの動作確認」までの一連の流れで、「3.アプリのインストール」を失念するというものです。
要するに、サブプロジェクトに切り替えて実行するときに、普通にブラウザが起動するだけなので、初めて実装したときは、メインプロジェクトもそのタイミングで自動的にインストールされると思い込んでいたのが間違いの原因でした。
ここでは、必ず「3.アプリのインストール」を実施してから、動作確認を行うようにしてください。
2.サブターゲットのインストール忘れ
サブターゲットのインストール忘れも原因に上がるかと思いますが、そもそもサブターゲットのインストール忘れって?っと思われた方もいるのでは?
これも「1.メインターゲットのインストール忘れ」と同義になります。
つまり、メインターゲットをビルド&インストールすることで、サブターゲットも同時にインストールされます。
なので、本来はインストール忘れは起こらないのでは?とお思いになると思いますが、結構これも罠にハマるポイント。
サブターゲットのほうをトライアンドエラーで改修していると、改修のたびに実行しながら起動確認することもありますよね?そのときに、サブターゲットを改修後、メインターゲットでビルド&インストールする必要があるにも関わらず、それをすっ飛ばしてShareExtensionでの起動してしまうと、本件の事象に悩まされるかと思います。結果的にShareExtension側がビルド前の状態であるため、改修が反映されていないじゃん!ってことになるんです。
本件で紹介した実装手順を例に出すと、「1.メインプロジェクト生成」〜「4.ShareExtensionの動作確認」までの一連の流れで、「2.ShareExtension用のサブプロジェクト作成」と「3.アプリのインストール」の手順を入れ替わってしまった場合、本件の事象が発生してしまいます。
「1.メインプロジェクト生成」で一旦アプリをインストールして動作確認してしまったときに、サブプロジェクト作成後にメインプロジェクトのインストール忘れすると、本件のトラブルに悩むことになるかと思います。
サブプロジェクトを生成or更新後は、必ずメインプロジェクトのビルド&インストールは実行するように心がけましょう。
さいごに
いかがだったでしょうか。
今回は実装箇所を極力除いたミニマムでの状態でShareExtensionの機能を実装してみました。
私自身が悩んだところも含めて記載していきましたが、皆さんのお悩みを解決するための助力となることができれば幸いです。
これから、必要であれば随時追記していければと思っております。