📱

[iOS] デバイス名を表示するにはiOS16から申請が必要になったので申請してみたけどリジェクトされた件

2024/12/03に公開

この記事はiOS Advent Calendar 2024への寄稿です。

概要

個人開発アプリで「ユーザが設定するデバイス名」(下画像の枠部分のこと。以下「デバイス名」と表記します)を表示できたら良さそうと思える機能を追加しようとしました。

以前は、以下のコードで簡単にデバイス名を取得できていました。

UIDevice.current.name

しかしiOS 16以降では、上記のコードからデバイス名を取得するにはAppleへの申請(正確には「entitlementをリクエストする」。こちらも以後「申請」と表記します)が必要になりました。

ドキュメントにもはっきりと書かれています。

To access the user-assigned device name through this property in iOS 16 and later, your app must meet certain criteria and be assigned an entitlement.

近年のAppleによるプライバシー保護強化の流れを考えると、まあ当然の対応とも言えるかもしれません。

申請が通っていない状態で上記コードを実行すると、iOS16以降ではiPhoneのような汎用的な名前しか取得できません。

ということで先日、このデバイス名を表示するためにAppleへ申請を行ってみました。
本記事では、デバイス名を表示したいと思った理由(モチベーション)や、申請の手順とその結果(結果についてはタイトルでネタバレしていますが)についてまとめたいと思います。

デバイス名を表示したいと思った理由

コーヒーのレシピ(抽出における各種パラメータ)を記録する「kopi」というアプリをプライベートで開発しています。

https://apps.apple.com/jp/app/コーヒー抽出レシピ-の記録アプリ-kopi/id1317507350

現在、レシピの記録データはローカルデータベース(Realm)にのみ保存されており、サーバへの保存やそもそもアカウント機能も実装していません。

機種変更時に正しくデータ移行が行われればレシピの記録も問題なく引き継ぐことが可能です(Realmのデフォルトの設定)。ただし、一部のユーザーから「機種変更ではなく、別の端末でレシピの記録を管理したくなった場合、どうすれば記録をコピーできますか?」という質問や要望が寄せられていました。

つまり端末間でのデータの移行・同期です。

私自身、この問題はいずれ解決したいと考えていたため、今回本格的に開発に取り組むことにしました。いくつかの案を検討した結果、「ユーザー体験の簡便さ」と「技術的な興味」 の両面から、Multipeer Connectivityを採用することに決めました。

Multipeer Connectivityは簡単に言えば次のような機能を提供するものです。

  • 端末間でP2P通信が可能
  • iOS 7.0以降で利用可能(全く知らなかったです💦)

今回、この機能を用いて2つの端末を接続しデータの移行・同期を行う、ただしセキュリティの観点から接続先の端末が意図したものであることを確認するためにデバイス名を表示する、というものを実装しました。

Multipeer Connectivityまわりの実装においては特に以下の記事を参考にさせていただきました。
圧倒的感謝です!

https://qiita.com/am10/items/e56c2bc6eaab75bc9c8c

実装したもののデモ

以下は、実装したデモの様子です(2つのgifを並べたものなので見づらいですが)。

「送り手(iPhone)」から「受け手(iPad)」に接続を試み、接続が完了次第データのコピーを行う、というものです。
それぞれのデバイス名として表示されているiPadiPhoneは、まさにUIDevice.current.nameで取得した名前です。申請が通っていない状態でのもののため、先述したようにデバイス名がこのような汎用的な名前になっています

送り手 受け手

申請フロー

さて、実装も済んだのでいよいよAppleに申請します。

申請はこちらのフォームから行えます。

1点注意が必要なのは、スクリーンショットやデモ動画をこのフォームに直接アップロードするのではなく、リンクを記載する形式になっていることです。そのため、状況によってはどこにホスティングするかを検討する必要があるかもしれません。

なお、私の場合スクリーンショットに不備があったため、1往復分のやり取りが発生しましたが、これらのやり取りはすべてメールで行われました(通常のアプリの審査フローから考えると少し不思議な感覚)。

申請結果

結果は...タイトルにもある通り、リジェクトでした🥺🥺🥺
(正確には、メールに記載されていた表現では “We are unable to approve your request at this time” とのことでした。)

直接的なリジェクト理由は例によって(?)明確には記載されていませんでした。
ただし、デバイス名を表示する機能を利用するには、

https://developer.apple.com/documentation/bundleresources/entitlements/com.apple.developer.device-information.user-assigned-device-name

に箇条書きされている基準(criteria)を満たしている必要があるとのことですが、その中でも

The feature provides an important component of your app’s functionality to a majority of your app’s users

こちらの要件、つまり大体数のユーザが利用する機能ではなかったことが申請が通らなかった理由ではないかと推測しています。

最終的にどうした?

なお、「接続先の端末が意図したものであることを確認する」という目的であれば、デバイス名ではなく、例えば6桁のランダムな数字などを利用する方法でも問題ないだろうと思いましたが、Multipeer Connectivity自体が個人的には難しく(正常ケースで動作すれば非常に良いUXを提供できるはずとは思いつつ、何かしらエラーケースが発生した場合にどうハンドリングするのがいいかなどを考えるのが片手間で開発している個人アプリではしんどいと思えた)、今回は断念することにしました。

最終的には、「端末Aでファイルをエクスポートして、端末Bでそれをインポートする」というシンプルな方法でデータの同期を行う仕様に落ち着きました。

まとめ

  • iOS 16以降、デバイス名の取得には事前申請が必要
  • デバイス名をどうしても取得する必要がある場合は、Appleが定義する条件を満たしているかを事前に確認すること

Discussion