Skip to main content

apple_bundle/info_plist/
protected_resources.rs

1//! # Protected Resources
2//!
3//! Control an app’s access to protected system services and user data.
4//!
5//! ### Overview
6//! Before your app can access certain protected resources, like the Bluetooth interface,
7//! location information, or the user’s photos, the system asks the user for permission on
8//! behalf of your app. To signal that your app needs the access, you add a
9//! UsageDescription key to your app’s Information Property List. You set the value
10//! associated with the key to a string that explains why your app needs access.
11//! The system displays this string when prompting the user, as described in Requesting
12//! Access to Protected Resources.
13
14use serde::{Deserialize, Serialize};
15
16/// A dictionary containing a default value.
17pub use super::app_execution::DefaultDictionary;
18
19/// Bluetooth
20#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
21pub struct Bluetooth {
22    /// A message that tells the user why the app needs access to Bluetooth.
23    ///
24    /// This key is required if your app uses the device’s Bluetooth interface.
25    ///
26    /// ### Important
27    /// If your app has a deployment target earlier than iOS 13, add the
28    /// NSBluetoothPeripheralUsageDescription key to your app’s Information Property List
29    /// file in addition to this key.
30    ///
31    /// ## Availability
32    /// * iOS 13.0+
33    /// * tvOS 13.0+
34    /// * watchOS 6.0+
35    ///
36    /// ## Framework
37    /// * Core Bluetooth
38    #[serde(
39        rename = "NSBluetoothAlwaysUsageDescription",
40        serialize_with = "crate::serialize_option",
41        skip_serializing_if = "Option::is_none"
42    )]
43    pub bluetooth_always_usage_description: Option<String>,
44    /// A message that tells the user why the app is requesting the ability to connect to
45    /// Bluetooth peripherals.
46    ///
47    /// For apps with a deployment target of iOS 13 and later, use
48    /// NSBluetoothAlwaysUsageDescription instead.
49    ///
50    /// For deployment targets earlier than iOS 13, add both
51    /// NSBluetoothAlwaysUsageDescription and NSBluetoothPeripheralUsageDescription to
52    /// your app’s Information Property List file. Devices running earlier versions of
53    /// iOS rely on NSBluetoothPeripheralUsageDescription, while devices running later
54    /// versions rely on NSBluetoothAlwaysUsageDescription.
55    ///
56    /// ### Important
57    /// This key is required if your app uses APIs that access Bluetooth peripherals and
58    /// has a deployment target earlier than iOS 13.
59    ///
60    /// ## Availability
61    /// * iOS 6.0–13.0
62    ///
63    /// ## Framework
64    /// * Core Bluetooth
65    #[deprecated(since = "iOS 6.0-13.0")]
66    #[serde(
67        rename = "NSBluetoothPeripheralUsageDescription",
68        serialize_with = "crate::serialize_option",
69        skip_serializing_if = "Option::is_none"
70    )]
71    pub bluetooth_peripheral_usage_description: Option<String>,
72}
73
74/// Calendar and Reminders
75///
76/// [Accessing the Event Store](https://developer.apple.com/documentation/eventkit/accessing_the_event_store)
77#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
78pub struct CalendarAndReminders {
79    /// A message that tells the user why the app is requesting access to the user’s
80    /// calendar data.
81    ///
82    /// ### Important
83    /// This key is required if your app uses APIs that access the user’s calendar data.
84    ///
85    /// ## Availability
86    /// * iOS 6.0+
87    /// * macOS 10.14+
88    ///
89    /// ## Framework
90    /// * EventKit
91    #[serde(
92        rename = "NSCalendarsUsageDescription",
93        serialize_with = "crate::serialize_option",
94        skip_serializing_if = "Option::is_none"
95    )]
96    pub calendars_usage_description: Option<String>,
97    /// A message that tells the user why the app is requesting access to the user’s
98    /// reminders.
99    ///
100    /// ### Important
101    /// This key is required if your app uses APIs that access the user’s reminders.
102    ///
103    /// ## Availability
104    /// * iOS 6.0+
105    /// * macOS 10.14+
106    ///
107    /// ## Framework
108    /// * EventKit
109    #[serde(
110        rename = "NSRemindersUsageDescription",
111        serialize_with = "crate::serialize_option",
112        skip_serializing_if = "Option::is_none"
113    )]
114    pub reminders_usage_description: Option<String>,
115}
116
117/// Camera and Microphone
118///
119/// ## Articles
120/// * [Requesting Authorization for Media Capture on iOS](https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/requesting_authorization_for_media_capture_on_ios)
121/// * [Requesting Authorization for Media Capture on macOS](https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/requesting_authorization_for_media_capture_on_macos)
122#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
123pub struct CameraAndMicrophone {
124    /// A message that tells the user why the app is requesting access to the device’s
125    /// camera.
126    ///
127    /// ### Important
128    /// This key is required if your app uses APIs that access the device’s camera.
129    ///
130    /// ## Availability
131    /// * iOS 7.0+
132    /// * macOS 10.14+
133    ///
134    /// ## Framework
135    /// * AVFoundation
136    #[serde(
137        rename = "NSCameraUsageDescription",
138        serialize_with = "crate::serialize_option",
139        skip_serializing_if = "Option::is_none"
140    )]
141    pub camera_usage_description: Option<String>,
142    /// A message that tells the user why the app is requesting access to the device’s
143    /// microphone.
144    ///
145    /// ### Important
146    /// This key is required if your app uses APIs that access the device’s microphone.
147    ///
148    /// ## Availability
149    /// * iOS 7.0+
150    /// * macOS 10.14+
151    /// * watchOS 4.0+
152    ///
153    /// ## Framework
154    /// * AVFoundation
155    #[serde(
156        rename = "NSMicrophoneUsageDescription",
157        serialize_with = "crate::serialize_option",
158        skip_serializing_if = "Option::is_none"
159    )]
160    pub microphone_usage_description: Option<String>,
161}
162
163/// Contacts
164///
165/// [Requesting Authorization to Access Contacts](https://developer.apple.com/documentation/contacts/requesting_authorization_to_access_contacts)
166#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
167pub struct Contacts {
168    /// A message that tells the user why the app is requesting access to the user’s
169    /// contacts.
170    ///
171    /// ### Important
172    /// This key is required if your app uses APIs that access the user’s contacts.
173    ///
174    /// ## Availability
175    /// * iOS 6.0+
176    /// * macOS 10.8+
177    ///
178    /// ## Framework
179    /// * Contacts
180    #[serde(
181        rename = "NSContactsUsageDescription",
182        serialize_with = "crate::serialize_option",
183        skip_serializing_if = "Option::is_none"
184    )]
185    pub contacts_usage_description: Option<String>,
186}
187
188/// FaceID
189#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
190pub struct FaceId {
191    /// A message that tells the user why the app is requesting the ability to
192    /// authenticate with Face ID.
193    ///
194    /// ### Important
195    /// This key is required if your app uses APIs that access Face ID.
196    ///
197    /// ## Availability
198    /// * iOS 11.0+
199    ///
200    /// ## Framework
201    /// * Local Authentication
202    #[serde(
203        rename = "NSFaceIDUsageDescription",
204        serialize_with = "crate::serialize_option",
205        skip_serializing_if = "Option::is_none"
206    )]
207    pub face_id_usage_description: Option<String>,
208}
209
210/// Files and Folders
211#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
212pub struct FilesAndFolders {
213    /// A message that tells the user why the app needs access to the user’s Desktop
214    /// folder.
215    ///
216    /// The user implicitly grants your app access to a file in the Desktop folder when
217    /// selecting the file in an Open or Save panel, dragging it onto your app, or opening
218    /// it in Finder. Your app can access that file right away and any time in the
219    /// future. In addition, if your app creates a new file in the Desktop folder, the
220    /// app can access that file without user consent.
221    ///
222    /// The first time your app tries to access a file in the user’s Desktop folder
223    /// without implied user consent, the system prompts the user for permission to access
224    /// the folder’s contents. Add the NSDesktopFolderUsageDescription key to your
225    /// app’s Information Property List file to provide a message that explains why your
226    /// app needs access. The usage description is optional, but highly recommended.
227    ///
228    /// App Sandbox enforces stricter limits on Desktop folder access, so that policy may
229    /// supersede this one if your app enables sandboxing. See App Sandbox for more
230    /// information.
231    ///
232    /// After the user chooses whether to grant access, the system remembers the user’s
233    /// choice. To reset permissions, use the tccutil command line utility with your
234    /// app’s bundle ID:
235    ///
236    /// ```swift
237    /// $ tccutil reset SystemPolicyDesktopFolder <bundleID>
238    /// ```
239    ///
240    /// ## Availability
241    /// * macOS 10.15+
242    ///
243    /// ## Framework
244    /// * Foundation
245    #[serde(
246        rename = "NSDesktopFolderUsageDescription",
247        serialize_with = "crate::serialize_option",
248        skip_serializing_if = "Option::is_none"
249    )]
250    pub desktop_folder_usage_description: Option<String>,
251    /// A message that tells the user why the app needs access to the user’s Documents
252    /// folder.
253    ///
254    /// The user implicitly grants your app access to a file in the Documents folder when
255    /// selecting the file in an Open or Save panel, dragging it onto your app, or opening
256    /// it in Finder. Your app can access that file right away and any time in the
257    /// future. In addition, if your app creates a new file in the Documents folder,
258    /// the app can access that file without user consent.
259    ///
260    /// The first time your app tries to access a file in the user’s Documents folder
261    /// without implied user consent, the system prompts the user for permission to access
262    /// the folder’s contents. Add the NSDocumentsFolderUsageDescription key to your
263    /// app’s Information Property List file to provide a message that explains why your
264    /// app needs access. The usage description is optional, but highly recommended.
265    ///
266    /// App Sandbox enforces stricter limits on Documents folder access, so that policy
267    /// may supersede this one if your app enables sandboxing. See App Sandbox for
268    /// more information.
269    ///
270    /// After the user chooses whether to grant access, the system remembers the user’s
271    /// choice. To reset permissions, use the tccutil command line utility with your
272    /// app’s bundle ID:
273    ///
274    /// ```swift
275    /// $ tccutil reset SystemPolicyDocumentsFolder <bundleID>
276    /// ```
277    ///
278    /// ## Availability
279    /// * macOS 10.15+
280    ///
281    /// ## Framework
282    /// * Foundation
283    #[serde(
284        rename = "NSDocumentsFolderUsageDescription",
285        serialize_with = "crate::serialize_option",
286        skip_serializing_if = "Option::is_none"
287    )]
288    pub documents_folder_usage_description: Option<String>,
289    /// A message that tells the user why the app needs access to the user’s Documents
290    /// folder.
291    ///
292    /// The user implicitly grants your app access to a file in the Documents folder when
293    /// selecting the file in an Open or Save panel, dragging it onto your app, or opening
294    /// it in Finder. Your app can access that file right away and any time in the
295    /// future. In addition, if your app creates a new file in the Documents folder,
296    /// the app can access that file without user consent.
297    ///
298    /// The first time your app tries to access a file in the user’s Documents folder
299    /// without implied user consent, the system prompts the user for permission to access
300    /// the folder’s contents. Add the NSDocumentsFolderUsageDescription key to your
301    /// app’s Information Property List file to provide a message that explains why your
302    /// app needs access. The usage description is optional, but highly recommended.
303    ///
304    /// App Sandbox enforces stricter limits on Documents folder access, so that policy
305    /// may supersede this one if your app enables sandboxing. See App Sandbox for
306    /// more information.
307    ///
308    /// After the user chooses whether to grant access, the system remembers the user’s
309    /// choice. To reset permissions, use the tccutil command line utility with your
310    /// app’s bundle ID:
311    ///
312    /// ```swift
313    /// $ tccutil reset SystemPolicyDownloadsFolder <bundleID>
314    /// ```
315    ///
316    /// ## Availability
317    /// * macOS 10.15+
318    ///
319    /// ## Framework
320    /// * Foundation
321    #[serde(
322        rename = "NSDownloadsFolderUsageDescription",
323        serialize_with = "crate::serialize_option",
324        skip_serializing_if = "Option::is_none"
325    )]
326    pub downloads_folder_usage_description: Option<String>,
327    /// A message that tells the user why the app needs access to files on a network
328    /// volume.
329    ///
330    /// The user implicitly grants your app access to a file on a network volume when
331    /// selecting the file in an Open or Save panel, dragging it onto your app, or opening
332    /// it in Finder. Your app can access that file right away and any time in the
333    /// future. In addition, if your app creates a new file on a network volume, the
334    /// app can access that file without user consent.
335    ///
336    /// The first time your app tries to access a file on a network volume without implied
337    /// user consent, the system prompts the user for permission to access network
338    /// volumes. Add the NSNetworkVolumesUsageDescription key to your app’s
339    /// Information Property List file to provide a string for the prompt that explains
340    /// why your app needs access. The usage description is optional, but highly
341    /// recommended.
342    ///
343    /// After the user chooses whether to grant access, the system remembers the user’s
344    /// choice. To reset permissions, use the tccutil command line utility with your
345    /// app’s bundle ID:
346    ///
347    /// ```swift
348    /// $ tccutil reset SystemPolicyNetworkVolumes <bundleID>
349    /// ```
350    ///
351    /// ## Availability
352    /// * macOS 10.15+
353    ///
354    /// ## Framework
355    /// * Foundation
356    #[serde(
357        rename = "NSNetworkVolumesUsageDescription",
358        serialize_with = "crate::serialize_option",
359        skip_serializing_if = "Option::is_none"
360    )]
361    pub network_volumes_usage_description: Option<String>,
362    /// A message that tells the user why the app needs access to files on a removable
363    /// volume.
364    ///
365    /// The user implicitly grants your app access to a file on a removable volume—like a
366    /// USB thumb drive—when selecting the file in an Open or Save panel, dragging it onto
367    /// your app, or opening it in Finder. Your app can access that file right away
368    /// and any time in the future. In addition, if your app creates a new file on a
369    /// removable volume, the app can access that file without user consent.
370    ///
371    /// The first time your app tries to access a file on a removable volume without
372    /// implied user consent, the system prompts the user for permission to access
373    /// removable volumes. Add the NSRemovableVolumesUsageDescription key to your
374    /// app’s Information Property List file to provide a string for the prompt that
375    /// explains why your app needs access. The usage description is optional, but
376    /// highly recommended.
377    ///
378    /// After the user chooses whether to grant access, the system remembers the user’s
379    /// choice. To reset permissions, use the tccutil command line utility with your
380    /// app’s bundle ID:
381    ///
382    /// ```swift
383    /// $ tccutil reset SystemPolicyRemovableVolumes <bundleID>
384    /// ```
385    /// ## Availability
386    /// * macOS 10.15+
387    ///
388    /// ## Framework
389    /// * Foundation
390    #[serde(
391        rename = "NSRemovableVolumesUsageDescription",
392        serialize_with = "crate::serialize_option",
393        skip_serializing_if = "Option::is_none"
394    )]
395    pub removable_volumes_usage_description: Option<String>,
396    /// A message that tells the user why the app needs to be informed when other apps
397    /// access files that it manages
398    ///
399    /// An app that adopts the File Provider framework can see when and with which other
400    /// apps the user accesses managed files. Before providing this kind of
401    /// information to a file provider, the system prompts the user to grant access.
402    /// Add the NSFileProviderPresenceUsageDescription key to your file provider app’s
403    /// Information Property List file to provide a string for the prompt that explains
404    /// why your app needs this information.
405    ///
406    /// After the user chooses whether to grant access, the system remembers the user’s
407    /// choice. To reset permissions, use the tccutil command line utility with your
408    /// app’s bundle ID:
409    ///
410    /// ```swift
411    /// $ tccutil reset FileProviderPresence <bundleID>
412    /// ```
413    ///
414    /// ## Availability
415    /// * macOS 10.15+
416    ///
417    /// ## Framework
418    /// * Foundation
419    #[serde(
420        rename = "NSFileProviderPresenceUsageDescription",
421        serialize_with = "crate::serialize_option",
422        skip_serializing_if = "Option::is_none"
423    )]
424    pub file_provider_presence_usage_description: Option<String>,
425    /// A message that tells the user why the app needs access to files managed by a file
426    /// provider.
427    ///
428    /// The user implicitly grants your app access to a file managed by a file provider
429    /// when selecting the file in an Open or Save panel, dragging it onto your app, or
430    /// opening it in Finder. Your app can access that file right away and any time in
431    /// the future. In addition, if your app creates a new file managed by a file
432    /// provider, the app can access that file without user consent.
433    ///
434    /// The first time your app tries to access a file managed by a file provider without
435    /// implied user consent, the system prompts the user for permission.
436    /// Add the NSFileProviderDomainUsageDescription key to your app’s Information
437    /// Property List file to provide a string for the prompt that explains why your app
438    /// needs access. The usage description is optional, but highly recommended.
439    ///
440    /// After the user chooses whether to grant access, the system remembers the user’s
441    /// choice. To reset permissions, use the tccutil command line utility with your
442    /// app’s bundle ID:
443    ///
444    /// ```swift
445    /// $ tccutil reset FileProviderDomain <bundleID>
446    /// ```
447    ///
448    /// ## Availability
449    /// * macOS 10.15+
450    ///
451    /// ## Framework
452    /// * Foundation
453    #[serde(
454        rename = "NSFileProviderDomainUsageDescription",
455        serialize_with = "crate::serialize_option",
456        skip_serializing_if = "Option::is_none"
457    )]
458    pub file_provider_domain_usage_description: Option<String>,
459}
460
461/// Game Center
462#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
463pub struct GameCenter {
464    /// A message that tells the user why the app needs access to their Game Center
465    /// friends list.
466    ///
467    /// ## Availability
468    /// * iOS 14.5+
469    ///
470    /// ## Framework
471    /// * GameKit
472    #[serde(
473        rename = "NSGKFriendListUsageDescription",
474        skip_serializing_if = "Option::is_none"
475    )]
476    pub friend_list_usage_description: Option<String>,
477}
478
479/// Health
480///
481/// [Setting Up HealthKit](https://developer.apple.com/documentation/healthkit/setting_up_healthkit)
482#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
483pub struct Health {
484    /// A Boolean value that indicates whether the app may request user authorization to
485    /// access health and activity data that appears in the Health app.
486    ///
487    /// To add this entitlement to your app, enable the HealthKit capability in Xcode.
488    ///
489    /// ## Availability
490    /// * iOS 8.0+
491    ///
492    /// ## Framework
493    /// * HealthKit
494    #[serde(
495        rename = "com.apple.developer.healthkit",
496        serialize_with = "crate::serialize_option",
497        skip_serializing_if = "Option::is_none"
498    )]
499    pub healthkit: Option<bool>,
500    /// Health data types that require additional permission.
501    ///
502    /// The HealthKit Entitlement provides access to most HealthKit data types.
503    /// However, because of their highly sensitive nature, some data types require
504    /// additional entitlements. The HealthKit Capabilities Entitlement provides
505    /// access to these data types.
506    ///
507    /// To add this entitlement to your app, first enable the HealthKit capability in
508    /// Xcode, and then check any values that you want to add to the HealthKit
509    /// Capabilities Entitlement.
510    ///
511    /// Only add values for data types that your app needs to access.
512    /// App Review may reject apps that don’t use the data appropriately.
513    /// For more information, see the Health and Health Research section of the App Store
514    /// Review Guidelines.
515    ///
516    /// ## Availability
517    /// * iOS 8.0+
518    ///
519    /// ## Framework
520    /// * HealthKit
521    #[serde(
522        rename = "com.apple.developer.healthkit.access",
523        skip_serializing_if = "Option::is_none",
524        serialize_with = "crate::serialize_vec_enum_option"
525    )]
526    pub healthkit_access: Option<Vec<HealthKitCapabilities>>,
527    /// A message to the user that explains why the app requested permission to read
528    /// clinical records.
529    ///
530    /// ### Important
531    /// This key is required if your app uses APIs that access the user's clinical
532    /// records.
533    ///
534    /// ## Availability
535    /// * iOS 12.0+
536    ///
537    /// ## Framework
538    /// * HealthKit
539    #[serde(
540        rename = "NSHealthClinicalHealthRecordsShareUsageDescription",
541        serialize_with = "crate::serialize_option",
542        skip_serializing_if = "Option::is_none"
543    )]
544    pub health_clinical_health_records_share_usage_description: Option<String>,
545    /// A message to the user that explains why the app requested permission to read
546    /// samples from the HealthKit store.
547    ///
548    /// ### Important
549    /// This key is required if your app uses APIs that access the user’s heath data.
550    ///
551    /// ## Availability
552    /// * iOS 8.0+
553    ///
554    /// ## Framework
555    /// * HealthKit
556    #[serde(
557        rename = "NSHealthShareUsageDescription",
558        serialize_with = "crate::serialize_option",
559        skip_serializing_if = "Option::is_none"
560    )]
561    pub health_share_usage_description: Option<String>,
562    /// A message to the user that explains why the app requested permission to save
563    /// samples to the HealthKit store.
564    ///
565    /// ### Important
566    /// This key is required if your app uses APIs that update the user’s health data.
567    ///
568    /// ## Availability
569    /// * iOS 8.0+
570    ///
571    /// ## Framework
572    /// * HealthKit
573    #[serde(
574        rename = "NSHealthUpdateUsageDescription",
575        serialize_with = "crate::serialize_option",
576        skip_serializing_if = "Option::is_none"
577    )]
578    pub health_update_usage_description: Option<String>,
579    /// The clinical record data types that your app must get permission to read.
580    ///
581    /// Use this key to indicate that your app requires access to specific clinical record
582    /// data types to function properly. Set the value to an array of strings
583    /// containing the type identifiers for your required types. For a list of type
584    /// identifiers, see HKClinicalTypeIdentifier.
585    ///
586    /// To protect the user’s privacy, you must specify three or more required clinical
587    /// record types. If the user denies authorization to any of the types,
588    /// authorization fails with an HKError.Code.errorRequiredAuthorizationDenied error.
589    /// Your app is not told the record types to which the user denied access.
590    ///
591    /// ## Availability
592    /// * iOS 12.0+
593    ///
594    /// ## Framework
595    /// * HealthKit
596    #[serde(
597        rename = "NSHealthRequiredReadAuthorizationTypeIdentifiers",
598        serialize_with = "crate::serialize_option",
599        skip_serializing_if = "Option::is_none"
600    )]
601    pub health_required_read_authorization_type_identifiers: Option<Vec<String>>,
602}
603
604/// Home
605///
606/// [Enabling HomeKit in Your App](https://developer.apple.com/documentation/homekit/enabling_homekit_in_your_app)
607#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
608pub struct Home {
609    /// A message that tells the user why the app is requesting access to the user’s
610    /// HomeKit configuration data.
611    ///
612    /// ### Important
613    /// This key is required if your app uses APIs that access the user’s HomeKit
614    /// configuration data.
615    ///
616    /// For more information about using HomeKit in your app, see Enabling HomeKit in Your
617    /// App.
618    ///
619    /// ## Availability
620    /// * iOS 8.0+
621    /// * watchOS 2.0+
622    ///
623    /// ## Framework
624    /// * HomeKit
625    #[serde(
626        rename = "NSHomeKitUsageDescription",
627        serialize_with = "crate::serialize_option",
628        skip_serializing_if = "Option::is_none"
629    )]
630    pub home_kit_usage_description: Option<String>,
631}
632
633/// Location
634///
635/// [Choosing the Location Services Authorization to Request](https://developer.apple.com/documentation/corelocation/choosing_the_location_services_authorization_to_request)
636#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
637pub struct Location {
638    /// A message that tells the user why the app is requesting access to the user’s
639    /// location information at all times.
640    ///
641    /// Use this key if your iOS app accesses location information while running in the
642    /// background. If your app only needs location information when in the
643    /// foreground, use NSLocationWhenInUseUsageDescription instead.
644    /// For more information, see Choosing the Location Services Authorization to Request.
645    ///
646    /// If you need location information in a macOS app, use NSLocationUsageDescription
647    /// instead. If your iOS app deploys to versions earlier than iOS 11, see
648    /// NSLocationAlwaysUsageDescription.
649    ///
650    /// ### Important
651    /// This key is required if your iOS app uses APIs that access the user’s location
652    /// information at all times.
653    ///
654    /// ## Availability
655    /// * iOS 11.0+
656    ///
657    /// ## Framework
658    /// * Core Location
659    #[serde(
660        rename = "NSLocationAlwaysAndWhenInUseUsageDescription",
661        serialize_with = "crate::serialize_option",
662        skip_serializing_if = "Option::is_none"
663    )]
664    pub location_always_and_when_in_use_usage_description: Option<String>,
665    /// A message that tells the user why the app is requesting access to the user’s
666    /// location information.
667    ///
668    /// Use this key in a macOS app that accesses the user’s location information.
669    /// In an iOS app, use NSLocationWhenInUseUsageDescription or
670    /// NSLocationAlwaysAndWhenInUseUsageDescription instead.
671    ///
672    /// ### Important
673    /// This key is required if your macOS app uses APIs that access the user’s location
674    /// information.
675    ///
676    /// ## Availability
677    /// * iOS 6.0–8.0
678    /// * macOS 10.14+
679    ///
680    /// ## Framework
681    /// * Core Location
682    #[deprecated(since = "iOS 6.0-8.0")]
683    #[serde(
684        rename = "NSLocationUsageDescription",
685        serialize_with = "crate::serialize_option",
686        skip_serializing_if = "Option::is_none"
687    )]
688    pub location_usage_description: Option<String>,
689    /// A message that tells the user why the app is requesting access to the user’s
690    /// location information while the app is running in the foreground.
691    ///
692    /// Use this key if your iOS app accesses location information only when running in
693    /// the foreground. If your app needs location information when in the background,
694    /// use NSLocationAlwaysAndWhenInUseUsageDescription instead.
695    /// For more information, see Choosing the Location Services Authorization to Request.
696    ///
697    /// If you need location information in a macOS app, use NSLocationUsageDescription
698    /// instead.
699    ///
700    /// ### Important
701    /// This key is required if your iOS app uses APIs that access the user’s location
702    /// information while the app is in use.
703    ///
704    /// ## Availability
705    /// * iOS 11.0+
706    ///
707    /// ## Framework
708    /// * Core Location
709    #[serde(
710        rename = "NSLocationWhenInUseUsageDescription",
711        serialize_with = "crate::serialize_option",
712        skip_serializing_if = "Option::is_none"
713    )]
714    pub location_when_in_use_usage_description: Option<String>,
715    /// A collection of messages that explain why the app is requesting temporary access
716    /// to the user’s location.
717    ///
718    /// Use this key if your app needs temporary access to full accuracy location
719    /// information. Provide a dictionary of messages that address different use
720    /// cases, keyed by strings that you define. For example, if your app suggests
721    /// nearby coffee shops in one part of the app, and finds nearby friends in another,
722    /// you could include two entries
723    ///
724    /// When you request access, select among the messages at run time by providing the
725    /// associated key to the requestTemporaryFullAccuracyAuthorization(withPurposeKey:)
726    /// method:
727    ///
728    /// ```swift
729    /// // Request location access to find coffee shops.
730    /// manager.requestTemporaryFullAccuracyAuthorization(withPurposeKey: "coffee")
731    /// ````
732    ///
733    /// ## Availability
734    /// * iOS 14.0+
735    /// * macOS 11.0+
736    ///
737    /// ## Framework
738    /// * Core Location
739    #[serde(
740        rename = "NSLocationTemporaryUsageDescriptionDictionary",
741        serialize_with = "crate::serialize_option",
742        skip_serializing_if = "Option::is_none"
743    )]
744    pub location_temporary_usage_description_dictionary: Option<DefaultDictionary>,
745    /// A message that tells the user why the app is requesting access to the user's
746    /// location at all times.
747    ///
748    /// Use this key if your iOS app accesses location information in the background, and
749    /// you deploy to a target earlier than iOS 11. In that case, add both this key
750    /// and NSLocationAlwaysAndWhenInUseUsageDescription to your app’s Info.plist file
751    /// with the same message. Apps running on older versions of the OS use the
752    /// message associated with NSLocationAlwaysUsageDescription, while apps running on
753    /// later versions use the one associated with
754    /// NSLocationAlwaysAndWhenInUseUsageDescription.
755    ///
756    /// If your app only needs location information when in the foreground, use
757    /// NSLocationWhenInUseUsageDescription instead. For more information, see
758    /// Choosing the Location Services Authorization to Request.
759    ///
760    /// If you need location information in a macOS app, use NSLocationUsageDescription
761    /// instead.
762    ///
763    /// ### Important
764    /// This key is required if your iOS app uses APIs that access the user’s location at
765    /// all times and deploys to targets earlier than iOS 11.
766    ///
767    /// ## Availability
768    /// * iOS 8.0–10.0
769    ///
770    /// ## Framework
771    /// * Core Location
772    #[deprecated(
773        since = "iOS 8.0-10.0",
774        note = "For apps deployed to targets in iOS 11 and later, use NSLocationAlwaysAndWhenInUseUsageDescription instead."
775    )]
776    #[serde(
777        rename = "NSLocationAlwaysUsageDescription",
778        serialize_with = "crate::serialize_option",
779        skip_serializing_if = "Option::is_none"
780    )]
781    pub location_always_usage_description: Option<String>,
782    /// A Boolean value that indicates a widget uses the user’s location information.
783    ///
784    /// To access the user’s location information from a widget, set the value to true in
785    /// the widget extension’s Info.plist file.
786    ///
787    /// Before a widget can access location information, the containing app must request
788    /// authorization from the user. The containing app’s Info.plist file must also
789    /// contain relevant purpose strings. For more information, see Requesting
790    /// Authorization for Location Services.
791    ///
792    /// ## Availability
793    /// * iOS 14.0+
794    /// * macOS 11.0+
795    ///
796    /// ## Framework
797    /// * WidgetKit
798    #[serde(
799        rename = "NSWidgetWantsLocation",
800        serialize_with = "crate::serialize_option",
801        skip_serializing_if = "Option::is_none"
802    )]
803    pub widget_wants_location: Option<bool>,
804    /// A Boolean value that indicates whether the app requests reduced location accuracy
805    /// by default.
806    ///
807    /// Include this key in your information property list to set your app’s default
808    /// behavior for location accuracy when it calls the Core Location framework.
809    /// Set the key value to true to prompt the user for reduced accuracy by default; set
810    /// it to false to prompt for full location accuracy. If you don't include that
811    /// key in your Info.plist, that's equivalent to setting it to false.
812    ///
813    /// Include the key pair in your Info.plist file as shown:
814    ///
815    /// <!-- Info.plist -->
816    /// <key>NSLocationDefaultAccuracyReduced</key>
817    /// `<true/>`
818    ///
819    /// When this key is set to true, all Core Location services (location updates, visit
820    /// monitoring, significant location change, fence monitoring) receive service at the
821    /// reduced-accuracy service level. Users will see that your app is asking for
822    /// reduced accuracy because the location authorization prompt will show a map with an
823    /// approximate location, and your app will have the Precise Location toggled off in
824    /// Settings > Privacy > Location Services . These indicators of an app's improved
825    /// privacy are ones that users may value.
826    ///
827    /// If you want to leverage the reduced-accuracy feature to improve privacy in a
828    /// particular operation without setting this key, use the desiredAccuracy constant
829    /// kCLLocationAccuracyReduced. This constant causes startUpdatingLocation() to
830    /// deliver results as if the app were authorized for approximate location until you
831    /// change the desiredAccuracy constant again.
832    ///
833    /// Setting NSLocationDefaultAccuracyReduced determines the default type of
834    /// authorization your app gets, but users can override it any time in Settings.
835    /// Users always control the level of location accuracy they want to share, and can
836    /// change precision settings in Settings > Privacy > Location Services by selecting
837    /// Precise Location for your app.
838    ///
839    /// ## Availability
840    /// * iOS 14.0+
841    /// * watchOS 7.0+
842    ///
843    /// ## Framework
844    /// * Core Location
845    #[serde(
846        rename = "NSLocationDefaultAccuracyReduced",
847        serialize_with = "crate::serialize_option",
848        skip_serializing_if = "Option::is_none"
849    )]
850    pub location_default_accuracy_reduced: Option<bool>,
851}
852
853/// Media Player
854///
855/// [Requesting Access to Apple Music Library](https://developer.apple.com/documentation/storekit/skcloudservicecontroller/requesting_access_to_apple_music_library)
856#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
857pub struct MediaPlayer {
858    /// A message that tells the user why the app is requesting access to the user’s media
859    /// library.
860    ///
861    /// Set the value of this key to a user-readable description of how you intend to use
862    /// the user's media library. The first time your app access the user's media
863    /// library, the system prompts the user to grant or deny authorization for your app
864    /// to do so. The system includes this key's description in the dialog it displays
865    /// to the user.
866    ///
867    /// ### Important
868    /// This key is required if your app uses APIs that access the user’s media library.
869    ///
870    /// ## Availability
871    /// * iOS 2.0+
872    ///
873    /// ## Framework
874    /// * Media Player
875    #[serde(
876        rename = "NSAppleMusicUsageDescription",
877        serialize_with = "crate::serialize_option",
878        skip_serializing_if = "Option::is_none"
879    )]
880    pub apple_music_usage_description: Option<String>,
881}
882
883/// Motion
884#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
885pub struct Motion {
886    /// A message that tells the user why the app is requesting access to the device’s
887    /// motion data.
888    ///
889    /// ### Important
890    /// This key is required if your app uses APIs that access the device’s motion data,
891    /// including CMSensorRecorder, CMPedometer, CMMotionActivityManager, and
892    /// CMMovementDisorderManager. If you don’t include this key, your app will crash
893    /// when it attempts to access motion data.
894    ///
895    /// ## Availability
896    /// * iOS 7.0+
897    /// * macOS 10.15+
898    ///
899    /// ## Framework
900    /// * Core Motion
901    #[serde(
902        rename = "NSMotionUsageDescription",
903        serialize_with = "crate::serialize_option",
904        skip_serializing_if = "Option::is_none"
905    )]
906    pub motion_usage_description: Option<String>,
907    /// A message to the user that explains the app’s request for permission to access
908    /// fall detection event data.
909    ///
910    /// ### Important
911    /// If your app uses the CMFallDetectionManager, the app requires this key.
912    ///
913    /// ## Availability
914    /// * watchOS 7.2+
915    ///
916    /// ## Framework
917    /// * Core Motion
918    #[serde(
919        rename = "NSFallDetectionUsageDescription",
920        serialize_with = "crate::serialize_option",
921        skip_serializing_if = "Option::is_none"
922    )]
923    pub fall_detection_usage_description: Option<String>,
924}
925
926/// Networking
927#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
928pub struct Networking {
929    /// A message that tells the user why the app is requesting access to the local
930    /// network.
931    ///
932    /// Any app that uses the local network, directly or indirectly, should include this
933    /// description. This includes apps that use Bonjour and services implemented with
934    /// Bonjour, as well as direct unicast or multicast connections to local hosts.
935    ///
936    /// ## Availability
937    /// * iOS 14.0+
938    /// * macOS 11.0+
939    /// * tvOS 14.0+
940    ///
941    /// ## Framework
942    /// * Network
943    #[serde(
944        rename = "NSLocalNetworkUsageDescription",
945        serialize_with = "crate::serialize_option",
946        skip_serializing_if = "Option::is_none"
947    )]
948    pub local_network_usage_description: Option<String>,
949    /// A request for user permission to begin an interaction session with nearby devices.
950    ///
951    /// Before an app starts an interaction session, the system requests permission to
952    /// share the user’s relative distance and direction with a nearby peer.
953    /// The framework presents a prompt that displays the string value of this key
954    /// contained in your project’s Info.plist. Define text that explains your
955    /// interaction session's purpose to the user. For more information, see
956    /// Initiating and Maintaining a Session.
957    ///
958    /// This property is localizable.
959    ///
960    /// ## Availability
961    /// * iOS 14.0+
962    ///
963    /// ## Framework
964    /// * Nearby Interaction
965    #[serde(
966        rename = "NSNearbyInteractionAllowOnceUsageDescription",
967        serialize_with = "crate::serialize_option",
968        skip_serializing_if = "Option::is_none"
969    )]
970    pub nearby_interaction_allow_once_usage_description: Option<String>,
971}
972
973/// NFC
974#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
975pub struct Nfc {
976    /// A message that tells the user why the app is requesting access to the device’s NFC
977    /// hardware.
978    ///
979    /// ### Important
980    /// You’re required to provide this key if your app uses APIs that access the NFC
981    /// hardware.
982    ///
983    /// ## Availability
984    /// * iOS 11.0+
985    ///
986    /// ## Framework
987    /// * Core NFC
988    #[serde(
989        rename = "NFCReaderUsageDescription",
990        serialize_with = "crate::serialize_option",
991        skip_serializing_if = "Option::is_none"
992    )]
993    pub nfc_reader_usage_description: Option<String>,
994}
995
996/// Photos
997///
998/// [Delivering a Great Privacy Experience in Your Photos App](https://developer.apple.com/documentation/photokit/delivering_a_great_privacy_experience_in_your_photos_app)
999#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1000pub struct Photos {
1001    /// A message that tells the user why the app is requesting add-only access to the
1002    /// user’s photo library.
1003    ///
1004    /// ### Important
1005    /// This key is required if your app uses APIs that have write access to the user’s
1006    /// photo library.
1007    ///
1008    /// ## Availability
1009    /// * iOS 11.0+
1010    ///
1011    /// ## Framework
1012    /// * Photos
1013    #[serde(
1014        rename = "NSPhotoLibraryAddUsageDescription",
1015        serialize_with = "crate::serialize_option",
1016        skip_serializing_if = "Option::is_none"
1017    )]
1018    pub photo_library_add_usage_description: Option<String>,
1019    /// A message that tells the user why the app is requesting access to the user’s photo
1020    /// library.
1021    ///
1022    /// If your app only adds assets to the photo library and does not read assets, use
1023    /// the NSPhotoLibraryAddUsageDescription key instead.
1024    ///
1025    /// ### Important
1026    /// This key is required if your app uses APIs that have read or write access to the
1027    /// user’s photo library.
1028    ///
1029    /// ## Availability
1030    /// * iOS 6.0+
1031    /// * macOS 10.14+
1032    ///
1033    /// ## Framework
1034    /// * Photos
1035    #[serde(
1036        rename = "NSPhotoLibraryUsageDescription",
1037        serialize_with = "crate::serialize_option",
1038        skip_serializing_if = "Option::is_none"
1039    )]
1040    pub photo_library_usage_description: Option<String>,
1041}
1042
1043/// Scripting
1044#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1045pub struct Scripting {
1046    /// A Boolean value indicating whether AppleScript is enabled.
1047    ///
1048    /// ## Availability
1049    /// * macOS 10.0+
1050    ///
1051    /// ## Framework
1052    /// * Foundation
1053    #[serde(
1054        rename = "NSAppleScriptEnabled",
1055        serialize_with = "crate::serialize_option",
1056        skip_serializing_if = "Option::is_none"
1057    )]
1058    pub apple_script_enabled: Option<bool>,
1059}
1060
1061/// Security
1062#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1063pub struct Security {
1064    /// A message that informs the user why an app is requesting permission to use data
1065    /// for tracking the user or the device.
1066    ///
1067    /// If your app calls the App Tracking Transparency API, you must provide custom text,
1068    /// known as a usage-description string, which displays as a system-permission alert
1069    /// request. The usage-description string tells the user why the app is requesting
1070    /// permission to use data for tracking the user or the device. The user has the
1071    /// option to grant or deny the authorization request. If you don’t include a
1072    /// usage-description string, your app may crash when a user first launches it.
1073    ///
1074    /// Make sure your app requests permission to track sometime before tracking occurs.
1075    /// This could be at first launch or when using certain features in your app.
1076    /// For example, when signing on with a third-party SSO.
1077    ///
1078    /// Set the NSUserTrackingUsageDescription key in the Information Property List
1079    /// (Info.plist):
1080    ///
1081    /// 1. Select your project’s Info.plist file in Xcode Project navigator.
1082    ///
1083    /// 2. Modify the file using the Xcode Property List Editor: Privacy - Tracking Usage
1084    /// Description.
1085    ///
1086    /// * Use sentence-style capitalization and appropriate ending punctuation.
1087    /// Keep the text short and specific.
1088    /// You don’t need to include your app name because the system already identifies your
1089    /// app.
1090    ///
1091    /// * If the title is a sentence fragment, don’t add ending punctuation.
1092    ///
1093    /// See Apple’s Human Interface Guidelines for example usage descriptions.
1094    ///
1095    /// ## Availability
1096    /// * iOS 14.0+
1097    /// * tvOS 14.0+
1098    ///
1099    /// ## Framework
1100    /// * Security
1101    #[serde(
1102        rename = "NSUserTrackingUsageDescription",
1103        serialize_with = "crate::serialize_option",
1104        skip_serializing_if = "Option::is_none"
1105    )]
1106    pub user_tracking_usage_description: Option<String>,
1107    /// A message that tells the user why the app is requesting the ability to send Apple
1108    /// events.
1109    ///
1110    /// An app using Apple events to control another app might be able to gain access to
1111    /// sensitive user data. For example, the Mail app stores a lot of personal
1112    /// information in its local database that other apps can’t access directly.
1113    /// But because Mail can be automated with Apple events, other apps can use Mail to
1114    /// gain access to the data indirectly.
1115    ///
1116    /// ### Important
1117    /// This key is required if your app uses APIs that send Apple events.
1118    ///
1119    /// ## Availability
1120    /// * macOS 10.14+
1121    ///
1122    /// ## Framework
1123    /// * Security
1124    #[serde(
1125        rename = "NSAppleEventsUsageDescription",
1126        serialize_with = "crate::serialize_option",
1127        skip_serializing_if = "Option::is_none"
1128    )]
1129    pub apple_events_usage_description: Option<String>,
1130    /// A message in macOS that tells the user why the app is requesting to manipulate the
1131    /// system configuration.
1132    ///
1133    /// Use this key if your app uses certain APIs that manipulate system configuration,
1134    /// like ODRecordSetValue(_:_:_:_:).
1135    ///
1136    /// ### Important
1137    /// This key is required if your app uses APIs that manipulate the system
1138    /// configuration.
1139    ///
1140    /// ## Availability
1141    /// * macOS 10.14+
1142    ///
1143    /// ## Framework
1144    /// * Security
1145    #[serde(
1146        rename = "NSSystemAdministrationUsageDescription",
1147        serialize_with = "crate::serialize_option",
1148        skip_serializing_if = "Option::is_none"
1149    )]
1150    pub system_administration_usage_description: Option<String>,
1151    /// A Boolean value indicating whether the app uses encryption.
1152    ///
1153    /// Set the value for this key to NO in your app’s Information Property List file to
1154    /// indicate that your app—including any third-party libraries you link against—either
1155    /// uses no encryption, or only uses encryption that’s exempt from export compliance
1156    /// requirements, as described in Determine your export compliance requirements.
1157    /// Set the value to YES to indicate that your app uses non-exempt encryption.
1158    ///
1159    /// If you set the value to YES, you typically also provide a value for the
1160    /// ITSEncryptionExportComplianceCode key. You set that key’s value using a code
1161    /// Apple provides after successfully reviewing your export compliance documentation.
1162    ///
1163    /// If you don’t have the ITSAppUsesNonExemptEncryption key in your app’s Info.plist
1164    /// file, App Store Connect walks you through an export compliance questionnaire every
1165    /// time you upload a new version of your app. Including the key streamlines the
1166    /// app submission process.
1167    ///
1168    /// For additional information, see Complying with Encryption Export Regulations.
1169    ///
1170    /// ## Availability
1171    /// * macOS 10.0+
1172    ///
1173    /// ## Framework
1174    /// * Security
1175    #[serde(
1176        rename = "ITSAppUsesNonExemptEncryption",
1177        serialize_with = "crate::serialize_option",
1178        skip_serializing_if = "Option::is_none"
1179    )]
1180    pub app_uses_non_exempt_encryption: Option<bool>,
1181    /// The export compliance code provided by App Store Connect for apps that require it.
1182    ///
1183    /// Include this key in your app’s Information Property List file if you set the
1184    /// ITSAppUsesNonExemptEncryption key’s value to YES. Set the value for this key
1185    /// to the code that Apple sends you after successfully reviewing export compliance
1186    /// documentation that you provide through App Store Connect.
1187    ///
1188    /// For additional information, see Complying with Encryption Export Regulations.
1189    ///
1190    /// ## Availability
1191    /// * macOS 10.0+
1192    ///
1193    /// ## Framework
1194    /// * Security
1195    #[serde(
1196        rename = "ITSEncryptionExportComplianceCode",
1197        serialize_with = "crate::serialize_option",
1198        skip_serializing_if = "Option::is_none"
1199    )]
1200    pub encryption_export_compliance_code: Option<String>,
1201}
1202
1203/// Sensors
1204#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1205pub struct Sensors {
1206    /// ## Availability
1207    /// * iOS 14.0+
1208    ///
1209    /// ## Framework
1210    /// * SensorKit
1211    #[serde(
1212        rename = "NSSensorKitUsageDescription",
1213        serialize_with = "crate::serialize_option",
1214        skip_serializing_if = "Option::is_none"
1215    )]
1216    pub sensor_kit_usage_description: Option<String>,
1217    /// ## Availability
1218    /// * iOS 14.0+
1219    ///
1220    /// ## Framework
1221    /// * SensorKit
1222    #[serde(
1223        rename = "NSSensorKitUsageDetail",
1224        serialize_with = "crate::serialize_option",
1225        skip_serializing_if = "Option::is_none"
1226    )]
1227    pub sensor_kit_usage_detail: Option<DefaultDictionary>,
1228    /// ## Availability
1229    /// * iOS 14.0+
1230    ///
1231    /// ## Framework
1232    /// * SensorKit
1233    #[serde(
1234        rename = "NSSensorKitPrivacyPolicyURL",
1235        serialize_with = "crate::serialize_option",
1236        skip_serializing_if = "Option::is_none"
1237    )]
1238    pub sensor_kit_privacy_policy_url: Option<String>,
1239}
1240
1241/// Siri
1242///
1243/// [Requesting Authorization to Use SiriKit](https://developer.apple.com/documentation/sirikit/requesting_authorization_to_use_sirikit)
1244#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1245pub struct Siri {
1246    /// A message that tells the user why the app is requesting to send user data to Siri.
1247    ///
1248    /// ### important
1249    /// This key is required if your app uses APIs that send user data to Siri
1250    ///
1251    /// ## Availability
1252    /// * iOS 10.0+
1253    ///
1254    /// ## Framework
1255    /// * Intents
1256    #[serde(
1257        rename = "NSSiriUsageDescription",
1258        serialize_with = "crate::serialize_option",
1259        skip_serializing_if = "Option::is_none"
1260    )]
1261    pub siri_usage_description: Option<String>,
1262}
1263
1264/// Speech
1265///
1266/// [Asking Permission to Use Speech Recognition](https://developer.apple.com/documentation/speech/asking_permission_to_use_speech_recognition)
1267#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1268pub struct Speech {
1269    /// A message that tells the user why the app is requesting to send user data to
1270    /// Apple’s speech recognition servers.
1271    ///
1272    /// ### Important
1273    /// This key is required if your app uses APIs that send user data to Apple’s speech
1274    /// recognition servers.
1275    ///
1276    /// ## Availability
1277    /// * iOS 10.0+
1278    /// * macOS 10.15+
1279    ///
1280    /// ## Framework
1281    /// * Speech
1282    #[serde(
1283        rename = "NSSpeechRecognitionUsageDescription",
1284        serialize_with = "crate::serialize_option",
1285        skip_serializing_if = "Option::is_none"
1286    )]
1287    pub speech_recognition_usage_description: Option<String>,
1288}
1289
1290/// TV Resource
1291#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1292pub struct TvResource {
1293    /// A message that tells the user why the app is requesting access to the user’s TV
1294    /// provider account.
1295    ///
1296    /// ### Important
1297    /// This key is required if your app uses APIs that access the user’s TV provider
1298    /// account.
1299    ///
1300    /// ## Availability
1301    /// * tvOS 12.0+
1302    ///
1303    /// ## Framework
1304    /// * TVUIKit
1305    #[serde(
1306        rename = "NSVideoSubscriberAccountUsageDescription",
1307        serialize_with = "crate::serialize_option",
1308        skip_serializing_if = "Option::is_none"
1309    )]
1310    pub video_subscriber_account_usage_description: Option<String>,
1311}
1312
1313/// Wi-Fi
1314#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1315pub struct WiFi {
1316    /// A Boolean value indicating whether the app requires a Wi-Fi connection.
1317    ///
1318    /// ## Availability
1319    /// * iOS 2.0+
1320    ///
1321    /// ## Framework
1322    /// * UIKit
1323    #[serde(
1324        rename = "UIRequiresPersistentWiFi",
1325        serialize_with = "crate::serialize_option",
1326        skip_serializing_if = "Option::is_none"
1327    )]
1328    pub requires_persistent_wifi: Option<bool>,
1329}
1330
1331/// Health Kit Capabilities
1332#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
1333pub enum HealthKitCapabilities {
1334    /// The app can request access to FHIR-backed clinical records.
1335    #[serde(rename = "health-records")]
1336    HealthRecords,
1337}