iOS 27.2のEU向けトラッキングプロンプト:何を出荷するか
iOS 27.2とiPadOS 27.2以降、欧州連合(EU)内のアプリは代替版のApp Tracking Transparencyプロンプトを表示できるようになり、フランス、ドイツ、イタリア、ポーランド、ルーマニアで配信されるアプリには、新しい呼び出しからも古い呼び出しからも、その代替版しか出ません。 27.2ベータSDKが追加するのは、メソッド1つとInfo.plistキー1つです。メソッドはrequestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)で、iOS 27.2で利用でき、macOS、tvOS、watchOS、visionOSでは利用できません。キーは任意指定のNSUserTrackingMarkdownUsageDescriptionです。EU外では新しい呼び出しも従来と同じように振る舞い、いつ許可を求めなければならないかというルールも変わりません。EUのユーザーには、前回の回答から1年後にもう一度尋ねられます。出荷までの手順は後述します。27.2ベータシミュレータで地域をアメリカ、ドイツ、オランダ、フランスに設定して試したところ、再起動直後に繰り返せた呼び出しはすべて標準のアラートを表示しました。これは、EU内にないデバイス向けのフォールバックとしてAppleが記載している挙動です。この証拠にもとづくかぎり、シートの確認は実機テストになります。12345
{.answer-block}
TL;DR
- Appleの告知、9月16日。「Beginning with iOS 27.2 and iPadOS 27.2, developers will have the option to use an alternative version of the App Tracking Transparency system prompt in the EU. The requirements for when you must seek permission to track users will remain the same. Due to legal requirements, only the alternative version of the system prompt is available for apps distributed in Germany, France, Italy, Poland, and Romania.」(iOS 27.2とiPadOS 27.2以降、開発者はEUでATTシステムプロンプトの代替版を使う選択肢を持つ。トラッキング許可を求めるべき条件は変わらない。法的要件により、ドイツ、フランス、イタリア、ポーランド、ルーマニアで配信されるアプリでは代替版のみが利用可能)1
- 新しいメソッドは1つ。 27.2ベータSDKの
ATTrackingManager.hは、requestTrackingAuthorizationUsingExpandedInterface:additionalInformationAction:completionHandler:をAPI_AVAILABLE(ios(27.2)) API_UNAVAILABLE(macos, tvos, watchos, visionos)付きで宣言しています。ヘッダのコメントはこうです。「This method behaves identically torequestTrackingAuthorizationWithCompletionHandler:in non-EU countries.」(EU外の国では従来のメソッドとまったく同じに振る舞う)3 - 5か国では古い呼び出しでもシートが出ます。
requestTrackingAuthorization(completionHandler:)のAppleリファレンスページにはこうあります。「In France, Germany, Italy, Poland, and Romania, the system presents a full-page sheet; otherwise, the system prompts the person with an alert.」そして、そのシートは「displays theNSUserTrackingMarkdownUsageDescriptionstring with support for rich-text elements if you include it in your app’s target configuration in Xcode.」とされています。新しい呼び出しが上乗せするのは、EUの残りの国でのシート、「Additional Information」ボタン、そしてそれを要求するフラグです。4 - キーは1つ増え、古いキーは必須のまま。
NSUserTrackingMarkdownUsageDescriptionは任意指定のMarkdownで、「bold or italic style,」、箇条書き、段落の区切りが使えますが、「but it doesn’t support underline」とされています。またヘッダによれば、新しい呼び出しでも元のNSUserTrackingUsageDescriptionがInfo.plistに「must be in」(必ず入っていなければならない)とされています。34 - 「Additional Information」ボタンは、はいでもいいえでもありません。 Appleのヘッダにはこうあります。「If the user taps the ‘Additional Information’ button, the prompt dismisses without recording an authorization decision, your
additionalInformationActionruns so you can surface your own privacy information, and the completion handler receivesnotDetermined.」(ユーザーが「Additional Information」ボタンをタップすると、許可の判断は記録されないままプロンプトが閉じ、additionalInformationActionが実行されるので自前のプライバシー情報を提示でき、completion handlerにはnotDeterminedが渡る)そのあとでもう一度尋ねるのは、自分のコードの仕事です。3 - 再プロンプトはEU限定。「you can reprompt a user via the App Tracking Transparency system prompt one year after the user’s previous choice in your app’s App Tracking Transparency system prompt, regardless of whether that choice was to accept or reject,」(アプリのATTシステムプロンプトでの前回の選択から1年後であれば、その選択が許可でも拒否でも、システムプロンプトで再度尋ねてよい)ただし、ユーザーが「Allow Apps to Request to Track」をオフにしている場合は別です。この設定名は、EUでは「Allow Apps to Request to Link Your Activity Across Companies」に変わります。2
- シミュレータで見えたこと。 iOS 27.2ベータランタイムのiPhone 18 Proシミュレータで地域をアメリカ、ドイツ、オランダ、フランスに設定し、
preferExpandedInterface: trueで新しい呼び出しを行ったところ、出てきたのは元のusage descriptionを載せた標準のアラートで、「Additional Information」ボタンはありませんでした。falseでも、アクションをnilにしても、古い呼び出しでも同じで、completionはタップを待ち、ステータスはnotDeterminedのままでした。一方、即座にnotDeterminedが返る経路がひとつだけ意図的に再現でき、後述します。前回の起動から残ったままのプロンプトです。9月20日にはフランスでの起動2回も即座に返りましたが、こちらは原因を記録できていません。同じ構成は、その後の再起動直後の起動ではプロンプトを表示しました。5
Appleの言葉で見る変更点
Appleはこの変更を3か所で文章にしています。最初は9月16日の告知で、理由もそこに書かれています。「As part of agreements with select European competition authorities, Apple is introducing changes to its App Tracking Transparency framework in the European Union.」(欧州の一部の競争当局との合意の一環として、AppleはEUにおけるApp Tracking Transparencyフレームワークに変更を加える)告知の残りは、ルールと5か国を示しています。1 App Storeのポリシーページは、プロンプトの形を書き足しています。「The alternative version of the App Tracking Transparency system prompt has modified formatting and language and provides you the option to use a text button labeled “Additional Information.” This allows you to surface additional information about your request to link user or device data collected from your app with user or device data collected from other companies’ apps, websites, or offline properties for targeted advertising or advertising measurement purposes, or to share user or device data with a data broker.」(代替版はフォーマットと文言が変更され、「Additional Information」というラベルのテキストボタンを使う選択肢が与えられる。これにより、ターゲティング広告や広告効果測定のために自社アプリで集めたユーザーやデバイスのデータを他社のアプリ、ウェブサイト、オフラインの資産で集めたデータと結び付ける要求について、あるいはデータブローカーへのデータ提供について、追加情報を提示できる)2 そしてiOSおよびiPadOS 27.2ベータのリリースノートは、App Tracking TransparencyのNew Featuresの項で1行にまとめています。AppTrackingTransparencyは「now supports an alternative expanded prompt and re-prompting on a yearly basis for EU users. The alternative prompt is required for users in France, Germany, Italy, Poland, and Romania.」(EUユーザー向けに代替の拡張プロンプトと年次の再プロンプトをサポートするようになった。代替プロンプトはフランス、ドイツ、イタリア、ポーランド、ルーマニアのユーザーには必須)6
ポリシーページは、動かない部分も書いています。トラッキングの前に許可を求める義務と、ボタンの先にあるものはすべて開発者の責任だという点です。「Any additional information related to your request or more granular consent controls provided via the text button are entirely your responsibility. However, you cannot access the device’s advertising identifier, or otherwise collect and use device or user data from your app as described in the App Tracking Transparency system prompt, until the user has granted your app permission in that prompt.」(テキストボタン経由で提供する追加情報や、より細かい同意設定は、全面的に開発者の責任である。ただし、ユーザーがそのプロンプトでアプリに許可を与えるまでは、デバイスの広告識別子にアクセスすることも、ATTシステムプロンプトに書かれたかたちでアプリからデバイスやユーザーのデータを収集・利用することもできない)2
27.2 SDKのAPI
Xcode 27.2ベータ(27B5019j)はiOS 27.2 SDKをビルド24B5084kとして同梱しており、そのAppTrackingTransparency.frameworkのヘッダには、すでに呼んでいるメソッドの隣にクラスメソッドが1つ増えています。3
+ (void)requestTrackingAuthorizationUsingExpandedInterface:(BOOL)preferExpandedInterface
additionalInformationAction:(nullable void(^)(void))additionalInformationAction
completionHandler:(void(^)(ATTrackingManagerAuthorizationStatus status))completion API_AVAILABLE(ios(27.2)) API_UNAVAILABLE(macos, tvos, watchos, visionos);
SwiftではATTrackingManager.requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)となり、Appleのリファレンスページはこれをすべてベータとして、iOS 27.2、iPadOS 27.2、Mac Catalyst 27.2と記しています。ヘッダのコメントは、この2つのパラメータについてAppleが公開したなかで最も詳しい説明であり、そのうち4つの文が呼び出しの書き方を決めます。34
- 「Pass
YEStopreferExpandedInterfaceto request the alternative prompt where permitted; passNOto request the original prompt.」(許可される場所で代替プロンプトを求めるならYES、元のプロンプトを求めるならNOを渡す)パラメータについてはこうです。「Note that in France, Germany, Italy, Poland, and Romania, due to legal requirements, only the expanded interface version of the ATT prompt will be available regardless of what is passed in topreferExpandedInterface.」(5か国では法的要件により、preferExpandedInterfaceに何を渡しても拡張インターフェース版しか利用できない) - 「If you pass
niltoadditionalInformationAction, this button will not be shown.」(additionalInformationActionにnilを渡すと、このボタンは表示されない) - 「If the user taps the ‘Additional Information’ button, the prompt dismisses without recording an authorization decision, your
additionalInformationActionruns so you can surface your own privacy information, and the completion handler receivesnotDetermined.」(ボタンがタップされると、許可の判断は記録されずにプロンプトが閉じ、アクションが実行され、completion handlerはnotDeterminedを受け取る) - 「iOS users may be re-prompted in eligible regions on a periodic basis even after a previous authorization decision. If the user is not eligible to be re-prompted and a previous authorization decision exists, the completion handler is called with that prior decision without showing the prompt.」(対象地域では、過去に判断があっても定期的に再度尋ねられることがある。再プロンプトの対象外で過去の判断がある場合は、プロンプトを出さずにその判断がcompletion handlerに渡される)
リファレンスページは、ヘッダが示唆するだけだった地域ごとの表を実際に描いています。フランス、ドイツ、イタリア、ポーランド、ルーマニアでは「The system displays markdown text you supply via NSUserTrackingMarkdownUsageDescription in a full-page sheet regardless of what you set for preferExpandedInterface, and includes an Additional Information button if you supply an action.」(preferExpandedInterfaceの値にかかわらずフルページシートにMarkdownを表示し、アクションを渡せばAdditional Informationボタンも出す)。EUの残りの国では「The system displays markdown text in the NSUserTrackingMarkdownUsageDescription, if you supply it. The system displays the full-page sheet if you set preferExpandedInterface to true, and includes an Additional Information button if you supply an action.」(Markdownを渡していれば表示し、preferExpandedInterfaceがtrueならフルページシートを出し、アクションを渡せばボタンも出す)。それ以外の地域では「Outside of the European Union, the system doesn’t use either parameter, and presents a system alert displaying the original NSUserTrackingUsageDescription, which is equivalent to calling requestTrackingAuthorization(completionHandler:).」(EU外ではどちらのパラメータも使わず、元の説明文を載せたシステムアラートを出す。これは従来の呼び出しと同じ)。ページは地域判定の条件も付け加えています。デバイスが「located in a specific European Union country and signed in with an Apple Account with a specific EU country or region」(特定のEU加盟国にあり、特定のEUの国または地域のApple Accountでサインインしている)である必要があります。4
古い呼び出しrequestTrackingAuthorization(completionHandler:)のページも、いまでは5か国ではそちらからもシートが出ると書いています。「In France, Germany, Italy, Poland, and Romania, the system presents a full-page sheet; otherwise, the system prompts the person with an alert.」、そしてターゲットのプロパティの項では「In France, Germany, Italy, Poland, and Romania, the full-page sheet displays the NSUserTrackingMarkdownUsageDescription string with support for rich-text elements if you include it in your app’s target configuration in Xcode.」(Xcodeのターゲット設定にMarkdownキーを入れておけば、5か国のフルページシートはリッチテキストとして表示する)とあります。このページはシートのバージョンを示さず、メソッドをiOS 14としてベータの印も付けていないので、シートの27.2という下限はページではなくリリースノートから来ています。合わせて読むと、新しい呼び出しで手に入るのはEUの残りの国でのシート、ボタン、そしてフラグを自分で決められることです。5か国では、どちらの呼び出しでもシートが出ます。46
2つのInfo.plistキー
NSUserTrackingUsageDescriptionはなくなりません。新しいメソッドに付いたヘッダの「Important」の注記は、従来の要件を一字一句そのまま繰り返しています。このキーは情報プロパティリストに「must be in」であり、新しいキーのリファレンスページも、「if your app’s target properties omit this key」(アプリのターゲットプロパティにこのキーがない場合)はシステムが元のキーにフォールバックすると書いています。34
追加されたのがNSUserTrackingMarkdownUsageDescriptionで、iOS 27.2とiPadOS 27.2のベータと記されています。Appleのページにはこうあります。「The format of the string is Markdown text; you can apply bold or italic style, but it doesn’t support underline. You can include bullet lists and paragraph breaks.」(文字列の形式はMarkdown。太字と斜体は使えるが下線は使えない。箇条書きと段落の区切りは入れられる)このキーはプロンプトと同じように地域依存です。5か国では設定してあれば常に使われ、それは古い呼び出しでも新しい呼び出しでも変わりません。EUの残りの国ではpreferExpandedInterface: trueを渡したときに使われ、EU外では無視されます。Appleの2つのページは、この中間のケースの書き方が違います。メソッドのページはMarkdownを「if you supply it」(渡してあれば)表示すると言い、キーのページはtrueを渡すという条件を足しています。厳しいほうの読み方はキーのページで、上の図もそちらに従っています。ページに載っているAppleの助言は、元のトラッキングキーのページと同じものです。「Keep the text of your description short and specific. The system displays your app name in the prompt so you don’t need to include it in the string.」(説明文は短く具体的に。アプリ名はシステムがプロンプトに表示するので、文字列に入れる必要はない)4
1年ごとの再プロンプト
ポリシーページは、EUでのルールをこう定めています。「you can reprompt a user via the App Tracking Transparency system prompt one year after the user’s previous choice in your app’s App Tracking Transparency system prompt, regardless of whether that choice was to accept or reject. A user cannot be re-prompted if they have disabled “Allow Apps to Request to Track” (renamed to “Allow Apps to Request to Link Your Activity Across Companies” in the EU) in their device’s Settings.」(前回の選択から1年後であれば、許可でも拒否でも再度尋ねてよい。ただし、デバイスの設定でその項目をオフにしているユーザーには再度尋ねられない)2 ヘッダはアプリ側から見た仕組みを2か所で説明しています。古いメソッドについてはこうです。「In eligible regions, iOS users may be re-prompted after a year has passed since their last decision; otherwise the system remembers the user’s choice and doesn’t prompt again unless the user uninstalls and then reinstalls the app on the device.」(対象地域では前回の判断から1年経つと再度尋ねられることがある。そうでなければシステムが選択を覚えていて、アプリを削除して入れ直さないかぎり再度は出ない)新しいメソッドについては、再プロンプトの対象外で過去の判断があるユーザーには、その判断が「without showing the prompt」(プロンプトを出さずに)completion handlerから返ってきます。つまり2回目の呼び出しは安全であり、プロンプトを出すかどうかを決めるのは自分のコードではなくシステムです。3 どちらのドキュメントにも載っていないのは、呼ぶ前にそのユーザーが対象かどうかを問い合わせる方法です。呼び出しそのものが問い合わせなのです。
27.2ベータシミュレータの挙動
私はiPhoneSimulator 27.2 SDKに対して単一ファイルのSwiftUIプローブを作り、Info.plistに両方のキーを入れました。NSUserTrackingUsageDescriptionは「Probe: the standard usage description.」、NSUserTrackingMarkdownUsageDescriptionは太字の単語、斜体のフレーズ、2項目の箇条書きです。これをiOS 27.2ベータランタイム(24B5084k)のiPhone 18 Proシミュレータで実行し、各実行の前にシミュレータを再起動して、地域はグローバルのAppleLocale設定で切り替えました。9月19日の6回の実行は、アメリカ、ドイツ、オランダをpreferExpandedInterface: trueとアクション付きで、ドイツをfalseで、フランスをtrueかつアクションなしで、そしてドイツを古い呼び出しで、という内訳です。5
9月19日はどの実行も同じ結果でした。標準のアラートで、タイトルは「Allow “ATTProbe” to track your activity across other companies’ apps and websites?」、本文は元のusage description、ボタンは「Ask App Not to Track」と「Allow」の2つだけで、3つ目のボタンはありません。Markdownのテキストは一度も現れず、16秒のキャプチャ中にcompletion handlerは発火せず、拡張呼び出しの5回では3秒ごとのチェックで12秒間、trackingAuthorizationStatusはnotDeterminedのままでした。古い呼び出しの実行はmode=legacyの行を記録したあと何も出さず、同じように待ち続けました。5 これは、EU内にないデバイスに対してAppleのリファレンスページが予告しているとおりの挙動です。シミュレータの地域設定はロケールであって位置ではありません。シート、Markdownのテキスト、ボタンは、EU地域のApple Accountを入れた実機でのテストになります。
9月20日にMacを再起動してから同じ6回をやり直すと、アメリカ、ドイツ、オランダは前回どおりプロンプトが出ましたが、フランスの実行だけは要求と同じ秒のうちにcompletion handlerへnotDeterminedを返し、アラートを出しませんでした。その朝はさらにフランスで2回起動して同じことが起き、3回目はプロンプトが出ました。即座に返った3回のうち、ファイルに残った記録と時刻が重なるのは7:23の1回だけで、別のスクリプトがその下でプローブを入れ直していました。7:21と7:26の2回には、記録できた原因がありません。ほかに何もシミュレータに触れていない状態で、再起動直後の起動をさらに3回、フランスでアクションあり、フランスでアクションなし、アメリカで試すと、いずれもプロンプトが出て待機しました。つまり同じフランスの構成は、その後の再起動直後の起動ではプロンプトを出しており、報告できるフランスのルールは私にはありません。あるのは注意だけです。ベータシミュレータでアラートが出ないまま即座にnotDeterminedが返ったら、信じる前に再起動直後の状態でもう一度試すべきです。5

9月19日、地域をドイツに設定したiOS 27.2ベータシミュレータで拡張インターフェースの呼び出しを行った直後。標準のアラート、元の説明文、ボタンは2つ。この画像は、その日の残りのファイルを持ち去った再起動の前に書き出せた唯一のものです。
意図的に再現できる回り道のほうは、保留中のプロンプトです。プローブを起動し、アラートに答えないまま、アプリを削除して入れ直し、もう一度起動します。すると2回目の起動の拡張呼び出しは、アラートが画面に出たままで、要求と同じ秒のうちにcompletion handlerへnotDeterminedを返しました。古い呼び出しで3回目を起動しても同じで、1秒以内にlegacy-request status=0 (notDetermined)が出ました。これはヘッダが説明しているケースそのものです。「The authorization prompt doesn’t display if another permission request is pending user confirmation. Concurrent requests aren’t preserved by iOS,」(別の許可要求がユーザーの確認待ちなら、このプロンプトは表示されない。同時要求はiOSが保持しない)に続いて、trackingAuthorizationStatusがnotDeterminedかどうかを見て「to determine if you need to make an additional call」(もう一度呼ぶ必要があるかを判断する)ようにという指示があります。古い呼び出しのページも、プロンプトを出さずにcompletion handlerを実行する場面の一覧に「An existing permission request is pending.」(既存の許可要求が保留中である)を挙げています。345 再起動すれば解消します。アプリが複数の場所から尋ねる場合や、スケジュールに従ってもう一度尋ねる場合、2番目の呼び出し元が受け取るのはこの即座のnotDeterminedです。
出荷までの手順
NSUserTrackingUsageDescriptionは残す。 必須のままであり、EU外のすべてのユーザーと、Markdownキーを持たないEUのユーザー全員が目にするのはこの文章です。34NSUserTrackingMarkdownUsageDescriptionを追加する。 同じ要求を短いMarkdownで書きます。太字か斜体、箇条書き、段落の区切りまで。下線は使えず、アプリ名も要りません。4- 新しい呼び出しは利用可能性でガードする。 古い呼び出しはフォールバックとして残します。iOS 27.2以降では
requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)を、それより前ではrequestTrackingAuthorization(completionHandler:)を呼びます。EUの残りの国でシートを出したいならtrueを渡します。5か国はこのフラグを無視します。iOS 26を下限として27.2 SDKで型チェックが通る形はこうです。345
#if os(iOS)
if #available(iOS 27.2, *) {
ATTrackingManager.requestTrackingAuthorization(usingExpandedInterface: true,
additionalInformationAction: showPrivacyDetails) { status in
handle(status)
}
} else {
ATTrackingManager.requestTrackingAuthorization { status in handle(status) }
}
#endif
- ボタンを出すかどうかを決める。 アクションを渡すのは、見せるページや画面がある場合だけにします。アクションが走ったら、ステータスは
notDeterminedとして扱い、自分の情報を見せます。そしてポリシーページの言葉では「you can redirect the user back to the App Tracking Transparency system prompt for your app to ensure their choice is recorded」(選択が記録されるように、ユーザーをATTシステムプロンプトへ戻してよい)一方で、「you should not redirect users to your ATT prompt if they have opted out of all relevant legal consent choices in the screen or page surfaced」(提示した画面やページで関連する法的同意をすべて拒否したユーザーを、ATTプロンプトへ戻すべきではない)とされています。23 - 再プロンプトはタイマーではなく呼び出しとして計画する。 EUで1年が経ったかどうかを知る方法は、もう一度呼ぶことです。対象外のユーザーには、completion handlerが過去の判断を返します。23
- EU地域のアカウントを入れた実機でテストする。 シミュレータがプロンプトを出したときは、どの地域でも、再起動直後でも、出たのは標準のアラートでシートは一度も出ませんでした。Appleの条件はデバイスの位置とApple Accountの地域の両方なので、フルページシートは実機でのテストになります。45
- Macのターゲットを確認する。 ヘッダはこのメソッドをmacOS、tvOS、watchOS、visionOSで利用不可としているので、共有の呼び出し箇所には
#if os(iOS)で囲んだうえで、その内側にif #available(iOS 27.2, *)を置く必要があります。利用可能性チェックだけではコンパイルが通らず、脚注5に記録したとおり'requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)' is unavailable in macOSで失敗します。リファレンスページのMac Catalyst 27.2という記載と、ヘッダのAPI_UNAVAILABLE(macos)は、同じ境界線を両側から書いたものです。Catalystは#if os(iOS)にとってiOSだからです。345
よくある質問
代替プロンプトへの対応は必須ですか?
フランス、ドイツ、イタリア、ポーランド、ルーマニアでは、そこで配信されるアプリに使える版は代替プロンプトだけだとAppleの告知が述べています。27.2ではどちらの呼び出しからでもそれが出ます。新しい呼び出しは「regardless of what you set for preferExpandedInterface」(preferExpandedInterfaceに何を設定しても)5か国でフルページシートを出し、古い呼び出しのAppleのページも「In France, Germany, Italy, Poland, and Romania, the system presents a full-page sheet; otherwise, the system prompts the person with an alert.」と書き、Markdownキーは「if you include it in your app’s target configuration in Xcode.」(Xcodeのターゲット設定に入れてあれば)表示されるとしています。新しい呼び出しに移ることで手に入るのは、EUの残りの国でのシート、「Additional Information」ボタン、そしてフラグを自分で決められることです。1346
許可を求めるタイミングは変わりますか?
変わりません。Appleはこう述べています。「The requirements for when you must seek permission to track users will remain the same.」1
MarkdownキーはNSUserTrackingUsageDescriptionの代わりになりますか?
なりません。元のキーはどちらの呼び出しでも引き続き必須で、Markdownキーがない場合やデバイスがEU外にある場合には、システムはこちらを使います。34
ユーザーが拒否したあと、もう一度尋ねられますか?
EUでは、前回の選択から1年後に尋ねられます。「regardless of whether that choice was to accept or reject,」(その選択が許可でも拒否でも)ただし、EUでは「Allow Apps to Request to Link Your Activity Across Companies」という名前になっている設定をユーザーがオフにしている場合は別です。2
新しいAPIはmacOSやvisionOSにもありますか?
ありません。27.2 SDKのヘッダはAPI_UNAVAILABLE(macos, tvos, watchos, visionos)と記しており、リファレンスページが挙げているのはiOS、iPadOS、Mac Catalyst 27.2です。34
出典
-
Apple、「Updates to App Tracking Transparency in the European Union」、開発者ニュース、2026年9月16日、引用。 ↩↩↩↩↩
-
Apple、User privacy and data use、「ATT in the European Union」の節と「Can I provide additional information and consent controls with my app’s ATT prompt implementation」の項目、2026年9月19日取得、引用。 ↩↩↩↩↩↩↩↩
-
Xcode 27.2ベータ(27B5019j)内のiPhoneOS 27.2 SDK(
ProductBuildVersion24B5084k、ProductVersion27.2)のAppTrackingTransparency.framework/Headers/ATTrackingManager.h、2026年9月19日に読了。API_AVAILABLE(ios(27.2)) API_UNAVAILABLE(macos, tvos, watchos, visionos)付きのrequestTrackingAuthorizationUsingExpandedInterface:additionalInformationAction:completionHandler:の宣言とそのドキュメントコメントを引用。古いメソッドの、再プロンプトと保留中の要求に関するコメントも引用。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple、requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)およびNSUserTrackingMarkdownUsageDescription、2026年9月19日にドキュメントJSONを取得。プラットフォーム対応はメソッドがiOS 27.2、iPadOS 27.2、Mac Catalyst 27.2、キーがiOS 27.2、iPadOS 27.2で、いずれもベータ表記。「Display a full-page sheet」と「Discussion」の節を引用。Apple、requestTrackingAuthorization(completionHandler:)、2026年9月21日にドキュメントJSONを取得。プラットフォーム対応はiOS 14.0、iPadOS 14.0、Mac Catalyst 14.0、macOS 11.0、tvOS 14.0、visionOS 1.0で、ベータ表記なし。5か国に関するDiscussionの一文、Markdownキーに関する「Configure the app’s target properties」の一文、そして「the system doesn’t display the prompt」(システムがプロンプトを表示しない)場面の一覧にある保留中の要求の項目を引用。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
著者によるmacOS 26.6.2(25G83)上での実行、2026年9月19日と20日。ATTProbeは
AppとWindowGroupのライフサイクルを使う単一ファイルのSwiftUIアプリで、Xcode 27.2ベータ(27B5019j)のもとでxcrun swiftc -sdk <iPhoneSimulator27.2.sdk> -target arm64-apple-ios26.0-simulator -parse-as-libraryによりビルド。Info.plistにはNSUserTrackingUsageDescriptionとして「Probe: the standard usage description.」、NSUserTrackingMarkdownUsageDescriptionとして「Probe: Markdown description with a bullet list:」とそれに続く2つのリスト項目を設定。同じプローブの、シーンマニフェストを持たない以前のUIKit版は、同じSDKでビルドしたところ要求に到達する前にEXC_BREAKPOINTで起動時にトラップしたため、調査せずに置き換えた。デバイスはcom.apple.CoreSimulator.SimRuntime.iOS-27-2(24B5084k)上にsimctl createで作成したiPhone 18 Proシミュレータで、Xcode 27.2ベータのsimctlで操作。地域はsimctl spawn <udid> defaults write "Apple Global Domain" AppleLocale -string <locale>で設定。各実行の前にsimctl shutdownとsimctl bootを実施。アプリはsimctl launch --console-ptyで起動し、そのprintの行を収集。スクリーンショットは起動の7秒後にsimctl io <udid> screenshotで取得し、キャプチャはその9秒後に終了。実行の内訳は、en_USで拡張かつアクションあり、de_DEで拡張かつアクションあり、de_DEで古いrequestTrackingAuthorization(completionHandler:)、de_DEでpreferExpandedInterface: false、nl_NLで拡張かつアクションあり、fr_FRで拡張かつアクションはnil。9月19日は、どの実行でもログにregion=<code> status-before=0が出て、16秒のキャプチャ中にcompletionの行はなし。拡張の5回では3秒、6秒、9秒、12秒の時点でstatus-now=0も出力(このチェックはプローブの古い呼び出し側の分岐では行わない)。スクリーンショットはいずれも標準のアラートを写していた(これらのファイルと、保留中プロンプトの挙動を最初に見せた9月19日の前のシリーズのファイルは、セッションの一時ディレクトリを消したMacの再起動を生き延びなかったため、9月19日の結果はそのとき読んだコンソール出力からここに記録している)。9月20日の第1シリーズは、各実行の前に再起動する同じスクリプトで、en_USが7:16:37、de_DEが7:17:42、de_DEの古い呼び出しが7:18:42、de_DEのfalseが7:19:33、nl_NLが7:20:26。いずれもcompletionの行はなく、プローブがポーリングするチェックでは毎回status-now=0、スクリーンショットはいずれも標準のアラート。アクションなしのfr_FRは7:21:04で、7:21:05にexpanded-request status=0 (notDetermined)を、mode=の行と同じ秒のうちに出力し、そのスクリーンショットにはプローブ自身のログだけが写り、アラートはない。もう1台のシミュレータ、iPhone Duoのデバイスは7:13に起動してこのシリーズの間も立ち上がったままだったが、その間にどちらのシミュレータかに何かが触れた記録はファイルにない。第2シリーズは7:23から7:27で、最初の3回の起動は、シミュレータのエラーで2度失敗した保留中プロンプト手順の最初の試みと重なっている。アクションなしのfr_FRが7:23:57で即座にnotDetermined、アクションありのfr_FRが7:24:09でこの別スクリプトによる起動、プロンプトが出てcompletionの行はなし、アクションなしのde_DEが7:24:52でプロンプトあり、アクションありのfr_FRが7:26:03で即座にnotDetermined、アクションなしのen_USが7:27:43でプロンプトあり。7:23:09のfr_FRの起動はシミュレータの終了中に失敗し、7:23:57のログは別スクリプトがプローブを入れ直したため6秒で終わっている。これらは網羅性のために挙げるだけで、重みは置かない。第3シリーズは、ほかに何もシミュレータに触れない状態で1回ずつ、各回の前に再起動して実施。アクションありのfr_FRが7:40:06、アクションなしのfr_FRが7:40:45、7:41:22はロケール文字列us_US(プローブはregion=USと出力)で、いずれもプロンプトが出てcompletionの行はなく、毎回のチェックでstatus-now=0。保留中プロンプトのケースは同じスクリプトで1回のブート中に実施。7:42:00のde_DEはプロンプトが出てcompletionの行はなし。そのアラートに答えないままsimctl uninstallとsimctl installを行ったあと、7:42:18の起動は7:42:19にexpanded-request status=0 (notDetermined)を出力し、そのスクリーンショットにはアラートが画面に写っている。7:42:40に古い呼び出しで行った3回目の起動は、7:42:41にlegacy-request status=0 (notDetermined)を出力した。手順3のスニペットは、showPrivacyDetailsとhandle(_:)をスタブ関数として、-target arm64-apple-ios26.0-simulatorでiPhoneSimulator 27.2 SDKに対するswiftc -typecheckを通過。同じファイルから#if os(iOS)の行を取り除き、Xcode 27.2ベータ内のmacOS SDKに対して-target arm64-apple-macos15.0でコンパイルすると、error: 'requestTrackingAuthorization(usingExpandedInterface:additionalInformationAction:completionHandler:)' is unavailable in macOSで失敗した。 ↩↩↩↩↩↩↩↩↩ -
Apple、iOS & iPadOS 27.2 Beta Release Notes、2026年9月17日と9月19日にドキュメントJSONエンドポイント経由で取得、App Tracking Transparency、New Featuresより引用。 ↩↩↩