<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>App Store » MszPro・株式会社Smartソフト</title>
	<atom:link href="https://mszpro.com/category/app-store/feed" rel="self" type="application/rss+xml" />
	<link>https://mszpro.com</link>
	<description>iOS VisionOS SwiftUI Programming Blog. Dream it, Chase it, Code it.</description>
	<lastBuildDate>Mon, 16 Dec 2024 12:56:18 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>

<image>
	<url>https://static-assets.mszpro.com/2024/12/cropped-Unknown-32x32.webp</url>
	<title>App Store » MszPro・株式会社Smartソフト</title>
	<link>https://mszpro.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>「ITMS-91053: Missing API declaration」アプリのプライバシーレポートでのAPI使用宣言（iOSアプリを審査に提出したら）</title>
		<link>https://mszpro.com/itms-91053-ja</link>
		
		<dc:creator><![CDATA[msz]]></dc:creator>
		<pubDate>Mon, 16 Dec 2024 07:39:11 +0000</pubDate>
				<category><![CDATA[API Deprecation]]></category>
		<category><![CDATA[App Store]]></category>
		<guid isPermaLink="false">https://mszpro.com/?p=360</guid>

					<description><![CDATA[<p>Qiita: https://qiita.com/mashunzhe/items/d2c035c0d4794a6bf211 Medium (English version): https://medium.com/@MszPro/itms-91053-missing-api-declaration-for-accessing-userdefaults-timestamps-other-apis-d5c0cbf84a5e App Storeにアップデートを提出しようとして、以下のメールを受け取ったことはありますか？ WWDC 2023で明らかになったように、UserDefaultsのようなAPIを使用する場合は、プライバシーレポートを作成する必要があります。2024年5月1日から、このようなプライバシー宣言なしで新しいアプリのビルドをアップロードすることは許可されません。プライバシーレポートを作成するには、以下の手順に従ってください： まず、プロジェクトに新しいファイルを作成します： そのファイルのタイプは「App Privacy」と呼ばれます このファイルが適用されるターゲットに対してファイルをリンクする必要があります。例えば、UserDefaultsをすべてのアプリターゲット内で使用している場合、このファイルをそれら全てに適用します： アプリのプライバシー設定内には、主に4つのカテゴリーがあります： 注：いつでも、生のキーや英語の説明タイトルの間で切り替えることができます。白いエリアを右クリックして生の値の切り替えを使用してください。 以下は、私のアプリがユーザーを追跡せず、ユーザーIDをユーザー登録に使用するが追跡には使用しない、そしてUserDefaultsフレームワークを使用してメインアプリとウィジェット間で設定を保存する場合の、完成したファイルの例です。 プライバシーがアクセスしたAPIのタイプ これは、UserDefaultsやその他のAPIを使用する理由を宣言する必要がある場所です。宣言する必要があるAPIの完全なリストはこちらです：https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api プライバシーがアクセスしたAPIのタイプを選択してエンターキーを押し、新しい辞書エントリを作成します。 この項目を展開し、エンターキーを押してプロパティを追加します。2つのプロパティが必要で、「プライバシーがアクセスしたAPIタイプ」はAPIのタイプを宣言し、「プライバシーがアクセスしたAPI理由」はアプリがそのデータが必要な理由の配列です。 例えば、私のアプリがUserDefaultsを使用する場合、アクセスしたAPIタイプとしてUser Defaultsを入れます。 その後、このデータへのアクセス理由のコードを記入します。各APIタイプごとに異なるコードのセットがあります： UserDefaults UserDefaultsを使用してユーザー設定を保存する場合、理由を宣言する必要があります。APIタイプは&#160;NSPrivacyAccessedAPICategoryUserDefaults&#160;と呼ばれます。 CA92.1 アプリ自身だけがアクセス可能な情報を読み書きするためにユーザーデフォルトにアクセスします。注意：このコードを宣言する場合、アプリグループ内でUserDefaultsの値を共有することはできません（アプリとウィジェット間でデータを共有することはできません） 1C8F.1 アプリ自体と同じアプリグループのメンバーであるアプリ、アプリ拡張、App Clipsのみがアクセス可能な情報を読み書きするためにユーザーデフォルトにアクセスします。注意：この理由でも、同じアプリグループ外のアプリ、アプリ拡張、App Clipsがアクセスできる情報を書き込むことは許可されません。 C56D.1 サードパーティのSDKがアプリが使用するためのユーザーデフォルトAPIを囲むラッパー機能を提供しており、アプリがラッパー機能を呼び出すときのみユーザーデフォルトAPIにアクセスします。注意：この理由でアクセスされた情報、または派生した情報は、サードパーティSDK自身の目的のために使用されたり、サードパーティSDKによってデバイス外に送信されることはできません。 例えば、私のアプリがUserDefaultsを使用して、メインiOSアプリとウィジェット間でユーザーの現在の都市を共有し、天気を表示する場合、1C8F.1を使用する必要があります。 ウィジェットやアプリグループを持っていない場合は、コードCA92.1を使用できますが、将来的にはコードを1C8F.1に変更することを忘れないでください。そうしないと、UserDefaultsのデータがアプリ自身にのみ制限される可能性があります。 ファイルタイムスタンプAPI これらは、ファイルのタイムスタンプにアクセスするためのAPIであり、creationDate、modificationDateなどを含みます。 APIタイプはNSPrivacyAccessedAPICategoryFileTimestampと呼ばれます。 APIメソッド creationDate、modificationDate、fileModificationDate、contentModificationDateKey、creationDateKey、getattrlist(:::::)、getattrlistbulk(:::::)、fgetattrlist(:::::)、stat、fstat(::)、fstatat(::::)、lstat(::)、getattrlistat(:::::_:) 宣言コード DDA9.1 デバイスを使用している人にファイルのタイムスタンプを表示したい場合。注：この理由を宣言すると、情報はデバイス外に送信されません。 C617.1 アプリコンテナ、アプリグループコンテナ、またはアプリのCloudKitコンテナ内のファイルのタイムスタンプ、サイズ、またはその他のメタデータにアクセスします。 3B52.1 ユーザーが特にアクセスを許可したファイルやディレクトリのタイムスタンプ、サイズ、またはその他のメタデータにアクセスします。例えば、ドキュメントピッカービューコントローラーを使用する場合などです。 0A2A.1 サードパーティのSDKがアプリが使用するためのファイルタイムスタンプAPIの周りにラッパー機能を提供しており、アプリがラッパー機能を呼び出すときのみファイルタイムスタンプAPIにアクセスします。要約すると、システムネイティブのファイルピッカーを使用してユーザーが選択したファイルのみを読み取る場合は3B52.1を使用します。情報を表示するだけで保存やアップロードを行わない場合はDDA9.1を使用します。アプリ、アプリグループ、またはCloudKit内でこの情報にアクセスして使用する場合はC617.1を使用します。 私のアプリは、ユーザーが(iOSシステムネイティブのファイルピッカーを使用して)選択したファイルのタイムスタンプにのみアクセスするため、以下の設定を行いました： システム起動時間API APIタイプは&#160;NSPrivacyAccessedAPICategorySystemBootTime&#160;です。 APIメソッド systemUptimemach_absolute_time() [&#8230;]</p>
<p>The post <a href="https://mszpro.com/itms-91053-ja">「ITMS-91053: Missing API declaration」アプリのプライバシーレポートでのAPI使用宣言（iOSアプリを審査に提出したら）</a> first appeared on <a href="https://mszpro.com">MszPro・株式会社Smartソフト</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Qiita: <a href="https://qiita.com/mashunzhe/items/d2c035c0d4794a6bf211">https://qiita.com/mashunzhe/items/d2c035c0d4794a6bf211</a></p>



<p>Medium (English version): <a href="https://medium.com/@MszPro/itms-91053-missing-api-declaration-for-accessing-userdefaults-timestamps-other-apis-d5c0cbf84a5e">https://medium.com/@MszPro/itms-91053-missing-api-declaration-for-accessing-userdefaults-timestamps-other-apis-d5c0cbf84a5e</a></p>



<p>App Storeにアップデートを提出しようとして、以下のメールを受け取ったことはありますか？</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/45af16bf71c269d45199087bbe72ac85cc03f09f/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f62623266323134382d663963612d626630662d643638322d3162343431663434626366662e706e67"><img fetchpriority="high" decoding="async" width="1400" height="1007" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbb2f2148-f9ca-bf0f-d682-1b441f44bcff.png" alt="image.png" class="wp-image-374" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbb2f2148-f9ca-bf0f-d682-1b441f44bcff-300x216.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbb2f2148-f9ca-bf0f-d682-1b441f44bcff-1024x737.png 1024w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbb2f2148-f9ca-bf0f-d682-1b441f44bcff-768x552.png 768w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbb2f2148-f9ca-bf0f-d682-1b441f44bcff.png 1400w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>



<p>WWDC 2023で明らかになったように、UserDefaultsのようなAPIを使用する場合は、プライバシーレポートを作成する必要があります。2024年5月1日から、このようなプライバシー宣言なしで新しいアプリのビルドをアップロードすることは許可されません。<br>プライバシーレポートを作成するには、以下の手順に従ってください：</p>



<p>まず、プロジェクトに新しいファイルを作成します：</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/0b8886b52182f6fade1d03478d04eeef366000fc/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f31613161343633332d313365352d313664392d343065312d6138333066636566373833332e706e67"><img decoding="async" width="1400" height="790" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F1a1a4633-13e5-16d9-40e1-a830fcef7833.png" alt="image.png" class="wp-image-372" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F1a1a4633-13e5-16d9-40e1-a830fcef7833-300x169.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F1a1a4633-13e5-16d9-40e1-a830fcef7833-1024x578.png 1024w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F1a1a4633-13e5-16d9-40e1-a830fcef7833-768x433.png 768w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F1a1a4633-13e5-16d9-40e1-a830fcef7833.png 1400w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>



<p>そのファイルのタイプは「App Privacy」と呼ばれます</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/ce6510cc040b0e849cf0b8a05d2de53c6c4eec74/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f62643962623336652d383765362d633164382d383364622d6466636166626338303662312e706e67"><img decoding="async" width="1400" height="1018" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbd9bb36e-87e6-c1d8-83db-dfcafbc806b1.png" alt="image.png" class="wp-image-362" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbd9bb36e-87e6-c1d8-83db-dfcafbc806b1-300x218.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbd9bb36e-87e6-c1d8-83db-dfcafbc806b1-1024x745.png 1024w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbd9bb36e-87e6-c1d8-83db-dfcafbc806b1-768x558.png 768w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbd9bb36e-87e6-c1d8-83db-dfcafbc806b1.png 1400w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>



<p>このファイルが適用されるターゲットに対してファイルをリンクする必要があります。例えば、UserDefaultsをすべてのアプリターゲット内で使用している場合、このファイルをそれら全てに適用します：</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/4adb99036ebaae95098ea98673f443774a5ae26a/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f63343734636162642d353234662d336163372d333363372d3366396561303130343962632e706e67"><img loading="lazy" decoding="async" width="1400" height="814" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fc474cabd-524f-3ac7-33c7-3f9ea01049bc.png" alt="image.png" class="wp-image-373" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fc474cabd-524f-3ac7-33c7-3f9ea01049bc-300x174.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fc474cabd-524f-3ac7-33c7-3f9ea01049bc-1024x595.png 1024w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fc474cabd-524f-3ac7-33c7-3f9ea01049bc-768x447.png 768w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fc474cabd-524f-3ac7-33c7-3f9ea01049bc.png 1400w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></a></figure>



<p>アプリのプライバシー設定内には、主に4つのカテゴリーがあります：</p>



<figure class="wp-block-image"><img decoding="async" src="https://mszpro.com/content/images/2024/03/----------2024-03-21-16.17.44.png" alt=""/></figure>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/d7f7a6399ef701069fb42802a546eac6cb2b7b5b/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f38363835663662332d343965612d383232372d633864622d3835383035353330653765362e706e67"><img loading="lazy" decoding="async" width="1400" height="355" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F8685f6b3-49ea-8227-c8db-85805530e7e6.png" alt="image.png" class="wp-image-370" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F8685f6b3-49ea-8227-c8db-85805530e7e6-300x76.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F8685f6b3-49ea-8227-c8db-85805530e7e6-1024x260.png 1024w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F8685f6b3-49ea-8227-c8db-85805530e7e6-768x195.png 768w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F8685f6b3-49ea-8227-c8db-85805530e7e6.png 1400w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></a></figure>



<p>注：いつでも、生のキーや英語の説明タイトルの間で切り替えることができます。白いエリアを右クリックして生の値の切り替えを使用してください。</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/f2ca99fb33192057aeebe63d69485a785f4dc29d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f32353034313434302d306462652d383162652d656261302d3165396265363534363062622e706e67"><img loading="lazy" decoding="async" width="783" height="659" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F25041440-0dbe-81be-eba0-1e9be65460bb.png" alt="image.png" class="wp-image-365" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F25041440-0dbe-81be-eba0-1e9be65460bb-300x252.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F25041440-0dbe-81be-eba0-1e9be65460bb-768x646.png 768w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F25041440-0dbe-81be-eba0-1e9be65460bb.png 783w" sizes="auto, (max-width: 783px) 100vw, 783px" /></a></figure>



<p>以下は、私のアプリがユーザーを追跡せず、ユーザーIDをユーザー登録に使用するが追跡には使用しない、そしてUserDefaultsフレームワークを使用してメインアプリとウィジェット間で設定を保存する場合の、完成したファイルの例です。</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/39f04c3d354cf0238caea05f7ca986322b36bdd9/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f63316466356537382d623832652d626137322d366434642d6363363439323463636134642e706e67"><img loading="lazy" decoding="async" width="787" height="332" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fc1df5e78-b82e-ba72-6d4d-cc64924cca4d.png" alt="image.png" class="wp-image-368" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fc1df5e78-b82e-ba72-6d4d-cc64924cca4d-300x127.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fc1df5e78-b82e-ba72-6d4d-cc64924cca4d-768x324.png 768w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fc1df5e78-b82e-ba72-6d4d-cc64924cca4d.png 787w" sizes="auto, (max-width: 787px) 100vw, 787px" /></a></figure>



<h2 class="wp-block-heading">プライバシーがアクセスしたAPIのタイプ</h2>



<p>これは、UserDefaultsやその他のAPIを使用する理由を宣言する必要がある場所です。宣言する必要があるAPIの完全なリストはこちらです：<br><a href="https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api" target="_blank" rel="noreferrer noopener">https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api</a></p>



<p>プライバシーがアクセスしたAPIのタイプを選択してエンターキーを押し、新しい辞書エントリを作成します。</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/c982cb0a2b47f493f31ef462f6421380e8fcc5cb/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f64636365386563392d363138622d313738352d333638312d6535663366626636643361612e706e67"><img loading="lazy" decoding="async" width="650" height="281" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fdcce8ec9-618b-1785-3681-e5f3fbf6d3aa.png" alt="image.png" class="wp-image-364" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fdcce8ec9-618b-1785-3681-e5f3fbf6d3aa-300x130.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fdcce8ec9-618b-1785-3681-e5f3fbf6d3aa.png 650w" sizes="auto, (max-width: 650px) 100vw, 650px" /></a></figure>



<p>この項目を展開し、エンターキーを押してプロパティを追加します。2つのプロパティが必要で、「プライバシーがアクセスしたAPIタイプ」はAPIのタイプを宣言し、「プライバシーがアクセスしたAPI理由」はアプリがそのデータが必要な理由の配列です。</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/0eb23d644ff89b0bb015f09838895152c80c6a7e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f62366339346435342d386132392d306331302d336136322d3736393535383766336564622e706e67"><img loading="lazy" decoding="async" width="648" height="136" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fb6c94d54-8a29-0c10-3a62-7695587f3edb.png" alt="image.png" class="wp-image-369" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fb6c94d54-8a29-0c10-3a62-7695587f3edb-300x63.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fb6c94d54-8a29-0c10-3a62-7695587f3edb.png 648w" sizes="auto, (max-width: 648px) 100vw, 648px" /></a></figure>



<p>例えば、私のアプリがUserDefaultsを使用する場合、アクセスしたAPIタイプとしてUser Defaultsを入れます。</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/40affdcccb727c891e0a386e5a9868170cdf1294/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f65353563396333372d373766642d316461372d626162372d3531386639373135633737622e706e67"><img loading="lazy" decoding="async" width="650" height="169" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fe55c9c37-77fd-1da7-bab7-518f9715c77b.png" alt="image.png" class="wp-image-361" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fe55c9c37-77fd-1da7-bab7-518f9715c77b-300x78.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fe55c9c37-77fd-1da7-bab7-518f9715c77b.png 650w" sizes="auto, (max-width: 650px) 100vw, 650px" /></a></figure>



<p>その後、このデータへのアクセス理由のコードを記入します。各APIタイプごとに異なるコードのセットがあります：</p>



<h3 class="wp-block-heading">UserDefaults</h3>



<p>UserDefaultsを使用してユーザー設定を保存する場合、理由を宣言する必要があります。APIタイプは&nbsp;<code>NSPrivacyAccessedAPICategoryUserDefaults</code>&nbsp;と呼ばれます。</p>



<h4 class="wp-block-heading">CA92.1</h4>



<p>アプリ自身だけがアクセス可能な情報を読み書きするためにユーザーデフォルトにアクセスします。<br>注意：このコードを宣言する場合、アプリグループ内でUserDefaultsの値を共有することはできません（アプリとウィジェット間でデータを共有することはできません）</p>



<h4 class="wp-block-heading">1C8F.1</h4>



<p>アプリ自体と同じアプリグループのメンバーであるアプリ、アプリ拡張、App Clipsのみがアクセス可能な情報を読み書きするためにユーザーデフォルトにアクセスします。<br>注意：この理由でも、同じアプリグループ外のアプリ、アプリ拡張、App Clipsがアクセスできる情報を書き込むことは許可されません。</p>



<h4 class="wp-block-heading">C56D.1</h4>



<p>サードパーティのSDKがアプリが使用するためのユーザーデフォルトAPIを囲むラッパー機能を提供しており、アプリがラッパー機能を呼び出すときのみユーザーデフォルトAPIにアクセスします。<br>注意：この理由でアクセスされた情報、または派生した情報は、サードパーティSDK自身の目的のために使用されたり、サードパーティSDKによってデバイス外に送信されることはできません。</p>



<p>例えば、私のアプリがUserDefaultsを使用して、メインiOSアプリとウィジェット間でユーザーの現在の都市を共有し、天気を表示する場合、<code>1C8F.1</code>を使用する必要があります。</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/59f5187ec2c5241d425cdf363512c5a70c39f531/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f35373233323637342d613735632d613431622d353338392d6537373365303636366637652e706e67"><img loading="lazy" decoding="async" width="785" height="126" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F57232674-a75c-a41b-5389-e773e0666f7e.png" alt="image.png" class="wp-image-363" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F57232674-a75c-a41b-5389-e773e0666f7e-300x48.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F57232674-a75c-a41b-5389-e773e0666f7e-768x123.png 768w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F57232674-a75c-a41b-5389-e773e0666f7e.png 785w" sizes="auto, (max-width: 785px) 100vw, 785px" /></a></figure>



<p>ウィジェットやアプリグループを持っていない場合は、コード<code>CA92.1</code>を使用できますが、将来的にはコードを<code>1C8F.1</code>に変更することを忘れないでください。そうしないと、UserDefaultsのデータがアプリ自身にのみ制限される可能性があります。</p>



<h2 class="wp-block-heading">ファイルタイムスタンプAPI</h2>



<p>これらは、ファイルのタイムスタンプにアクセスするためのAPIであり、<code>creationDate</code>、<code>modificationDate</code>などを含みます。</p>



<p>APIタイプは<code>NSPrivacyAccessedAPICategoryFileTimestamp</code>と呼ばれます。</p>



<h3 class="wp-block-heading">APIメソッド</h3>



<p>creationDate、modificationDate、fileModificationDate、contentModificationDateKey、creationDateKey、getattrlist(:::::)、getattrlistbulk(:::::)、fgetattrlist(:::::)、stat、fstat(::)、fstatat(::::)、lstat(::)、getattrlistat(:::::_:)</p>



<h3 class="wp-block-heading">宣言コード</h3>



<h4 class="wp-block-heading">DDA9.1</h4>



<p>デバイスを使用している人にファイルのタイムスタンプを表示したい場合。<br>注：この理由を宣言すると、情報はデバイス外に送信されません。</p>



<h4 class="wp-block-heading">C617.1</h4>



<p>アプリコンテナ、アプリグループコンテナ、またはアプリのCloudKitコンテナ内のファイルのタイムスタンプ、サイズ、またはその他のメタデータにアクセスします。</p>



<h4 class="wp-block-heading">3B52.1</h4>



<p>ユーザーが特にアクセスを許可したファイルやディレクトリのタイムスタンプ、サイズ、またはその他のメタデータにアクセスします。例えば、ドキュメントピッカービューコントローラーを使用する場合などです。</p>



<h4 class="wp-block-heading">0A2A.1</h4>



<p>サードパーティのSDKがアプリが使用するためのファイルタイムスタンプAPIの周りにラッパー機能を提供しており、アプリがラッパー機能を呼び出すときのみファイルタイムスタンプAPIにアクセスします。<br>要約すると、システムネイティブのファイルピッカーを使用してユーザーが選択したファイルのみを読み取る場合は3B52.1を使用します。情報を表示するだけで保存やアップロードを行わない場合はDDA9.1を使用します。アプリ、アプリグループ、またはCloudKit内でこの情報にアクセスして使用する場合はC617.1を使用します。</p>



<p>私のアプリは、ユーザーが(iOSシステムネイティブのファイルピッカーを使用して)選択したファイルのタイムスタンプにのみアクセスするため、以下の設定を行いました：</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/45aab8eb1cabe3bbbf45882b78deaf5e0c9ab422/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f62316662323132662d613961612d333735352d623865342d3065663061636630653831322e706e67"><img loading="lazy" decoding="async" width="790" height="136" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fb1fb212f-a9aa-3755-b8e4-0ef0acf0e812.png" alt="image.png" class="wp-image-371" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fb1fb212f-a9aa-3755-b8e4-0ef0acf0e812-300x52.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fb1fb212f-a9aa-3755-b8e4-0ef0acf0e812-768x132.png 768w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fb1fb212f-a9aa-3755-b8e4-0ef0acf0e812.png 790w" sizes="auto, (max-width: 790px) 100vw, 790px" /></a></figure>



<h2 class="wp-block-heading">システム起動時間API</h2>



<p>APIタイプは&nbsp;<code>NSPrivacyAccessedAPICategorySystemBootTime</code>&nbsp;です。</p>



<h3 class="wp-block-heading">APIメソッド</h3>



<p>systemUptime<br>mach_absolute_time()</p>



<h4 class="wp-block-heading">35F9.1</h4>



<p>アプリ内で発生したイベント間の経過時間を測定したり、タイマーを有効にするための計算を実行するために、システム起動時間にアクセスします。このデータをデバイス外に送信することはできません。</p>



<h4 class="wp-block-heading">8FFB.1</h4>



<p>UIKitやAVFAudioフレームワークに関連するイベントなど、アプリ内で発生したイベントの絶対タイムスタンプを計算します。</p>



<h4 class="wp-block-heading">3D61.1</h4>



<p>ユーザーが提出を選択したバグレポートにおいて。システム起動時間情報はレポートの一部としてユーザーに顕著に表示されなければなりません。</p>



<h2 class="wp-block-heading">ディスクスペースAPI</h2>



<p>APIタイプは&nbsp;<code>NSPrivacyAccessedAPICategoryDiskSpace</code>&nbsp;です。</p>



<h3 class="wp-block-heading">APIメソッド</h3>



<p>volumeAvailableCapacityKey<br>volumeAvailableCapacityForImportantUsageKey<br>volumeAvailableCapacityForOpportunisticUsageKey<br>volumeTotalCapacityKey<br>systemFreeSize<br>systemSize<br>statfs(::)<br>statvfs(::)<br>fstatfs(::)<br>fstatvfs(::)<br>getattrlist(::::<em>🙂</em><br><em>fgetattrlist(::::</em>🙂<br>getattrlistat(::::::)</p>



<h4 class="wp-block-heading">85F4.1</h4>



<p>デバイスを使用している人にディスクスペース情報を表示します（表示のみで、この情報をデバイス外に送信することは含まれません）。</p>



<h4 class="wp-block-heading">E174.1</h4>



<p>ファイルを書き込むための十分なディスクスペースがあるかを確認する、またはディスクスペースが少ない場合にアプリがファイルを削除できるようにするためにディスクスペースが低いかをチェックします。</p>



<h4 class="wp-block-heading">7D9E.1</h4>



<p>バグレポートに使用されますが、ユーザーが提出するかどうかを選択するオプショナルな情報でなければなりません。</p>



<h4 class="wp-block-heading">B728.1</h4>



<p>健康研究アプリで、このAPIカテゴリにアクセスして、研究データ収集に影響を与える低ディスクスペースを研究参加者に知らせます。</p>



<h2 class="wp-block-heading">アクティブなキーボードのアクセスリスト</h2>



<p>APIタイプは&nbsp;<code>NSPrivacyAccessedAPICategoryActiveKeyboards</code>&nbsp;です。</p>



<h3 class="wp-block-heading">APIメソッド</h3>



<p>activeInputModes</p>



<h4 class="wp-block-heading">3EC4.1</h4>



<p>あなたのアプリがカスタムキーボードアプリであり、デバイス上でアクティブなキーボードを特定するためにこのAPIカテゴリにアクセスするときに使用します。</p>



<h4 class="wp-block-heading">54BD.1</h4>



<p>デバイスを使用している人に正しいカスタマイズされたユーザーインターフェースを提示するためにアクティブなキーボード情報にアクセスします。アプリはテキストの入力や編集のためのテキストフィールドを持ち、ユーザーに観察可能な方法でアクティブなキーボードに基づいて異なる振る舞いをする必要があります。</p>



<h2 class="wp-block-heading">プライバシー トラッキング有効 (Privacy Tracking Enabled)</h2>



<p>このブール値は、アプリがユーザー情報をトラッキング目的で使用するかどうかを示します。</p>



<h2 class="wp-block-heading">プライバシー トラッキングドメイン (Privacy Tracking Domains)</h2>



<p>これは、ドメインホスト名の文字列値の配列を含む文字列配列です。これらはトラッキング関連目的で使用されるドメインです。トラッキングに使用されないドメインを記載しないでください。なぜなら、ユーザーがアプリにトラッキングしないように求めた場合、これらのドメインへのネットワークリクエストは失敗するからです。</p>



<h2 class="wp-block-heading">プライバシーナビゲーションラベルタイプ (Privacy Nutrition Label Types)</h2>



<p>ここでは、アプリが収集するデータのタイプと、これらを収集する理由を宣言します。プライバシーナビゲーションラベルタイプを選択してエンターキーを押すと、必要な情報を含む新しいエントリが自動的に作成されます。</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/052fbcebd24bdeb3282de267e11afb9b1468beab/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f36353134643463622d663035352d616561342d396439332d3031326665373464626463352e706e67"><img loading="lazy" decoding="async" width="647" height="397" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F6514d4cb-f055-aea4-9d93-012fe74dbdc5.png" alt="image.png" class="wp-image-375" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F6514d4cb-f055-aea4-9d93-012fe74dbdc5-300x184.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F6514d4cb-f055-aea4-9d93-012fe74dbdc5.png 647w" sizes="auto, (max-width: 647px) 100vw, 647px" /></a></figure>



<p>収集データタイプのドロップダウンメニューを選択できます。これは、私たちが収集するデータのタイプを示します。例えば、ここではユーザーのメールアドレスを選択できます。</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/d8a662b157d513405ff2e8d66cb4bec1c63d7dd9/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f36313536633262652d363834352d323039642d366537362d6539393063623230323332312e706e67"><img loading="lazy" decoding="async" width="649" height="258" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F6156c2be-6845-209d-6e76-e990cb202321.png" alt="image.png" class="wp-image-367" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F6156c2be-6845-209d-6e76-e990cb202321-300x119.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302F6156c2be-6845-209d-6e76-e990cb202321.png 649w" sizes="auto, (max-width: 649px) 100vw, 649px" /></a></figure>



<p>データタイプの完全なリストはこちらにあります：<a href="https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests" target="_blank" rel="noreferrer noopener">https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests</a></p>



<p>次に、データがユーザーにリンクされているかどうかを回答します（例えば、メールアドレスがユーザープロファイルにリンクされている場合、これをYESに設定する必要があります）。そして、データがトラッキング目的で使用されているかどうか。</p>



<p>その後、コレクション目的の配列に、アプリがこの情報を必要とする理由を追加します（例えば、ユーザーアカウントの登録にメールアドレスが必要な場合、アプリ機能 (App Functionarlity) を選択できます。</p>



<figure class="wp-block-image"><a href="https://camo.qiitausercontent.com/d8dc880644242dbbb95b65a42ffcb976b9a7d903/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353333302f62626632616439322d393038612d353863352d656430322d6131633839383963373732652e706e67"><img loading="lazy" decoding="async" width="650" height="254" src="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbbf2ad92-908a-58c5-ed02-a1c8989c772e.png" alt="image.png" class="wp-image-366" srcset="https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbbf2ad92-908a-58c5-ed02-a1c8989c772e-300x117.png 300w, https://static-assets.mszpro.com/2024/12/https3A2F2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com2F02F6353302Fbbf2ad92-908a-58c5-ed02-a1c8989c772e.png 650w" sizes="auto, (max-width: 650px) 100vw, 650px" /></a></figure>



<p>これは、App Store Connectでプライバシーに関する質問に答える方法と似ています。</p><p>The post <a href="https://mszpro.com/itms-91053-ja">「ITMS-91053: Missing API declaration」アプリのプライバシーレポートでのAPI使用宣言（iOSアプリを審査に提出したら）</a> first appeared on <a href="https://mszpro.com">MszPro・株式会社Smartソフト</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ITMS-91053: Missing API declaration — for accessing UserDefaults, timestamps &#038; other APIs</title>
		<link>https://mszpro.com/itms-91053-missing-api-declaration-for-accessing-userdefaults-timestamps-other-apis</link>
		
		<dc:creator><![CDATA[msz]]></dc:creator>
		<pubDate>Mon, 16 Dec 2024 07:37:38 +0000</pubDate>
				<category><![CDATA[API Deprecation]]></category>
		<category><![CDATA[App Store]]></category>
		<guid isPermaLink="false">https://mszpro.com/?p=342</guid>

					<description><![CDATA[<p>Have you tried to submit an update to App Store and received the following email? It is known from the WWDC 2023 that you have to create a privacy report when you use APIs like UserDefaults. Starting from May 1, 2024, uploading new builds of apps without such a privacy declaration will not be allowed. [&#8230;]</p>
<p>The post <a href="https://mszpro.com/itms-91053-missing-api-declaration-for-accessing-userdefaults-timestamps-other-apis">ITMS-91053: Missing API declaration — for accessing UserDefaults, timestamps & other APIs</a> first appeared on <a href="https://mszpro.com">MszPro・株式会社Smartソフト</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Have you tried to submit an update to App Store and received the following email?</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1400" height="1007" src="https://static-assets.mszpro.com/2024/12/1XdTkRpRrYTGjWA1Z45r4gw.png" alt="" class="wp-image-358" srcset="https://static-assets.mszpro.com/2024/12/1XdTkRpRrYTGjWA1Z45r4gw-300x216.png 300w, https://static-assets.mszpro.com/2024/12/1XdTkRpRrYTGjWA1Z45r4gw-1024x737.png 1024w, https://static-assets.mszpro.com/2024/12/1XdTkRpRrYTGjWA1Z45r4gw-768x552.png 768w, https://static-assets.mszpro.com/2024/12/1XdTkRpRrYTGjWA1Z45r4gw.png 1400w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></figure>



<p>It is known from the WWDC 2023 that you have to create a privacy report when you use APIs like UserDefaults. Starting from May 1, 2024, uploading new builds of apps without such a privacy declaration will not be allowed.</p>



<p>To create a privacy report, follow these steps:</p>



<p>First, create a new file in your project:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1400" height="790" src="https://static-assets.mszpro.com/2024/12/1MuWRQdmxXOdCP_fFksULhw.png" alt="" class="wp-image-357" srcset="https://static-assets.mszpro.com/2024/12/1MuWRQdmxXOdCP_fFksULhw-300x169.png 300w, https://static-assets.mszpro.com/2024/12/1MuWRQdmxXOdCP_fFksULhw-1024x578.png 1024w, https://static-assets.mszpro.com/2024/12/1MuWRQdmxXOdCP_fFksULhw-768x433.png 768w, https://static-assets.mszpro.com/2024/12/1MuWRQdmxXOdCP_fFksULhw.png 1400w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></figure>



<p>The type of the file is called&nbsp;<code>App Privacy</code></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1400" height="1018" src="https://static-assets.mszpro.com/2024/12/1n0J3AP8gGdaGCjAOzPgWAw.png" alt="" class="wp-image-354" srcset="https://static-assets.mszpro.com/2024/12/1n0J3AP8gGdaGCjAOzPgWAw-300x218.png 300w, https://static-assets.mszpro.com/2024/12/1n0J3AP8gGdaGCjAOzPgWAw-1024x745.png 1024w, https://static-assets.mszpro.com/2024/12/1n0J3AP8gGdaGCjAOzPgWAw-768x558.png 768w, https://static-assets.mszpro.com/2024/12/1n0J3AP8gGdaGCjAOzPgWAw.png 1400w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></figure>



<p>You should link the file against the target that this file applies to. For example, if I use&nbsp;<code>UserDefaults</code>&nbsp;within all my app targets, I will apply this file to all of them:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1400" height="814" src="https://static-assets.mszpro.com/2024/12/14CVPsWdBwWOLZfC1lIM49A.png" alt="" class="wp-image-355" srcset="https://static-assets.mszpro.com/2024/12/14CVPsWdBwWOLZfC1lIM49A-300x174.png 300w, https://static-assets.mszpro.com/2024/12/14CVPsWdBwWOLZfC1lIM49A-1024x595.png 1024w, https://static-assets.mszpro.com/2024/12/14CVPsWdBwWOLZfC1lIM49A-768x447.png 768w, https://static-assets.mszpro.com/2024/12/14CVPsWdBwWOLZfC1lIM49A.png 1400w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></figure>



<p>There are 4 main categories within the app privacy configuration:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1400" height="1465" src="https://static-assets.mszpro.com/2024/12/1oGdE2MwP0uQXOdC_SY6gXQ.png" alt="" class="wp-image-356" srcset="https://static-assets.mszpro.com/2024/12/1oGdE2MwP0uQXOdC_SY6gXQ-287x300.png 287w, https://static-assets.mszpro.com/2024/12/1oGdE2MwP0uQXOdC_SY6gXQ-979x1024.png 979w, https://static-assets.mszpro.com/2024/12/1oGdE2MwP0uQXOdC_SY6gXQ-768x804.png 768w, https://static-assets.mszpro.com/2024/12/1oGdE2MwP0uQXOdC_SY6gXQ.png 1400w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1400" height="355" src="https://static-assets.mszpro.com/2024/12/1JcGMRR1vX3zEML0jn8_TKw.png" alt="" class="wp-image-352" srcset="https://static-assets.mszpro.com/2024/12/1JcGMRR1vX3zEML0jn8_TKw-300x76.png 300w, https://static-assets.mszpro.com/2024/12/1JcGMRR1vX3zEML0jn8_TKw-1024x260.png 1024w, https://static-assets.mszpro.com/2024/12/1JcGMRR1vX3zEML0jn8_TKw-768x195.png 768w, https://static-assets.mszpro.com/2024/12/1JcGMRR1vX3zEML0jn8_TKw.png 1400w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></figure>



<p>Note: at any time, you can switch between the raw key values and the English descriptive title by right clicking the white area and use the raw value toggle:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="783" height="659" src="https://static-assets.mszpro.com/2024/12/1Nx2MXguxwZYassJsyYtmag.png" alt="" class="wp-image-353" srcset="https://static-assets.mszpro.com/2024/12/1Nx2MXguxwZYassJsyYtmag-300x252.png 300w, https://static-assets.mszpro.com/2024/12/1Nx2MXguxwZYassJsyYtmag-768x646.png 768w, https://static-assets.mszpro.com/2024/12/1Nx2MXguxwZYassJsyYtmag.png 783w" sizes="auto, (max-width: 783px) 100vw, 783px" /></figure>



<p>Here is an example of the completed file, where my app does not track the user, uses the User ID for user registration (but does not use it for tracking), and uses UserDefaults framework to store preferences across my main app and widgets.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="787" height="332" src="https://static-assets.mszpro.com/2024/12/1MW23jZZEwuPhZ5vrJkitSQ.png" alt="" class="wp-image-344" srcset="https://static-assets.mszpro.com/2024/12/1MW23jZZEwuPhZ5vrJkitSQ-300x127.png 300w, https://static-assets.mszpro.com/2024/12/1MW23jZZEwuPhZ5vrJkitSQ-768x324.png 768w, https://static-assets.mszpro.com/2024/12/1MW23jZZEwuPhZ5vrJkitSQ.png 787w" sizes="auto, (max-width: 787px) 100vw, 787px" /></figure>



<h1 class="wp-block-heading">Privacy Accessed API Types (Necessary)</h1>



<p>This is where you need to declare the reason for using UserDefaults and other APIs. The full list of API that you need to declare is here:&nbsp;<a href="https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api" target="_blank" rel="noreferrer noopener">https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api</a></p>



<p>Tap to select the&nbsp;<code>Privacy Accessed API Types</code>&nbsp;and hit enter to create a new dictionary entry.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="281" src="https://static-assets.mszpro.com/2024/12/1t70__vmu_WmuwpNfonuKGg.png" alt="" class="wp-image-349" srcset="https://static-assets.mszpro.com/2024/12/1t70__vmu_WmuwpNfonuKGg-300x130.png 300w, https://static-assets.mszpro.com/2024/12/1t70__vmu_WmuwpNfonuKGg.png 650w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<p>Now, expand this item and hit enter to add the property. Two of them are needed, where `Privacy Accessed API Type` declares the type of API, and `Privacy Accessed API Reasons` is an array of the reason of why your app needs that data.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="648" height="136" src="https://static-assets.mszpro.com/2024/12/1BzRZKUiHBld04XZq5DVIVQ.png" alt="" class="wp-image-345" srcset="https://static-assets.mszpro.com/2024/12/1BzRZKUiHBld04XZq5DVIVQ-300x63.png 300w, https://static-assets.mszpro.com/2024/12/1BzRZKUiHBld04XZq5DVIVQ.png 648w" sizes="auto, (max-width: 648px) 100vw, 648px" /></figure>



<p>For example, if my app uses&nbsp;<code>UserDefaults</code>&nbsp;you will put&nbsp;<code>User Defaults</code>&nbsp;as the accessed API type.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="169" src="https://static-assets.mszpro.com/2024/12/13L5vYw3-hStEIe0SGyO2QA.png" alt="" class="wp-image-350" srcset="https://static-assets.mszpro.com/2024/12/13L5vYw3-hStEIe0SGyO2QA-300x78.png 300w, https://static-assets.mszpro.com/2024/12/13L5vYw3-hStEIe0SGyO2QA.png 650w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<p>You will then put the code of the reason why you access this data. For each API Type, there is a different set of codes:</p>



<h2 class="wp-block-heading">UserDefaults</h2>



<p>If you use UserDefaults to store user preferences, you need to declare a reason. The API type is called `NSPrivacyAccessedAPICategoryUserDefaults`</p>



<p><code>CA92.1</code>Access user defaults to read and write information that is only accessible to the app itself.</p>



<p>Note: if you declare this code, you cannot share the UserDefaults value within an app group (you cannot share data between your app and widgets)</p>



<p><code>1C8F.1</code>Access user defaults to read and write information that is only accessible to the apps, app extensions, and App Clips that are members of the same App Group as the app itself.</p>



<p>Note: This reason also does not permit writing information that can be accessed by apps, app extensions, or App Clips outside the same App Group.</p>



<p><code>C56D.1</code>Third-party SDK is providing a wrapper function around user defaults API(s) for the app to use, and you only access the user defaults APIs when the app calls your wrapper function.</p>



<p>Note: Information accessed for this reason, or any derived information, may not be used for your third-party SDK’s own purposes or sent off-device by your third-party SDK.</p>



<p>For example, if my app uses UserDefaults to share the user current city for displaying whether, between the main iOS app and the widget, I need to use 1C8F.1</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="785" height="126" src="https://static-assets.mszpro.com/2024/12/1q3I-vEw6oH3bhZoieudbfw.png" alt="" class="wp-image-343" srcset="https://static-assets.mszpro.com/2024/12/1q3I-vEw6oH3bhZoieudbfw-300x48.png 300w, https://static-assets.mszpro.com/2024/12/1q3I-vEw6oH3bhZoieudbfw-768x123.png 768w, https://static-assets.mszpro.com/2024/12/1q3I-vEw6oH3bhZoieudbfw.png 785w" sizes="auto, (max-width: 785px) 100vw, 785px" /></figure>



<p>If you do not have a widget or an app group, you can use the code&nbsp;<code>CA92.1</code>&nbsp;, but in the future, remember to change the code to `1C8F.1`, otherwise the UserDefaults data might be restricted to only your app itself.</p>



<h2 class="wp-block-heading">File timestamp APIs</h2>



<p>These are the APIs to access the timestamps of a file, including the creationDate, modificationDate, etc.</p>



<p>The API type is called: `NSPrivacyAccessedAPICategoryFileTimestamp`</p>



<p>API methods:</p>



<p>creationDate modificationDate fileModificationDate contentModificationDateKey creationDateKey getattrlist(_:_:_:_:_:) getattrlistbulk(_:_:_:_:_:) fgetattrlist(_:_:_:_:_:) stat fstat(_:_:) fstatat(_:_:_:_:) lstat(_:_:) getattrlistat(_:_:_:_:_:_:)</p>



<p>Declaration codes:</p>



<p><code>DDA9.1</code>You are looking to display file timestamps to the person using the device.</p>



<p>Note: if you declare this reason the information may not be sent off-device.</p>



<p><code>C617.1</code>Access the timestamps, size, or other metadata of files inside the app container, app group container, or the app’s CloudKit container.</p>



<p><code>3B52.1</code>Access the timestamps, size, or other metadata of files or directories that the user specifically granted access to, such as using a document picker view controller.</p>



<p><code>0A2A.1</code>Declare this reason if your third-party SDK is providing a wrapper function around file timestamp API(s) for the app to use, and you only access the file timestamp APIs when the app calls your wrapper function.</p>



<p><strong>To summarize,</strong>&nbsp;use&nbsp;<code>3B52.1</code>&nbsp;if you are reading only the files picked by the user using the system native file picker. Use&nbsp;<code>DDA9.1</code>&nbsp;if you are only showing the information and not storing or uploading it. Use&nbsp;<code>C617.1</code>&nbsp;if you are accessing and using this information within the app, app group, or CloudKit.</p>



<p>My app only accesses timestamps of the files picked by the user (using the iOS system native file picker), so I have set the following:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="790" height="136" src="https://static-assets.mszpro.com/2024/12/10I3D-pVxjLuZaaf9BGzc_A.png" alt="" class="wp-image-346" srcset="https://static-assets.mszpro.com/2024/12/10I3D-pVxjLuZaaf9BGzc_A-300x52.png 300w, https://static-assets.mszpro.com/2024/12/10I3D-pVxjLuZaaf9BGzc_A-768x132.png 768w, https://static-assets.mszpro.com/2024/12/10I3D-pVxjLuZaaf9BGzc_A.png 790w" sizes="auto, (max-width: 790px) 100vw, 790px" /></figure>



<h2 class="wp-block-heading">System boot time APIs</h2>



<p>systemUptime mach_absolute_time()</p>



<p>The API type is `NSPrivacyAccessedAPICategorySystemBootTime`</p>



<p><code>35F9.1</code>Access the system boot time in order to measure the amount of time that has elapsed between events that occurred within the app or to perform calculations to enable timers. You cannot send this data off this device.</p>



<p><code>8FFB.1</code>&nbsp;Calculate absolute timestamps for events that occurred within your app, such as events related to the UIKit or AVFAudio frameworks.</p>



<p><code>3D61.1</code>In bug report that the person chooses to submit. The system boot time information must be prominently displayed to the person as part of the report.</p>



<h2 class="wp-block-heading">Disk space APIs</h2>



<p>volumeAvailableCapacityKey volumeAvailableCapacityForImportantUsageKey volumeAvailableCapacityForOpportunisticUsageKey volumeTotalCapacityKey systemFreeSize systemSize statfs(_:_:) statvfs(_:_:) fstatfs(_:_:) fstatvfs(_:_:) getattrlist(_:_:_:_:_:) fgetattrlist(_:_:_:_:_:) getattrlistat(_:_:_:_:_:_:)</p>



<p>The API type is `NSPrivacyAccessedAPICategoryDiskSpace`</p>



<p><code>85F4.1</code>Display disk space information to the person using the device (display only, not including sending this information off the device)</p>



<p><code>E174.1</code>Check whether there is sufficient disk space to write files, or to check whether the disk space is low so that the app can delete files when the disk space is low.</p>



<p><code>7D9E.1</code>Used in bug report. But needs to be optional information selected by the user whether to submit or not.</p>



<p><code>B728.1</code>Health research app, and you access this API category to detect and inform research participants about low disk space impacting the research data collection.</p>



<h2 class="wp-block-heading">Access list of active keyboards</h2>



<p>activeInputModes</p>



<p>The API type is `NSPrivacyAccessedAPICategoryActiveKeyboards`</p>



<p><code>3EC4.1</code>Used when your app is a custom keyboard app, and you access this API category to determine the keyboards that are active on the device.</p>



<p><code>54BD.1</code>Access active keyboard information to present the correct customized user interface to the person using the device. The app must have text fields for entering or editing text and must behave differently based on active keyboards in a way that is observable to users.</p>



<h1 class="wp-block-heading">Privacy Tracking Enabled</h1>



<p>This boolean value indicates whether your app uses user information for tracking.</p>



<h1 class="wp-block-heading">Privacy Tracking Domains</h1>



<p>This is a string array containing an array of String values (of domain hostnames). These are the domains used for tracking related purposes. Do not put domains that are not used for tracking, since the network requests to these domains will fail if the user has asked the app not to track.</p>



<h1 class="wp-block-heading">Privacy Nutrition Label Types</h1>



<p>Here you will declare the type of the data your app collects and the reason for collecting these. If you select the `Privacy Nutrition Label Types` and hit enter, a new entry will be automatically created with the required information.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="647" height="397" src="https://static-assets.mszpro.com/2024/12/1baAb2ixV5NYPzVPx_rP2hQ.png" alt="" class="wp-image-351" srcset="https://static-assets.mszpro.com/2024/12/1baAb2ixV5NYPzVPx_rP2hQ-300x184.png 300w, https://static-assets.mszpro.com/2024/12/1baAb2ixV5NYPzVPx_rP2hQ.png 647w" sizes="auto, (max-width: 647px) 100vw, 647px" /></figure>



<p>Now, we can select the dropdown menu of the&nbsp;<code>Collected Data Type</code>&nbsp;, which indicates the type of data we collect. For example, here we can select user email.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="649" height="258" src="https://static-assets.mszpro.com/2024/12/1dVJ8ALgnpvIrA5jxOdoIYw.png" alt="" class="wp-image-347" srcset="https://static-assets.mszpro.com/2024/12/1dVJ8ALgnpvIrA5jxOdoIYw-300x119.png 300w, https://static-assets.mszpro.com/2024/12/1dVJ8ALgnpvIrA5jxOdoIYw.png 649w" sizes="auto, (max-width: 649px) 100vw, 649px" /></figure>



<p>A full list of the data types is located here:&nbsp;<a href="https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests" target="_blank" rel="noreferrer noopener">https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests</a></p>



<p>Now, you will answer whether the data is linked to the user (for example, in the case of an email address, if it is linked to the user’s profile, you should set this to YES). And whether the data is used for tracking.</p>



<p>Then, in the&nbsp;<code>Collection Purposes</code>&nbsp;array, you will add reasons why your app needs this information. (for example, if the user account registration requires email, you can select&nbsp;<code>App Functionality</code>&nbsp;.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="254" src="https://static-assets.mszpro.com/2024/12/1eH5yMB1QGOVdZSM6RlJ9Ig.png" alt="" class="wp-image-348" srcset="https://static-assets.mszpro.com/2024/12/1eH5yMB1QGOVdZSM6RlJ9Ig-300x117.png 300w, https://static-assets.mszpro.com/2024/12/1eH5yMB1QGOVdZSM6RlJ9Ig.png 650w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<p>This is similar to how you answer the privacy questions on App Store Connect.</p>



<h1 class="wp-block-heading">Official WWDC session video</h1>



<p><a href="https://developer.apple.com/documentation/bundleresources/describing_data_use_in_privacy_manifests" target="_blank" rel="noreferrer noopener">Describing data use in privacy manifests | Apple Developer DocumentationDeclare the data collected by your app or by third-party SDKs.developer.apple.com</a></p>



<p><a href="https://medium.com/tag/ios?source=post_page-----d5c0cbf84a5e---------------ios-----------------">IOS</a><a href="https://medium.com/tag/ios-programming?source=post_page-----d5c0cbf84a5e---------------ios_programming-----------------">Ios Programming</a><br></p>



<p></p><p>The post <a href="https://mszpro.com/itms-91053-missing-api-declaration-for-accessing-userdefaults-timestamps-other-apis">ITMS-91053: Missing API declaration — for accessing UserDefaults, timestamps & other APIs</a> first appeared on <a href="https://mszpro.com">MszPro・株式会社Smartソフト</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/

Page Caching using Disk: Enhanced 
Lazy Loading (feed)
Database Caching 13/75 queries in 0.028 seconds using Disk

Served from: mszpro.com @ 2025-07-08 14:25:53 by W3 Total Cache
-->