日記アプリ Lanternly のバージョン 1.1 を提出する前に、iOS と macOS の App Store の説明文39件すべての末尾に、同じ4行のブロックを貼りました。中身は地味です。区切り線、使用許諾契約、プライバシーポリシー、利用規約。ただ、これがないとサブスクリプションのアプリは、サブスク自体もペイウォールも StoreKit も正しく作ってあるのに、3.1.2 の指摘付きで差し戻されるおそれがあります。
以下では、この要件が実際にはどこから来ているのか、なぜ App Store Connect にポリシー用の欄はあって規約用の欄はないのか、そして最終的にどんなテキストを入れたのかを説明します。Apple の文書の引用は原文のままで、2026年10月13日に確認しました。
Apple はどこでこれを求めているか#
おもしろいことに、ガイドライン 3.1.2 の本文にはリンクのことも EULA という言葉も出てきません。3.1.2(c) は、ユーザーがお金を払って何を得るのかをわかりやすく説明するよう求め、開発者プログラム使用許諾契約の Schedule 2 を参照しているだけです。要件そのものは別の3か所にあります。
Schedule 2 の 3.8(b)。 自動更新サブスクリプションについて「明確かつ目立つように」示すべき項目が並んでいます。名称、期間、価格。そして独立した一文として、こう書かれています。
Links to Your Privacy Policy and Terms of Use must be accessible within Your Licensed Application.
これはアプリ本体についての要件です。
Auto-renewable subscriptions のページは、メタデータについて付け加えています。
Please note that your app and App Store metadata must include links to your Terms of Use and Privacy Policy.
ガイドライン 5.1.1(i) は、サブスクに限らずすべてのアプリのプライバシーポリシーについて述べています。
All apps must include a link to their privacy policy in the App Store Connect metadata field and within the app in an easily accessible manner.
まとめると、リンクは2つで、それぞれ2か所に必要です。アプリの中と、ストアのページです。
なぜ規約には専用の欄がないのか#
ポリシーは簡単です。「App情報」に Privacy Policy URL の欄があり、iOS と macOS では必須で、ローカライズごとに入力します。
一方、App Store Connect に「Terms of Use URL」の欄はありません。あるのは License Agreement の欄で、ドキュメントにはこうあります。
Apple provides a standard EULA (End-User License Agreement) that applies in all regions. You may provide a custom license agreement that supersedes the Apple EULA for one or more regions.
つまり道は2つです。
| 方法 | やること | 向いているケース |
|---|---|---|
| License Agreement 欄に独自の EULA | 規約の全文を貼り、標準のものを置き換える | 弁護士がいて、全地域共通の規約がある |
| 標準 EULA + 説明文にリンク | 欄には触れず、Description の末尾にリンクを置く | ほとんどの個人開発アプリ |
私は2つ目を選びました。Lanternly には独自の規約もありますが、それはサブスクとアプリについて定めたもので、ソフトウェアそのもののライセンスは Apple の標準 EULA で十分にカバーされています。
実際のブロック#
Lanternly の説明文の末尾には、どれもこれが入っています。区切り線の上は通常の本文で、下はリンクだけです。
_____________________
LICENSED APPLICATION END USER LICENSE AGREEMENT - https://www.apple.com/legal/macapps/stdeula/
Privacy Policy - https://dodecaidr.pro/en/projects/lanternly/privacy-policy/
Terms and Conditions - https://dodecaidr.pro/en/projects/lanternly/terms-of-service/ここにはいくつか判断が隠れています。
行の見出しはどの言語でも英語のまま。 変えるのは文書のアドレスだけで、ラベルは同じです。「LICENSED APPLICATION END USER LICENSE AGREEMENT」という行なら、説明文のほかの部分が何語でも、アプリを審査する人はひと目でそれとわかります。これは私の選択で、Apple の要件ではありません。
変更していなくても標準 EULA へのリンクを置く。 これがないと、メタデータにはポリシーと私の規約はあっても、実際に効力を持つライセンスがありません。審査担当者が推測しなくて済むように、3つの文書をすべて見せています。
リンクはむき出しの完全な URL で、プロトコル付き。 App Store の説明文はプレーンテキストで、HTML は使えません。https:// のないアドレスはリンクにならないことがあります。
どのリンクもログインなし、リダイレクトなしで開く。 ここでは一度痛い目を見ています。Mac 版がガイドライン 1.5 でリジェクトされました。Support URL がリダイレクトで SNS に飛ぶ作りになっていて、審査担当者の環境で開かなかったからです。なので提出前に、ストアページにあるアドレスを全部 curl -sIL に通し、リダイレクトの最後が 200 で、ログインページではないことを確かめる価値があります。
ブロックは4000文字中280文字を使います。フランス語の説明文ではこれが効いてきて、本文が収まりませんでした。説明文の途中にあった「Privacy policy / Terms of use」の行がブロックと重複していたので削り、フランス語は3917文字に収まりました。
ブロックの上:サブスクについての段落#
リンクで文書はカバーできます。ただ 3.8(b) は、サブスクリプション自体の条件を示すことも求めています。価格は説明文に書きません。国ごとに違いますし、購入者の通貨での価格はペイウォールが表示します。それ以外を1段落にまとめています。
Lanternly+ is a monthly, six-month or yearly subscription with a 7-day free trial.
Payment is charged to your Apple account at confirmation of purchase.
The subscription renews automatically unless cancelled at least 24 hours
before the end of the current period. Manage or cancel it in your Apple account settings.説明文では、無料の1週間をサブスクの性質として書いています。アプリの中では、1週間についての文言は、その人がまだ無料トライアルの対象である場合(isEligibleForIntroOffer)にだけ表示します。そうでなければ、ストアが守れない約束になってしまいます。
アプリ内にも同じリンク#
要件のもう半分はコードの側にあります。Lanternly のペイウォールでは、購入ボタンの下に「復元 · 規約 · ポリシー」の行があります。SwiftUI と StoreKit 2 で動く最小限の形はこうです。
import SwiftUI
import StoreKit
enum LegalLinks {
// 文書の言語は、デバイスの地域ではなくアプリの表示言語に合わせる
private static var lang: String {
(Bundle.main.preferredLocalizations.first ?? "en").hasPrefix("ru") ? "ru" : "en"
}
static var privacy: URL { URL(string: "https://example.com/\(lang)/privacy-policy/")! }
static var terms: URL { URL(string: "https://example.com/\(lang)/terms-of-service/")! }
}
struct PaywallLegalRow: View {
var body: some View {
HStack(spacing: 6) {
Button("Restore") { Task { try? await AppStore.sync() } }
Text("·")
Link("Terms", destination: LegalLinks.terms)
Text("·")
Link("Privacy", destination: LegalLinks.privacy)
}
.font(.footnote)
.foregroundStyle(.secondary)
.lineLimit(1)
}
}preferredLocalizations に注目してください。ここでデバイスの地域は当てになりません。ロシア語の UI を使ってドイツに住んでいる人なら、地域はドイツです。一方、UI の言語は、その人がたった今ペイウォールを読んだ言語です。「復元」ボタンが同じ行にあるのも、リンクがそこにあるのと同じ理由です。Apple はサブスクの購入画面にそれを置くよう求めています。
言語が多い場合#
Lanternly の UI は2言語ですが、ストアのページは39言語あります。サイト上の文書は英語、ロシア語、スペイン語、日本語、中国語の5言語です。そこで、ローカライズは自分の言語の文書があればそこへリンクする、というルールにしました。スペイン語のローカライズは /es/、日本語は /ja/、中国語は2つとも /zh-CN/、それ以外はすべて /en/ です。
「App情報」の Privacy Policy URL もローカライズされます。ドキュメントでは iOS と macOS で必須とされていますが、説明文の近くではなく別のセクションにあるので、ローカライズを追加するときに忘れがちです。
Apple がはっきりさせていないこと#
- 規約へのリンクをメタデータのどの欄に置くべきか。 サブスクのページは「App Store metadata」と言うだけで、欄を指定していません。説明文がいちばん自然な選択肢ですが、形式上は License Agreement に独自のテキストを入れても条件を満たします。
- ブロックがすべてのローカライズに必要か。 どこにも書かれていません。私は全部に入れています。審査担当者はどの言語でページを開くかわかりませんし、280文字なら安いものです。
- 独自の規約の代わりに標準 EULA で足りるか。 多くのアプリではおそらく足ります。ただ、サブスクで独自のルールを持つサービスを提供するなら、独自の規約が必要で、弁護士と一緒に書くのが望ましいでしょう。
提出前の短いチェックリストです。Privacy Policy URL がすべてのローカライズで埋まっている。説明文の末尾に3つのリンクのブロックがある。どのアドレスもログインなしで 200 を返す。ペイウォールに「復元」「規約」「ポリシー」がある。この39のストアページのほかの欄をどう翻訳し、どう検証したかは次の記事で書いています。



