Open9

Swift: Mail Extensionsを作成したら何となく使えているが、よく分からない件

kabeyakabeya

Apple Mailの機能拡張を作りました。
何となく使えています。自分用としては満足(内容は秘密です!)
ですが、これがよく分かってない。

あまり情報がないのです。

https://developer.apple.com/wwdc21/10168/

というビデオがあり、そのサンプルプログラムが以下でダウンロードできるのですが、それぐらいしか情報がない。

https://developer.apple.com/documentation/mailkit/build_mail_app_extensions

サンプルをビルドして、ほんでどうするの?ってなります。

色々やっていた結果、XcodeからArchiveすると、Mail.appの機能拡張のところにいつのまにか入る、ということが分かりました。

あと自分のプロジェクトを作るときに、まず、ビデオの5分過ぎぐらいのところにあるXcodeのプロジェクトの「macOS→Application Extensions→Mail Extension」が、Xcodeで出てこないところではまります。

よくよく説明を理解すると「既存のmacOS Appのプロジェクトに新しいターゲットとして追加しろ」ということなんですね。なんだよ「既存のmacOS App」って?ってなります。

仕方ないのでダミーのmacOS Appのプロジェクトを作って、新しいターゲットとして「macOS→Application Extensions→Mail Extension」を追加する。

ちょこちょこっとコードを書いて、サンプルと同じようにArchiveすると、Mail.appの機能拡張タブに現れる。
これどういう仕組みなのか知りたいです。どこからMail.appは探してきたのか。

いくつか知りたいことがありますが、なんか回答探すのが大変そうです。

  • Extensionに設定値を付けるとしたときのUIはどうやって作るのか
  • デバッグしたいんですけども…
  • 仮に配布するとしたらどうやって配布してどうやってインストールするのか
  • App Storeでも売ってるように見えるけども(ほとんどない、もう1〜2個しかないんじゃないかという感じですが)、これはどうやって売るのか。買ったらどうなるのか(←買ってみればよいという気もしますけども)

あれかな、Safariの機能拡張のことを調べると、ある程度分かるのかな。

kabeyakabeya

色々やっていた結果、XcodeからArchiveすると、Mail.appの機能拡張のところにいつのまにか入る、ということが分かりました。

違いました。
もうビルドした瞬間に現れます。
もとのプロジェクトのAppをゴミ箱に入れると消え、ゴミ箱から別の場所に移動しても現れます。
ファイルシステムを監視しているのかしら。

kabeyakabeya

なので?Appで設定させて、そのデータをExtensionで読めば良い、という感じでしょうかね。
Appをダウンロードした瞬間にMail.appは、そこに埋め込まれたExtensionを認識します。

デバッグはなんかできない気がします。
そして、App StoreではAppを売る、という感じなんでしょうね。

kabeyakabeya

デバッグはなんかできない気がします。

デバッグできましたね。XcodeでMail.appにアタッチする感じで、デバッグできます。
これなら色々できますね。

kabeyakabeya

App側でUserDefaultsに書いたら、Extension側でそれを取れるかと思いましたが、取れませんでした。
Mail.appのが取れてしまう気もちょっとします。
よくよく考えると危ない仕組みかも知れません。

kabeyakabeya

少なくともUserDefaults.standardにはMail.appのものらしき値は入ってないですね。
少し安心。

kabeyakabeya

UserDefaults(suiteName:)でやっても取れませんね。
どうすっかな。

kabeyakabeya

UserDefaults(suiteName:)でやっても取れませんね。

これやるには、そもそもAppleにApp Groupsというのを登録しないといけないように見えます。
話がちょっと大がかりですが、まあやってみましょうか。

kabeyakabeya

AppとExtensionの両方のターゲットのCapabilitiesにApp Groupsを設定しないとダメ、ということに気付かずちょっとあれでしたが、できました。

いいですね。