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