Skip to content

iOSアプリ用プライバシーマニフェスト

あなたのアプリがApple App Store向けであり、理由が必要なAPI (required reasons APIs) を使用している場合、App Store Connectはアプリに正しいプライバシーマニフェスト(privacy manifest)が含まれていないという警告を出すことがあります。

理由が必要なAPIに関する警告

これは、ネイティブかマルチプラットフォームかを問わず、すべてのAppleエコシステムのアプリに影響する可能性があります。アプリがサードパーティのライブラリやSDKを介して、それとは気づかずに「理由が必要なAPI」を使用している場合があります。Kotlin Multiplatformも、あなたが意識していないAPIを使用しているフレームワークの一つである可能性があります。

このページでは、問題の詳細な説明と、それに対処するための推奨事項を記載しています。

このページは、この問題に関するKotlinチームの現在の見解を反映しています。 受け入れられるアプローチや回避策についてのデータや知識がさらに得られ次第、それらを反映するためにこのページを更新する予定です。

問題の概要

AppleのApp Storeへの提出に関する要件は、2024年の春に変更されましたApp Store Connect では、プライバシーマニフェスト内で「理由が必要なAPI」を使用する理由を指定していないアプリを受け付けなくなりました。

これは手動の審査ではなく自動チェックです。アプリのコードが分析され、問題のリストがメールで届きます。メールには「ITMS-91053: Missing API declaration(API宣言の不足)」という問題が参照され、アプリ内で使用されている理由が必要なAPIのカテゴリに該当するすべてのAPIカテゴリがリストアップされます。

理想的には、アプリが使用するすべてのSDKが独自のプライバシーマニフェストを提供しており、開発者が心配する必要がない状態が望ましいです。しかし、依存関係の一部がこれを行っていない場合、App Storeへの提出がフラグを立てられる可能性があります。

解決方法

アプリを提出しようとしてApp Storeから詳細な問題リストを受け取った後、Appleのドキュメントに従ってマニフェストを構築できます:

作成されるファイルは辞書のコレクションです。アクセスされるAPIタイプごとに、提供されたリストから使用理由を1つ以上選択します。Xcodeは、視覚的なレイアウトと各フィールドの有効な値のドロップダウンリストを提供することで、.xcprivacy ファイルの編集をサポートします。

専用のツールを使用して、Kotlinフレームワークの依存関係内で「理由が必要なAPI」の使用箇所を見つけることができます。また、別のプラグインを使用して、.xcprivacy ファイルをKotlinアーティファクトにバンドルすることができます。

新しいプライバシーマニフェストを追加してもApp Storeの要件を満たせない場合や、手順の進め方がわからない場合は、このYouTrackのイシューでケースを共有し、お問い合わせください。

理由が必要なAPIの使用箇所を見つける

アプリ内のKotlinコード、またはその依存関係の一つが、platform.posix などのライブラリから「理由が必要なAPI」(例:fstat)にアクセスしている可能性があります。

kotlin
import platform.posix.fstat

fun useRequiredReasonAPI() {
    fstat(...)
}

場合によっては、どの依存関係が「理由が必要なAPI」を使用しているかを判断するのが難しいことがあります。それらを見つけるのを助けるために、シンプルなツールを作成しました。

これを使用するには、プロジェクト内でKotlinフレームワークが宣言されているディレクトリで以下のコマンドを実行してください:

shell
/usr/bin/python3 -c "$(curl -fsSL https://github.com/JetBrains/kotlin/raw/rrf_v0.0.1/libraries/tools/required-reason-finder/required_reason_finder.py)"

また、このスクリプトを別途ダウンロードし、内容を確認してから python3 を使用して実行することもできます。

Kotlinアーティファクトに.xcprivacyファイルを配置する

PrivacyInfo.xcprivacy ファイルをKotlinアーティファクトにバンドルする必要がある場合は、apple-privacy-manifests プラグインを使用します。

kotlin
plugins {
    kotlin("multiplatform")
    kotlin("apple-privacy-manifests") version "1.0.0"
}

kotlin {
    privacyManifest {
        embed(
            privacyManifest = layout.projectDirectory.file("PrivacyInfo.xcprivacy").asFile,
        )
    }
}

プラグインは、プライバシーマニフェストファイルを対応する出力場所にコピーします。

既知の使用例

Compose Multiplatform

Compose Multiplatformを使用すると、バイナリ内で fstatstat、および mach_absolute_time が使用される結果となる場合があります。これらの関数がトラッキングやフィンガープリント(fingerprinting)に使用されておらず、デバイスから送信もされていない場合でも、Appleはこれらを「理由が必要なAPI」の不足としてフラグを立てることがあります。

stat および fstat の使用理由を指定する必要がある場合は、0A2A.1 を使用してください。mach_absolute_time の場合は、35F9.1 を使用してください。

Compose Multiplatformで使用される「理由が必要なAPI」に関する今後の更新については、このイシューをフォローしてください。

バージョン1.9.10以前のKotlin/Nativeランタイム

mach_absolute_time APIは、Kotlin/Nativeランタイムの mimalloc アロケータで使用されています。これはKotlin 1.9.10以前のバージョンのデフォルトのアロケータでした。

Kotlin 1.9.20以降のバージョンへのアップグレードを推奨します。アップグレードが不可能な場合は、メモリアロケータを変更してください。そのためには、Gradleビルドスクリプトで、現在のKotlinアロケータには -Xallocator=custom コンパイルオプションを、システムアロケータには -Xallocator=std を設定してください。

詳細については、Kotlin/Nativeのメモリ管理を参照してください。