[macOS export] Add support for privacy manifest configuration.

This commit is contained in:
bruvzg 2024-04-30 16:22:57 +03:00
parent d282e4f0e6
commit 059ddc41a0
No known key found for this signature in database
GPG Key ID: 7960FCF39844EC38
4 changed files with 594 additions and 0 deletions

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
$priv_tracking
$priv_collection
</dict>
</plist>

View File

@ -211,6 +211,426 @@
<member name="privacy/camera_usage_description_localized" type="Dictionary" setter="" getter=""> <member name="privacy/camera_usage_description_localized" type="Dictionary" setter="" getter="">
A message displayed when requesting access to the device's camera (localized). A message displayed when requesting access to the device's camera (localized).
</member> </member>
<member name="privacy/collected_data/advertising_data/collected" type="bool" setter="" getter="">
Indicates whether your app collects advertising data.
</member>
<member name="privacy/collected_data/advertising_data/collection_purposes" type="int" setter="" getter="">
The reasons your app collects advertising data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/advertising_data/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links advertising data to the user's identity.
</member>
<member name="privacy/collected_data/advertising_data/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses advertising data for tracking.
</member>
<member name="privacy/collected_data/audio_data/collected" type="bool" setter="" getter="">
Indicates whether your app collects audio data data.
</member>
<member name="privacy/collected_data/audio_data/collection_purposes" type="int" setter="" getter="">
The reasons your app collects audio data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/audio_data/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links audio data data to the user's identity.
</member>
<member name="privacy/collected_data/audio_data/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses audio data data for tracking.
</member>
<member name="privacy/collected_data/browsing_history/collected" type="bool" setter="" getter="">
Indicates whether your app collects browsing history.
</member>
<member name="privacy/collected_data/browsing_history/collection_purposes" type="int" setter="" getter="">
The reasons your app collects browsing history. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/browsing_history/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links browsing history to the user's identity.
</member>
<member name="privacy/collected_data/browsing_history/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses browsing history for tracking.
</member>
<member name="privacy/collected_data/coarse_location/collected" type="bool" setter="" getter="">
Indicates whether your app collects coarse location data.
</member>
<member name="privacy/collected_data/coarse_location/collection_purposes" type="int" setter="" getter="">
The reasons your app collects coarse location data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/coarse_location/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links coarse location data to the user's identity.
</member>
<member name="privacy/collected_data/coarse_location/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses coarse location data for tracking.
</member>
<member name="privacy/collected_data/contacts/collected" type="bool" setter="" getter="">
Indicates whether your app collects contacts.
</member>
<member name="privacy/collected_data/contacts/collection_purposes" type="int" setter="" getter="">
The reasons your app collects contacts. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/contacts/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links contacts to the user's identity.
</member>
<member name="privacy/collected_data/contacts/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses contacts for tracking.
</member>
<member name="privacy/collected_data/crash_data/collected" type="bool" setter="" getter="">
Indicates whether your app collects crash data.
</member>
<member name="privacy/collected_data/crash_data/collection_purposes" type="int" setter="" getter="">
The reasons your app collects crash data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/crash_data/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links crash data to the user's identity.
</member>
<member name="privacy/collected_data/crash_data/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses crash data for tracking.
</member>
<member name="privacy/collected_data/credit_info/collected" type="bool" setter="" getter="">
Indicates whether your app collects credit information.
</member>
<member name="privacy/collected_data/credit_info/collection_purposes" type="int" setter="" getter="">
The reasons your app collects credit information. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/credit_info/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links credit information to the user's identity.
</member>
<member name="privacy/collected_data/credit_info/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses credit information for tracking.
</member>
<member name="privacy/collected_data/customer_support/collected" type="bool" setter="" getter="">
Indicates whether your app collects customer support data.
</member>
<member name="privacy/collected_data/customer_support/collection_purposes" type="int" setter="" getter="">
The reasons your app collects customer support data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/customer_support/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links customer support data to the user's identity.
</member>
<member name="privacy/collected_data/customer_support/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses customer support data for tracking.
</member>
<member name="privacy/collected_data/device_id/collected" type="bool" setter="" getter="">
Indicates whether your app collects device IDs.
</member>
<member name="privacy/collected_data/device_id/collection_purposes" type="int" setter="" getter="">
The reasons your app collects device IDs. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/device_id/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links device IDs to the user's identity.
</member>
<member name="privacy/collected_data/device_id/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses device IDs for tracking.
</member>
<member name="privacy/collected_data/email_address/collected" type="bool" setter="" getter="">
Indicates whether your app collects email address.
</member>
<member name="privacy/collected_data/email_address/collection_purposes" type="int" setter="" getter="">
The reasons your app collects email address. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/email_address/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links email address to the user's identity.
</member>
<member name="privacy/collected_data/email_address/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses email address for tracking.
</member>
<member name="privacy/collected_data/emails_or_text_messages/collected" type="bool" setter="" getter="">
Indicates whether your app collects emails or text messages.
</member>
<member name="privacy/collected_data/emails_or_text_messages/collection_purposes" type="int" setter="" getter="">
The reasons your app collects emails or text messages. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/emails_or_text_messages/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links emails or text messages to the user's identity.
</member>
<member name="privacy/collected_data/emails_or_text_messages/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses emails or text messages for tracking.
</member>
<member name="privacy/collected_data/environment_scanning/collected" type="bool" setter="" getter="">
Indicates whether your app collects environment scanning data.
</member>
<member name="privacy/collected_data/environment_scanning/collection_purposes" type="int" setter="" getter="">
The reasons your app collects environment scanning data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/environment_scanning/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links environment scanning data to the user's identity.
</member>
<member name="privacy/collected_data/environment_scanning/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses environment scanning data for tracking.
</member>
<member name="privacy/collected_data/fitness/collected" type="bool" setter="" getter="">
Indicates whether your app collects fitness and exercise data.
</member>
<member name="privacy/collected_data/fitness/collection_purposes" type="int" setter="" getter="">
The reasons your app collects fitness and exercise data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/fitness/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links fitness and exercise data to the user's identity.
</member>
<member name="privacy/collected_data/fitness/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses fitness and exercise data for tracking.
</member>
<member name="privacy/collected_data/gameplay_content/collected" type="bool" setter="" getter="">
Indicates whether your app collects gameplay content.
</member>
<member name="privacy/collected_data/gameplay_content/collection_purposes" type="int" setter="" getter="">
The reasons your app collects gameplay content. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/gameplay_content/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links gameplay content to the user's identity.
</member>
<member name="privacy/collected_data/gameplay_content/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses gameplay content for tracking.
</member>
<member name="privacy/collected_data/hands/collected" type="bool" setter="" getter="">
Indicates whether your app collects user's hand structure and hand movements.
</member>
<member name="privacy/collected_data/hands/collection_purposes" type="int" setter="" getter="">
The reasons your app collects user's hand structure and hand movements. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/hands/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links user's hand structure and hand movements to the user's identity.
</member>
<member name="privacy/collected_data/hands/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses user's hand structure and hand movements for tracking.
</member>
<member name="privacy/collected_data/head/collected" type="bool" setter="" getter="">
Indicates whether your app collects user's head movement.
</member>
<member name="privacy/collected_data/head/collection_purposes" type="int" setter="" getter="">
The reasons your app collects user's head movement. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/head/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links user's head movement to the user's identity.
</member>
<member name="privacy/collected_data/head/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses user's head movement for tracking.
</member>
<member name="privacy/collected_data/health/collected" type="bool" setter="" getter="">
Indicates whether your app collects health and medical data.
</member>
<member name="privacy/collected_data/health/collection_purposes" type="int" setter="" getter="">
The reasons your app collects health and medical data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/health/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links health and medical data to the user's identity.
</member>
<member name="privacy/collected_data/health/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses health and medical data for tracking.
</member>
<member name="privacy/collected_data/name/collected" type="bool" setter="" getter="">
Indicates whether your app collects user's name.
</member>
<member name="privacy/collected_data/name/collection_purposes" type="int" setter="" getter="">
The reasons your app collects user's name. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/name/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links user's name to the user's identity.
</member>
<member name="privacy/collected_data/name/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses user's name for tracking.
</member>
<member name="privacy/collected_data/other_contact_info/collected" type="bool" setter="" getter="">
Indicates whether your app collects any other contact information.
</member>
<member name="privacy/collected_data/other_contact_info/collection_purposes" type="int" setter="" getter="">
The reasons your app collects any other contact information. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/other_contact_info/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links any other contact information to the user's identity.
</member>
<member name="privacy/collected_data/other_contact_info/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses any other contact information for tracking.
</member>
<member name="privacy/collected_data/other_data_types/collected" type="bool" setter="" getter="">
Indicates whether your app collects any other data.
</member>
<member name="privacy/collected_data/other_data_types/collection_purposes" type="int" setter="" getter="">
The reasons your app collects any other data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/other_data_types/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links any other data to the user's identity.
</member>
<member name="privacy/collected_data/other_data_types/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses any other data for tracking.
</member>
<member name="privacy/collected_data/other_diagnostic_data/collected" type="bool" setter="" getter="">
Indicates whether your app collects any other diagnostic data.
</member>
<member name="privacy/collected_data/other_diagnostic_data/collection_purposes" type="int" setter="" getter="">
The reasons your app collects any other diagnostic data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/other_diagnostic_data/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links any other diagnostic data to the user's identity.
</member>
<member name="privacy/collected_data/other_diagnostic_data/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses any other diagnostic data for tracking.
</member>
<member name="privacy/collected_data/other_financial_info/collected" type="bool" setter="" getter="">
Indicates whether your app collects any other financial information.
</member>
<member name="privacy/collected_data/other_financial_info/collection_purposes" type="int" setter="" getter="">
The reasons your app collects any other financial information. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/other_financial_info/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links any other financial information to the user's identity.
</member>
<member name="privacy/collected_data/other_financial_info/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses any other financial information for tracking.
</member>
<member name="privacy/collected_data/other_usage_data/collected" type="bool" setter="" getter="">
Indicates whether your app collects any other usage data.
</member>
<member name="privacy/collected_data/other_usage_data/collection_purposes" type="int" setter="" getter="">
The reasons your app collects any other usage data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/other_usage_data/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links any other usage data to the user's identity.
</member>
<member name="privacy/collected_data/other_usage_data/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses any other usage data for tracking.
</member>
<member name="privacy/collected_data/other_user_content/collected" type="bool" setter="" getter="">
Indicates whether your app collects any other user generated content.
</member>
<member name="privacy/collected_data/other_user_content/collection_purposes" type="int" setter="" getter="">
The reasons your app collects any other user generated content. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/other_user_content/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links any other user generated content to the user's identity.
</member>
<member name="privacy/collected_data/other_user_content/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses any other user generated content for tracking.
</member>
<member name="privacy/collected_data/payment_info/collected" type="bool" setter="" getter="">
Indicates whether your app collects payment information.
</member>
<member name="privacy/collected_data/payment_info/collection_purposes" type="int" setter="" getter="">
The reasons your app collects payment information. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/payment_info/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links payment information to the user's identity.
</member>
<member name="privacy/collected_data/payment_info/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses payment information for tracking.
</member>
<member name="privacy/collected_data/performance_data/collected" type="bool" setter="" getter="">
Indicates whether your app collects performance data.
</member>
<member name="privacy/collected_data/performance_data/collection_purposes" type="int" setter="" getter="">
The reasons your app collects performance data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/performance_data/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links performance data to the user's identity.
</member>
<member name="privacy/collected_data/performance_data/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses performance data for tracking.
</member>
<member name="privacy/collected_data/phone_number/collected" type="bool" setter="" getter="">
Indicates whether your app collects phone number.
</member>
<member name="privacy/collected_data/phone_number/collection_purposes" type="int" setter="" getter="">
The reasons your app collects phone number. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/phone_number/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links phone number to the user's identity.
</member>
<member name="privacy/collected_data/phone_number/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses phone number for tracking.
</member>
<member name="privacy/collected_data/photos_or_videos/collected" type="bool" setter="" getter="">
Indicates whether your app collects photos or videos.
</member>
<member name="privacy/collected_data/photos_or_videos/collection_purposes" type="int" setter="" getter="">
The reasons your app collects photos or videos. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/photos_or_videos/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links photos or videos to the user's identity.
</member>
<member name="privacy/collected_data/photos_or_videos/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses photos or videos for tracking.
</member>
<member name="privacy/collected_data/physical_address/collected" type="bool" setter="" getter="">
Indicates whether your app collects physical address.
</member>
<member name="privacy/collected_data/physical_address/collection_purposes" type="int" setter="" getter="">
The reasons your app collects physical address. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/physical_address/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links physical address to the user's identity.
</member>
<member name="privacy/collected_data/physical_address/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses physical address for tracking.
</member>
<member name="privacy/collected_data/precise_location/collected" type="bool" setter="" getter="">
Indicates whether your app collects precise location data.
</member>
<member name="privacy/collected_data/precise_location/collection_purposes" type="int" setter="" getter="">
The reasons your app collects precise location data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/precise_location/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links precise location data to the user's identity.
</member>
<member name="privacy/collected_data/precise_location/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses precise location data for tracking.
</member>
<member name="privacy/collected_data/product_interaction/collected" type="bool" setter="" getter="">
Indicates whether your app collects product interaction data.
</member>
<member name="privacy/collected_data/product_interaction/collection_purposes" type="int" setter="" getter="">
The reasons your app collects product interaction data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/product_interaction/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links product interaction data to the user's identity.
</member>
<member name="privacy/collected_data/product_interaction/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses product interaction data for tracking.
</member>
<member name="privacy/collected_data/purchase_history/collected" type="bool" setter="" getter="">
Indicates whether your app collects purchase history.
</member>
<member name="privacy/collected_data/purchase_history/collection_purposes" type="int" setter="" getter="">
The reasons your app collects purchase history. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/purchase_history/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links purchase history to the user's identity.
</member>
<member name="privacy/collected_data/purchase_history/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses purchase history for tracking.
</member>
<member name="privacy/collected_data/search_hhistory/collected" type="bool" setter="" getter="">
Indicates whether your app collects search history.
</member>
<member name="privacy/collected_data/search_hhistory/collection_purposes" type="int" setter="" getter="">
The reasons your app collects search history. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/search_hhistory/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links search history to the user's identity.
</member>
<member name="privacy/collected_data/search_hhistory/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses search history for tracking.
</member>
<member name="privacy/collected_data/sensitive_info/collected" type="bool" setter="" getter="">
Indicates whether your app collects sensitive user information.
</member>
<member name="privacy/collected_data/sensitive_info/collection_purposes" type="int" setter="" getter="">
The reasons your app collects sensitive user information. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/sensitive_info/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links sensitive user information to the user's identity.
</member>
<member name="privacy/collected_data/sensitive_info/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses sensitive user information for tracking.
</member>
<member name="privacy/collected_data/user_id/collected" type="bool" setter="" getter="">
Indicates whether your app collects user IDs.
</member>
<member name="privacy/collected_data/user_id/collection_purposes" type="int" setter="" getter="">
The reasons your app collects user IDs. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url].
</member>
<member name="privacy/collected_data/user_id/linked_to_user" type="bool" setter="" getter="">
Indicates whether your app links user IDs to the user's identity.
</member>
<member name="privacy/collected_data/user_id/used_for_tracking" type="bool" setter="" getter="">
Indicates whether your app uses user IDs for tracking.
</member>
<member name="privacy/desktop_folder_usage_description" type="String" setter="" getter=""> <member name="privacy/desktop_folder_usage_description" type="String" setter="" getter="">
A message displayed when requesting access to the user's "Desktop" folder (in English). A message displayed when requesting access to the user's "Desktop" folder (in English).
</member> </member>
@ -259,6 +679,12 @@
<member name="privacy/removable_volumes_usage_description_localized" type="Dictionary" setter="" getter=""> <member name="privacy/removable_volumes_usage_description_localized" type="Dictionary" setter="" getter="">
A message displayed when requesting access to the user's removable drives (localized). A message displayed when requesting access to the user's removable drives (localized).
</member> </member>
<member name="privacy/tracking_domains" type="PackedStringArray" setter="" getter="">
The list of internet domains your app connects to that engage in tracking. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files]Privacy manifest files[/url].
</member>
<member name="privacy/tracking_enabled" type="bool" setter="" getter="">
Indicates whether your app uses data for tracking. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files]Privacy manifest files[/url].
</member>
<member name="ssh_remote_deploy/cleanup_script" type="String" setter="" getter=""> <member name="ssh_remote_deploy/cleanup_script" type="String" setter="" getter="">
Script code to execute on the remote host when app is finished. Script code to execute on the remote host when app is finished.
The following variables can be used in the script: The following variables can be used in the script:

View File

@ -325,6 +325,11 @@ bool EditorExportPlatformMacOS::get_export_option_visibility(const EditorExportP
} }
} break; } break;
} }
bool advanced_options_enabled = p_preset->are_advanced_options_enabled();
if (p_option.begins_with("privacy")) {
return advanced_options_enabled;
}
} }
// These entitlements are required to run managed code, and are always enabled in Mono builds. // These entitlements are required to run managed code, and are always enabled in Mono builds.
@ -373,6 +378,58 @@ List<String> EditorExportPlatformMacOS::get_binary_extensions(const Ref<EditorEx
return list; return list;
} }
struct DataCollectionInfo {
String prop_name;
String type_name;
};
static const DataCollectionInfo data_collect_type_info[] = {
{ "name", "NSPrivacyCollectedDataTypeName" },
{ "email_address", "NSPrivacyCollectedDataTypeEmailAddress" },
{ "phone_number", "NSPrivacyCollectedDataTypePhoneNumber" },
{ "physical_address", "NSPrivacyCollectedDataTypePhysicalAddress" },
{ "other_contact_info", "NSPrivacyCollectedDataTypeOtherUserContactInfo" },
{ "health", "NSPrivacyCollectedDataTypeHealth" },
{ "fitness", "NSPrivacyCollectedDataTypeFitness" },
{ "payment_info", "NSPrivacyCollectedDataTypePaymentInfo" },
{ "credit_info", "NSPrivacyCollectedDataTypeCreditInfo" },
{ "other_financial_info", "NSPrivacyCollectedDataTypeOtherFinancialInfo" },
{ "precise_location", "NSPrivacyCollectedDataTypePreciseLocation" },
{ "coarse_location", "NSPrivacyCollectedDataTypeCoarseLocation" },
{ "sensitive_info", "NSPrivacyCollectedDataTypeSensitiveInfo" },
{ "contacts", "NSPrivacyCollectedDataTypeContacts" },
{ "emails_or_text_messages", "NSPrivacyCollectedDataTypeEmailsOrTextMessages" },
{ "photos_or_videos", "NSPrivacyCollectedDataTypePhotosorVideos" },
{ "audio_data", "NSPrivacyCollectedDataTypeAudioData" },
{ "gameplay_content", "NSPrivacyCollectedDataTypeGameplayContent" },
{ "customer_support", "NSPrivacyCollectedDataTypeCustomerSupport" },
{ "other_user_content", "NSPrivacyCollectedDataTypeOtherUserContent" },
{ "browsing_history", "NSPrivacyCollectedDataTypeBrowsingHistory" },
{ "search_hhistory", "NSPrivacyCollectedDataTypeSearchHistory" },
{ "user_id", "NSPrivacyCollectedDataTypeUserID" },
{ "device_id", "NSPrivacyCollectedDataTypeDeviceID" },
{ "purchase_history", "NSPrivacyCollectedDataTypePurchaseHistory" },
{ "product_interaction", "NSPrivacyCollectedDataTypeProductInteraction" },
{ "advertising_data", "NSPrivacyCollectedDataTypeAdvertisingData" },
{ "other_usage_data", "NSPrivacyCollectedDataTypeOtherUsageData" },
{ "crash_data", "NSPrivacyCollectedDataTypeCrashData" },
{ "performance_data", "NSPrivacyCollectedDataTypePerformanceData" },
{ "other_diagnostic_data", "NSPrivacyCollectedDataTypeOtherDiagnosticData" },
{ "environment_scanning", "NSPrivacyCollectedDataTypeEnvironmentScanning" },
{ "hands", "NSPrivacyCollectedDataTypeHands" },
{ "head", "NSPrivacyCollectedDataTypeHead" },
{ "other_data_types", "NSPrivacyCollectedDataTypeOtherDataTypes" },
};
static const DataCollectionInfo data_collect_purpose_info[] = {
{ "Analytics", "NSPrivacyCollectedDataTypePurposeAnalytics" },
{ "App Functionality", "NSPrivacyCollectedDataTypePurposeAppFunctionality" },
{ "Developer Advertising", "NSPrivacyCollectedDataTypePurposeDeveloperAdvertising" },
{ "Third-party Advertising", "NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising" },
{ "Product Personalization", "NSPrivacyCollectedDataTypePurposeProductPersonalization" },
{ "Other", "NSPrivacyCollectedDataTypePurposeOther" },
};
void EditorExportPlatformMacOS::get_export_options(List<ExportOption> *r_options) const { void EditorExportPlatformMacOS::get_export_options(List<ExportOption> *r_options) const {
#ifdef MACOS_ENABLED #ifdef MACOS_ENABLED
r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "export/distribution_type", PROPERTY_HINT_ENUM, "Testing,Distribution,App Store"), 1, true)); r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "export/distribution_type", PROPERTY_HINT_ENUM, "Testing,Distribution,App Store"), 1, true));
@ -484,6 +541,25 @@ void EditorExportPlatformMacOS::get_export_options(List<ExportOption> *r_options
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "privacy/removable_volumes_usage_description", PROPERTY_HINT_PLACEHOLDER_TEXT, "Provide a message if you need to use removable volumes"), "", false, true)); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "privacy/removable_volumes_usage_description", PROPERTY_HINT_PLACEHOLDER_TEXT, "Provide a message if you need to use removable volumes"), "", false, true));
r_options->push_back(ExportOption(PropertyInfo(Variant::DICTIONARY, "privacy/removable_volumes_usage_description_localized", PROPERTY_HINT_LOCALIZABLE_STRING), Dictionary())); r_options->push_back(ExportOption(PropertyInfo(Variant::DICTIONARY, "privacy/removable_volumes_usage_description_localized", PROPERTY_HINT_LOCALIZABLE_STRING), Dictionary()));
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "privacy/tracking_enabled"), false));
r_options->push_back(ExportOption(PropertyInfo(Variant::PACKED_STRING_ARRAY, "privacy/tracking_domains"), Vector<String>()));
{
String hint;
for (uint64_t i = 0; i < sizeof(data_collect_purpose_info) / sizeof(data_collect_purpose_info[0]); ++i) {
if (i != 0) {
hint += ",";
}
hint += vformat("%s:%d", data_collect_purpose_info[i].prop_name, (1 << i));
}
for (uint64_t i = 0; i < sizeof(data_collect_type_info) / sizeof(data_collect_type_info[0]); ++i) {
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, vformat("privacy/collected_data/%s/collected", data_collect_type_info[i].prop_name)), false));
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, vformat("privacy/collected_data/%s/linked_to_user", data_collect_type_info[i].prop_name)), false));
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, vformat("privacy/collected_data/%s/used_for_tracking", data_collect_type_info[i].prop_name)), false));
r_options->push_back(ExportOption(PropertyInfo(Variant::INT, vformat("privacy/collected_data/%s/collection_purposes", data_collect_type_info[i].prop_name), PROPERTY_HINT_FLAGS, hint), 0));
}
}
String run_script = "#!/usr/bin/env bash\n" String run_script = "#!/usr/bin/env bash\n"
"unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"\n" "unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"\n"
"open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}"; "open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}";
@ -644,6 +720,85 @@ void EditorExportPlatformMacOS::_make_icon(const Ref<EditorExportPreset> &p_pres
p_data = data; p_data = data;
} }
void EditorExportPlatformMacOS::_fix_privacy_manifest(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &plist) {
String str;
String strnew;
str.parse_utf8((const char *)plist.ptr(), plist.size());
Vector<String> lines = str.split("\n");
for (int i = 0; i < lines.size(); i++) {
if (lines[i].find("$priv_collection") != -1) {
bool section_opened = false;
for (uint64_t j = 0; j < sizeof(data_collect_type_info) / sizeof(data_collect_type_info[0]); ++j) {
bool data_collected = p_preset->get(vformat("privacy/collected_data/%s/collected", data_collect_type_info[j].prop_name));
bool linked = p_preset->get(vformat("privacy/collected_data/%s/linked_to_user", data_collect_type_info[j].prop_name));
bool tracking = p_preset->get(vformat("privacy/collected_data/%s/used_for_tracking", data_collect_type_info[j].prop_name));
int purposes = p_preset->get(vformat("privacy/collected_data/%s/collection_purposes", data_collect_type_info[j].prop_name));
if (data_collected) {
if (!section_opened) {
section_opened = true;
strnew += "\t<key>NSPrivacyCollectedDataTypes</key>\n";
strnew += "\t<array>\n";
}
strnew += "\t\t<dict>\n";
strnew += "\t\t\t<key>NSPrivacyCollectedDataType</key>\n";
strnew += vformat("\t\t\t<string>%s</string>\n", data_collect_type_info[j].type_name);
strnew += "\t\t\t\t<key>NSPrivacyCollectedDataTypeLinked</key>\n";
if (linked) {
strnew += "\t\t\t\t<true/>\n";
} else {
strnew += "\t\t\t\t<false/>\n";
}
strnew += "\t\t\t\t<key>NSPrivacyCollectedDataTypeTracking</key>\n";
if (tracking) {
strnew += "\t\t\t\t<true/>\n";
} else {
strnew += "\t\t\t\t<false/>\n";
}
if (purposes != 0) {
strnew += "\t\t\t\t<key>NSPrivacyCollectedDataTypePurposes</key>\n";
strnew += "\t\t\t\t<array>\n";
for (uint64_t k = 0; k < sizeof(data_collect_purpose_info) / sizeof(data_collect_purpose_info[0]); ++k) {
if (purposes & (1 << k)) {
strnew += vformat("\t\t\t\t\t<string>%s</string>\n", data_collect_purpose_info[k].type_name);
}
}
strnew += "\t\t\t\t</array>\n";
}
strnew += "\t\t\t</dict>\n";
}
}
if (section_opened) {
strnew += "\t</array>\n";
}
} else if (lines[i].find("$priv_tracking") != -1) {
bool tracking = p_preset->get("privacy/tracking_enabled");
strnew += "\t<key>NSPrivacyTracking</key>\n";
if (tracking) {
strnew += "\t<true/>\n";
} else {
strnew += "\t<false/>\n";
}
Vector<String> tracking_domains = p_preset->get("privacy/tracking_domains");
if (!tracking_domains.is_empty()) {
strnew += "\t<key>NSPrivacyTrackingDomains</key>\n";
strnew += "\t<array>\n";
for (const String &E : tracking_domains) {
strnew += "\t\t<string>" + E + "</string>\n";
}
strnew += "\t</array>\n";
}
} else {
strnew += lines[i] + "\n";
}
}
CharString cs = strnew.utf8();
plist.resize(cs.size() - 1);
for (int i = 0; i < cs.size() - 1; i++) {
plist.write[i] = cs[i];
}
}
void EditorExportPlatformMacOS::_fix_plist(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &plist, const String &p_binary) { void EditorExportPlatformMacOS::_fix_plist(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &plist, const String &p_binary) {
String str; String str;
String strnew; String strnew;
@ -1674,6 +1829,10 @@ Error EditorExportPlatformMacOS::export_project(const Ref<EditorExportPreset> &p
_fix_plist(p_preset, data, pkg_name); _fix_plist(p_preset, data, pkg_name);
} }
if (file == "Contents/Resources/PrivacyInfo.xcprivacy") {
_fix_privacy_manifest(p_preset, data);
}
if (file.begins_with("Contents/MacOS/godot_")) { if (file.begins_with("Contents/MacOS/godot_")) {
if (file != "Contents/MacOS/" + binary_to_use) { if (file != "Contents/MacOS/" + binary_to_use) {
ret = unzGoToNextFile(src_pkg_zip); ret = unzGoToNextFile(src_pkg_zip);

View File

@ -85,6 +85,7 @@ class EditorExportPlatformMacOS : public EditorExportPlatform {
OS::ProcessID ssh_pid = 0; OS::ProcessID ssh_pid = 0;
int menu_options = 0; int menu_options = 0;
void _fix_privacy_manifest(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &plist);
void _fix_plist(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &plist, const String &p_binary); void _fix_plist(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &plist, const String &p_binary);
void _make_icon(const Ref<EditorExportPreset> &p_preset, const Ref<Image> &p_icon, Vector<uint8_t> &p_data); void _make_icon(const Ref<EditorExportPreset> &p_preset, const Ref<Image> &p_icon, Vector<uint8_t> &p_data);