iOSのデフォルトメールアプリを作ってみた

この記事は、株式会社 [ACCESS Advent Calendar 2023](https://qiita.com/advent-calendar/2023/access) の21日目の記事です。

こんにちは、メールアプリ [CosmoSia](https://cosmosia.net) の開発をしている @takuyakaneko です。
この記事では、iOS版CosmoSiaがデフォルトのEメールクライアントに対応するまでに行ったことを紹介します。

# iOSにおけるデフォルトアプリ

iPhoneを利用しているけどブラウザはChromeを利用したい、なんてことありますよね？
このようなユーザーの要望に応えるために、iOS14よりユーザーがデフォルトのWebブラウザやEメールクライアントを選択することができるようになりました。
Androidでは9から同様の機能を提供しており、iOSも追従してきた形ですね。

# デフォルトのEメールクライアントになるとできること

メールアプリもiOS上では他のアプリと扱いに変わりはなく、インストールするだけで普通にメールの送受信を行うことができます。では、デフォルトのEメールアプリになるとなにがうれしいのでしょうか？

それは、iOSにプリインストールされている "メール" アプリと同様に動作できるようになることです。
例えば、以下のような動作が挙げられます。

* 連絡先アプリでメールアドレスをタップした際に、アプリが起動する
* ブラウザ等で `mailto:` スキームのURLをタップした際にアプリが起動する

これにより、プリインストール済みの "メール" アプリの代替として使用することができ、アプリの起動率が向上することを期待できます。

# デフォルトのEメールクライアントになるまでの手順

デフォルトのEメールクライアントとして選択できるようになるまでに必要な実装や手続きについて説明します。

## デフォルトのEメールクライアントの要件

アプリをデフォルトのWebブラウザやEメールクライアントとして選択できるようにするには、Appleの定める要件を満たす必要があります。

[Apple Developer の記事](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_mail-client) によると、以下のようなことが求められています。

* Info.plist ファイルで `mailto:` スキームを指定すること
* 有効なメールアドレス宛にメッセージを送信できること
* 任意のメール送信者からメッセージを受信できること
  * ただし、ユーザーにより制御されるメールスクリーニング機能を持っていても良い

意外と簡単に要件を満たすことができそうですね。

## Info.plist ファイルで `mailto:` スキームを指定する

`mailto:` スキームからアプリを起動するための設定を行います。

まず、 Info.plist ファイルの `CFBundleURLSchemes` に `mailto` を追加します。
その上で、 AppDelegate の `application(_:open:options:)` にて mailto URI の parse やその後のメール送信画面の表示機能などを実装します。

このとき、 [mailto: スキームは Apple により予約されており](https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007899) 標準のEメールクライアントが起動してしまうため、実機では動作確認を行うことができないことに注意が必要です。シミュレーターを使って動作確認を行いましょう。

## メールの送受信機能を実装する

要件を満たすために、任意の宛先へのメール送受信機能を実装する必要があります。
CosmoSiaでは既に実装済みだったため、追加で必要な実装はありませんでした。

## Apple への申請

デフォルトのEメールクライアントとしての要件を満たすことができたら、 `com.apple.developer.mail-client` entitlement の利用許可を得る必要があります。申請は [こちら](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_mail-client) に記載されているAppleのメールアドレス宛にメールを送ることで行います。

メールのフォーマットは特に指定が無いようですが、CosmoSiaの場合は以下のような内容を記載しました。

* アプリ名
* バンドルID
* アプリの概要
* デフォルトのEメールクライアントになる理由

## App ID Configuration の更新

Appleへの申請が承認されたら、対象アプリの App ID Configuration で `com.apple.developer.mail-client` entitlement にチェックを入れることでデフォルトのEメールクライアントとして動作できるようになります。
手順としては通常のアプリを作成する場合と同様ですが、CosmoSiaで行った手順を以下に記載しておきます。

1. Apple Developer にログインし、 Certificates, Identifiers & Profiles を開く
2. Identifier を選択し、対象のアプリを開く
3. Additional Capabilities タブを開く
4. Default Mail App にチェックを入れる
5. 対応する Provisioning Profile を再発行する

# 実際に申請してみた

デフォルトのEメールクライアントになるための手順については説明できたので、ここからは実際に申請を行って承認されるまでの記録を紹介しようと思います。

## 承認されるまでの期間

CosmoSiaの場合、初回の申請を行ってから承認されるまでに5ヶ月ほどかかりました。
なお、初回の申請後に要件を満たしていないことを理由に却下されたため、指摘内容を反映した上でApp Storeへのリリースを行いました。
その後に再申請を行ったため、再申請から最終的な承認までの期間は2ヶ月ほどです。

## 承認後に行った実装

デフォルトのEメールクライアントとして動作するために、 Entitlements.plist の key に　`com.apple.developer.mail-client` を追加し、値を `true` に設定しました。
なお、承認前にこのkeyを追加した場合はデフォルトEメールクライアントとして動作することはできませんでした。(追加した場合、アプリが起動しませんでした。)

# さいごに

申請してから承認されるまでに時間がかかりやきもきしましたが、無事にデフォルトのEメールクライアントに対応したアプリとしてリリースすることができました。
CosmoSiaの場合はメールアプリとしての機能は実装できていたため、デフォルトのEメールクライアントとしての要件を満たすことはそれほど難しくなかった印象です。

デフォルトのEメールクライアントに関する情報はネット上にあまりなく手探りで対応したため、「このやり方で合っているのだろうか」と常に悩みながら対応していました。今後同じ対応をする人にとってこの記事が役に立つとうれしいです。


最後まで読んでいただきありがとうございました！
明日は @jyoppomu さんです。お楽しみに。