Skip to main content

apple_bundle/info_plist/
app_services.rs

1//! # App Services
2//!
3//! Configure services provided by the app, like support for giving directions or using
4//! game controllers.
5//!
6//! Add keys to your app’s Information Property List file that tell the system about
7//! services that your app provides.
8//!
9//! ## Framework
10//! * Bundle Resources
11
12use super::DefaultDictionary;
13use serde::{Deserialize, Serialize};
14
15/// Car Play
16#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
17pub struct CarPlay {
18    /// ## Availability
19    /// * iOS 13.1+
20    ///
21    /// ## Framework
22    /// * CarPlay
23    #[serde(
24        rename = "CPSupportsDashboardNavigationScene",
25        serialize_with = "crate::serialize_option",
26        skip_serializing_if = "Option::is_none"
27    )]
28    pub supports_dashboard_navigation_scene: Option<bool>,
29    /// ## Availability
30    /// * iOS 13.1+
31    ///
32    /// ## Framework
33    /// * CarPlay
34    #[serde(
35        rename = "CPTemplateApplicationDashboardSceneSessionRoleApplication",
36        serialize_with = "crate::serialize_option",
37        skip_serializing_if = "Option::is_none"
38    )]
39    pub template_application_dashboard: Option<Vec<TemplateApplicationDashboard>>,
40    /// ## Availability
41    /// * iOS 13.0+
42    ///
43    /// ## Framework
44    /// * CarPlay
45    #[serde(
46        rename = "CPTemplateApplicationSceneSessionRoleApplication",
47        serialize_with = "crate::serialize_option",
48        skip_serializing_if = "Option::is_none"
49    )]
50    pub template_application_scene_session_role: Option<Vec<TemplateApplicationSceneSessionRole>>,
51}
52
53/// Template Application Dashboard
54#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
55pub struct TemplateApplicationDashboard {
56    /// ## Availability
57    /// * iOS 13.1+
58    ///
59    /// ## Framework
60    /// * CarPlay
61    #[serde(rename = "UISceneClassName")]
62    pub scene_class_name: ClassName,
63    /// ## Availability
64    /// * iOS 13.1+
65    ///
66    /// ## Framework
67    /// * CarPlay
68    #[serde(rename = "UISceneConfigurationName")]
69    pub scene_configuration_name: String,
70    /// ## Availability
71    /// * iOS 13.1+
72    ///
73    /// ## Framework
74    /// * CarPlay
75    #[serde(rename = "UISceneDelegateClassName")]
76    pub scene_delegate_class_name: String,
77}
78
79/// Class Name
80#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
81pub enum ClassName {
82    #[serde(rename = "CPTemplateApplicationDashboardScene")]
83    #[default]
84    TemplateApplicationDashboardScene,
85}
86
87/// Template Application Scene Session Role
88#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
89pub struct TemplateApplicationSceneSessionRole {
90    /// ## Availability
91    /// * iOS 13.0+
92    ///
93    /// ## Framework
94    /// * CarPlay
95    #[serde(rename = "UISceneClassName")]
96    pub scene_class_name: TemplateApplication,
97    /// ## Availability
98    /// * iOS 13.1+
99    ///
100    /// ## Framework
101    /// * CarPlay
102    #[serde(rename = "UISceneConfigurationName")]
103    pub scene_configuration_name: String,
104    /// ## Availability
105    /// * iOS 13.1+
106    ///
107    /// ## Framework
108    /// * CarPlay
109    #[serde(rename = "UISceneDelegateClassName")]
110    pub scene_delegate_class_name: String,
111}
112
113/// Template Application
114#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
115pub enum TemplateApplication {
116    #[serde(rename = "CPTemplateApplicationScene")]
117    #[default]
118    Scene,
119}
120
121/// Exposure Notification
122#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
123pub struct ExposureNotification {
124    /// A number that specifies the version of the API to use.
125    ///
126    /// ### Important
127    /// This type is available in iOS 12.5, and in iOS 13.7 and later.
128    ///
129    /// iOS 13.7 introduces a new method to calculate the user’s Exposure Risk Value,
130    /// described in ENExposureConfiguration. Set this value to 2 to use this new
131    /// version and its calculation method, or set this value to 1 to use the earlier API
132    /// and its calculation method. If you don’t explicitly set this value, the
133    /// default is 1.
134    ///
135    /// ## Availability
136    /// * iOS 13.7+
137    ///
138    /// ## Framework
139    /// * Exposure Notification
140    #[serde(
141        rename = "ENAPIVersion",
142        skip_serializing_if = "Option::is_none",
143        serialize_with = "crate::serialize_enum_option"
144    )]
145    pub version: Option<Version>,
146    /// A string that specifies the region that the app supports.
147    ///
148    /// ### Important
149    /// This type is available in iOS 12.5, and in iOS 13.7 and later.
150    ///
151    /// All ExposureNotification apps must specify the region for which they work by
152    /// adding this key to the app’s Info.plist file. The value is a string that
153    /// represents the app’s region. This value can be an ISO 3166-1 country code
154    /// (e.g. “CA” for Canada), or the ISO 3166-1/3166-2 country code plus subdivision
155    /// code (“US-CA” for California).
156    ///
157    /// ## Availability
158    /// * iOS 13.7+
159    ///
160    /// ## Framework
161    /// * Exposure Notification
162    #[serde(
163        rename = "ENDeveloperRegion",
164        serialize_with = "crate::serialize_option",
165        skip_serializing_if = "Option::is_none"
166    )]
167    pub developer_region: Option<String>,
168}
169
170/// Version
171#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
172pub enum Version {
173    /// Use version 1 of the API.
174    #[serde(rename = "1")]
175    One,
176    /// Use version 2 of the API.
177    #[serde(rename = "2")]
178    Two,
179}
180
181/// Pointer Interactions
182#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
183pub struct PointerInteractions {
184    /// A Boolean value indicating that the app generally supports indirect input
185    /// mechanisms.
186    ///
187    /// If this key is not present or returns NO:
188    /// * When the user clicks an indirect pointing device, UIKit generates a UITouch of
189    ///   type UITouch.TouchType.direct.
190    /// * When pinching or rotating using an indirect touch surface, UIKit creates touches
191    ///   a fixed distance apart that simulate the gesture on the indirect touch surface.
192    /// * Because these are normal UITouch events, they may incidentally activate other
193    ///   gesture recognizers
194    ///
195    /// If the key is present and returns YES:
196    /// * When the user clicks an indirect pointing device, UIKit generates a UITouch of
197    ///   type UITouch.TouchType.indirectPointer.
198    /// * When pinching or rotating using an indirect touch surface, UIKit drives
199    ///   UIPinchGestureRecognizer and UIRotationGestureRecognizer with an event of type
200    ///   UIEvent.EventType.transform.
201    /// * Currently, only certain prepackaged gestures in UIKit, like
202    ///   UIPinchGestureRecognizer and UIRotationGestureRecognizer, are capable of
203    ///   handling this event.
204    /// Other gestures may be added to this list in future releases.
205    /// * Gestures that may have worked previously with the simulated touches no longer
206    ///   work.
207    /// * Be careful with certain UIGestureRecognizer APIs when gestures are driven by
208    ///   events of type UIEvent.EventType.scroll or
209    ///   UIEvent.EventType.transform.numberOfTouches returns 0, andlocation(ofTouch:in:)
210    ///   raises an exception because there are no touches driving these gestures with
211    ///   those events.
212    ///
213    /// For the case when exceptions might be raised, use either shouldReceive(_:) or the
214    /// delegate call of gestureRecognizer(_:shouldReceive:) to determine that gesture
215    /// recognizers are acting on a non-touch-based event.
216    ///
217    /// ### Important
218    /// UIApplicationSupportsIndirectInputEvents is a compatibility affordance to ease the
219    /// adoption of indirect input for a UIKit application. In a future release, this
220    /// new behavior will become the default and this key will no longer be consulted.
221    ///
222    /// ## Availability
223    /// * iOS 13.4+
224    ///
225    /// ## Framework
226    /// * UIKit
227    #[serde(
228        rename = "UIApplicationSupportsIndirectInputEvents",
229        serialize_with = "crate::serialize_option",
230        skip_serializing_if = "Option::is_none"
231    )]
232    pub application_supports_indirect_input_events: Option<bool>,
233}
234
235/// Games
236#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
237pub struct Games {
238    /// A Boolean value indicating whether GameKit can add badges to a turn-based game
239    /// icon.
240    ///
241    /// ## Availability
242    /// * iOS 7.0+
243    ///
244    /// ## Framework
245    /// * GameKit
246    #[serde(
247        rename = "GKGameCenterBadgingDisabled",
248        serialize_with = "crate::serialize_option",
249        skip_serializing_if = "Option::is_none"
250    )]
251    pub game_center_badging_disabled: Option<bool>,
252    /// A Boolean value that indicates whether GameKit can display challenge banners in a
253    /// game.
254    ///
255    /// ## Availability
256    /// * iOS 7.0+
257    ///
258    /// ## Framework
259    /// * GameKit
260    #[serde(
261        rename = "GKShowChallengeBanners",
262        serialize_with = "crate::serialize_option",
263        skip_serializing_if = "Option::is_none"
264    )]
265    pub show_challenge_banners: Option<bool>,
266    /// The types of game controllers allowed or required by the app.
267    ///
268    /// ## Availability
269    /// * iOS 7.0+
270    /// * macOS 10.9+
271    /// * tvOS 9.0+
272    ///
273    /// ## Framework
274    /// * Game Controller
275    #[serde(
276        rename = "GCSupportedGameControllers",
277        skip_serializing_if = "Option::is_none",
278        serialize_with = "crate::serialize_vec_enum_option"
279    )]
280    pub supported_game_controllers: Option<Vec<ProfileName>>,
281    /// A Boolean value indicating whether the app supports a game controller.
282    ///
283    /// To add this key to the Information Property List, enable the Game Controllers
284    /// capability in Xcode.
285    ///
286    /// ## Availability
287    /// * iOS 7.0+
288    /// * macOS 10.9+
289    /// * tvOS 9.0+
290    ///
291    /// ## Framework
292    /// * Game Controller
293    #[serde(
294        rename = "GCSupportsControllerUserInteraction",
295        serialize_with = "crate::serialize_option",
296        skip_serializing_if = "Option::is_none"
297    )]
298    pub supports_controller_user_interaction: Option<bool>,
299    /// A Boolean value indicating whether the physical Apple TV Remote and the Apple TV
300    /// Remote app operate as separate game controllers.
301    ///
302    /// ## Availability
303    /// * tvOS 9.0+
304    ///
305    /// ## Framework
306    /// * Game Controller
307    #[serde(
308        rename = "GCSupportsMultipleMicroGamepads",
309        serialize_with = "crate::serialize_option",
310        skip_serializing_if = "Option::is_none"
311    )]
312    pub supports_multiple_micro_gamepads: Option<bool>,
313}
314
315#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
316pub enum ProfileName {
317    #[serde(rename = "ExtendedGamepad")]
318    ExtendedGamepad,
319    #[serde(rename = "MicroGamepad")]
320    MicroGamepad,
321}
322
323/// Intents
324#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
325pub struct Intents {
326    /// The names of the intent classes your app handles directly.
327    ///
328    /// Provide the class name of each INIntent subclass your app can handle.
329    /// To specify this information in Xcode, add the class names in the Supported Intents
330    /// section of your app target in the Project Editor.
331    ///
332    /// For more information on handling intents in your app, see
333    /// application(_:handlerFor:).
334    ///
335    /// ### Tip
336    /// You can start handling an intent in your app even if you want to support the
337    /// intent in iOS 13. List the intent in the Supported Intents sections for both
338    /// the app target and the extension target. For an app running on iOS 13, the
339    /// system routes the intent with handler(for:), and for later iOS versions, it routes
340    /// the intent with application(_:handlerFor:).
341    ///
342    /// ## Availability
343    /// * iOS 14.0+
344    /// * tvOS 14.0+
345    ///
346    /// ## Framework
347    /// * Intents
348    #[serde(
349        rename = "INIntentsSupported",
350        serialize_with = "crate::serialize_option",
351        skip_serializing_if = "Option::is_none"
352    )]
353    pub intents_supported: Option<Vec<String>>,
354    /// The names of the intent classes your app can’t handle when the user locks the
355    /// device.
356    ///
357    /// To specify this information in Xcode, add the intent class name to your app
358    /// target’s Supported Intents in the Project Editor. Then set the Authentication
359    /// level to Restricted While Locked.
360    ///
361    /// ## Availability
362    /// * iOS 14.0+
363    /// * tvOS 14.0+
364    ///
365    /// ## Framework
366    /// * Intents
367    #[serde(
368        rename = "INIntentsRestrictedWhileLocked",
369        serialize_with = "crate::serialize_option",
370        skip_serializing_if = "Option::is_none"
371    )]
372    pub intents_restricted_while_locked: Option<Vec<String>>,
373    /// The names of the intent classes your app can’t handle when the user locks the
374    /// device or the system blocks access to protected data.
375    ///
376    /// To specify this information in Xcode, add the intent class name to your app
377    /// target’s Supported Intents in the Project Editor. Then set the Authentication
378    /// level to Restricted While Locked or Protected Data Unavailable.
379    ///
380    /// ## Availability
381    /// * iOS 14.0+
382    /// * tvOS 14.0+
383    ///
384    /// ## Framework
385    /// * Intents
386    #[serde(
387        rename = "INIntentsRestrictedWhileProtectedDataUnavailable",
388        serialize_with = "crate::serialize_option",
389        skip_serializing_if = "Option::is_none"
390    )]
391    pub intents_restricted_while_protected_data_unavailable: Option<Vec<String>>,
392    /// Types of media supported by your app’s media-playing intents.
393    ///
394    /// Specify one or more media categories to allow Siri to invoke your app’s intent
395    /// handling when a user asks to play media. Use INMediaCategoryGeneral for media
396    /// that doesn’t fit into any of the other categories, like white noise or sound
397    /// effects.
398    ///
399    /// To specify this information in Xcode, add INPlayMediaIntent to your app’s list of
400    /// Supported Intents. Then select the relevant media types in the list that
401    /// appears.
402    ///
403    /// ## Availability
404    /// * iOS 14.0+
405    /// * tvOS 14.0+
406    ///
407    /// ## Framework
408    /// * Intents
409    #[serde(
410        rename = "INSupportedMediaCategories",
411        skip_serializing_if = "Option::is_none",
412        serialize_with = "crate::serialize_vec_enum_option"
413    )]
414    pub supported_media_categories: Option<Vec<SupportedMediaCategories>>,
415}
416
417/// Supported Media Categories
418#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
419pub enum SupportedMediaCategories {
420    /// Audiobooks
421    #[serde(rename = "INMediaCategoryAudiobooks")]
422    InMediaCategoryAudiobooks,
423    /// Music
424    #[serde(rename = "INMediaCategoryMusic")]
425    InMediaCategoryMusic,
426    /// General
427    #[serde(rename = "INMediaCategoryGeneral")]
428    InMediaCategoryGeneral,
429    /// Podcasts
430    #[serde(rename = "INMediaCategoryPodcasts")]
431    InMediaCategoryPodcasts,
432    /// Radio
433    #[serde(rename = "INMediaCategoryRadio")]
434    InMediaCategoryRadio,
435}
436
437/// Maps
438#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
439pub struct Maps {
440    /// The modes of transportation for which the app is capable of giving directions.
441    ///
442    /// ## Availability
443    /// * iOS 6.0+
444    ///
445    /// ## Framework
446    /// * Intents
447    #[serde(
448        rename = "MKDirectionsApplicationSupportedModes",
449        skip_serializing_if = "Option::is_none",
450        serialize_with = "crate::serialize_vec_enum_option"
451    )]
452    pub directions_application_supported_modes: Option<Vec<DirectionsApplicationSupportedModes>>,
453}
454
455/// Directions Application Supported Modes
456#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
457pub enum DirectionsApplicationSupportedModes {
458    #[serde(rename = "MKDirectionsModePlane")]
459    MkDirectionsModePlane,
460    #[serde(rename = "MKDirectionsModeBike")]
461    MkDirectionsModeBike,
462    #[serde(rename = "MKDirectionsModeBus")]
463    MkDirectionsModeBus,
464    #[serde(rename = "MKDirectionsModeCar")]
465    MkDirectionsModeCar,
466    #[serde(rename = "MKDirectionsModeFerry")]
467    MkDirectionsModeFerry,
468    #[serde(rename = "MKDirectionsModePedestrian")]
469    MkDirectionsModePedestrian,
470    #[serde(rename = "MKDirectionsModeRideShare")]
471    MkDirectionsModeRideShare,
472    #[serde(rename = "MKDirectionsModeStreetCar")]
473    MkDirectionsModeStreetCar,
474    #[serde(rename = "MKDirectionsModeSubway")]
475    MkDirectionsModeSubway,
476    #[serde(rename = "MKDirectionsModeTaxi")]
477    MkDirectionsModeTaxi,
478    #[serde(rename = "MKDirectionsModeTrain")]
479    MkDirectionsModeTrain,
480    #[serde(rename = "MKDirectionsModeOther")]
481    MkDirectionsModeOther,
482}
483
484/// NFC
485#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
486pub struct NfcAppServices {
487    /// A list of FeliCa system codes that the app supports.
488    ///
489    /// Each system code must be a discrete value. The wild card value (0xFF) isn't
490    /// allowed.
491    ///
492    /// ## Availability
493    /// * iOS 13.0+
494    ///
495    /// ## Framework
496    /// * Core NFC
497    #[serde(
498        rename = "com.apple.developer.nfc.readersession.felica.systemcodes",
499        serialize_with = "crate::serialize_option",
500        skip_serializing_if = "Option::is_none"
501    )]
502    pub nfc_readersession_felica_systemcodes: Option<Vec<String>>,
503    /// A list of application identifiers that the app supports.
504    ///
505    /// ## Availability
506    /// * iOS 13.0+
507    ///
508    /// ## Framework
509    /// * Core NFC
510    #[serde(
511        rename = "com.apple.developer.nfc.readersession.iso7816.select-identifiers",
512        serialize_with = "crate::serialize_option",
513        skip_serializing_if = "Option::is_none"
514    )]
515    pub nfc_readersession_iso7816_select_identifiers: Option<Vec<String>>,
516}
517
518/// Authentication
519#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
520pub struct Authentication {
521    /// A Boolean value that indicates the system shouldn’t show security recommendation
522    /// prompts when users sign in using the app.
523    ///
524    /// Each system code must be a discrete value. The wild card value (0xFF) isn't
525    /// allowed.
526    ///
527    /// ## Availability
528    /// * iOS 14.0+
529    ///
530    /// ## Framework
531    /// * Authentication Services
532    #[serde(
533        rename = "ASAccountAuthenticationModificationOptOutOfSecurityPromptsOnSignIn",
534        serialize_with = "crate::serialize_option",
535        skip_serializing_if = "Option::is_none"
536    )]
537    pub account_authentication_modification_opt_out_of_security_prompts_on_sign_in: Option<bool>,
538    /// A collection of keys that a browser app uses to declare its ability to handle
539    /// authentication requests from other apps.
540    ///
541    /// Add a dictionary for this key to your app’s Information Property List if your app
542    /// is a web browser and it supports web authentication. In the dictionary, include
543    /// the keys IsSupported and EphemeralBrowserSessionIsSupported to indicate your
544    /// browser app’s capabilities. For more information, see Supporting Single
545    /// Sign-On in a Web Browser App.
546    ///
547    /// ## Availability
548    /// * macOS 10.15+
549    ///
550    /// ## Framework
551    /// * Authentication Services
552    #[serde(
553        rename = "ASWebAuthenticationSessionWebBrowserSupportCapabilities",
554        serialize_with = "crate::serialize_option",
555        skip_serializing_if = "Option::is_none"
556    )]
557    pub web_authentication_session_web_browser_support_capabilities:
558        Option<WebAuthenticationSession>,
559}
560
561/// Web Authentication Session
562#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
563pub struct WebAuthenticationSession {
564    /// A Boolean that indicates whether the app acts as a browser that supports
565    /// authentication sessions.
566    ///
567    /// Set the corresponding value to YES to indicate that your browser app can handle
568    /// authentication requests that other apps generate with ASWebAuthenticationSession.
569    /// For details, see Supporting Single Sign-On in a Web Browser App.
570    ///
571    /// ## Availability
572    /// * macOS 10.15+
573    ///
574    /// ## Framework
575    /// * Authentication Services
576    #[serde(
577        rename = "IsSupported",
578        serialize_with = "crate::serialize_option",
579        skip_serializing_if = "Option::is_none"
580    )]
581    pub is_supported: Option<bool>,
582    /// A Boolean that indicates whether the app supports ephemeral browsing when
583    /// conducting authentication sessions.
584    ///
585    /// Set the corresponding value to YES to indicate that your browser app, when
586    /// handling authentication requests, offers ephemeral browsing.
587    ///
588    /// If you don’t provide the key, or if you set its value to NO and an app tries to
589    /// conduct an ephemeral authentication session, the system warns the user.
590    /// If do you declare support by setting the value to YES, be sure to respect the
591    /// shouldUseEphemeralSession property on any incoming authentication requests, as
592    /// described in Supporting Single Sign-On in a Web Browser App.
593    ///
594    /// ### Note
595    /// It’s strongly recommended that your web browser support ephemeral sessions.
596    /// Apps can specifically request this kind of session, and it’s important to honor
597    /// the request.
598    ///
599    /// ## Availability
600    /// * macOS 10.15+
601    ///
602    /// ## Framework
603    /// * Authentication Services
604    #[serde(
605        rename = "EphemeralBrowserSessionIsSupported",
606        serialize_with = "crate::serialize_option",
607        skip_serializing_if = "Option::is_none"
608    )]
609    pub ephemeral_browser_session_is_supported: Option<bool>,
610}
611
612/// External Accessories
613#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
614pub struct ExternalAccessories {
615    /// The protocols that the app uses to communicate with external accessory hardware.
616    ///
617    /// Add this key to your app’s Info.plist file, and set the value to the names of the
618    /// hardware protocols your app supports. You format protocol names as reverse-DNS
619    /// strings. For example, the string "com.apple.myProtocol" might represent a
620    /// custom protocol that Apple defines. Manufacturers can define custom protocols
621    /// for their accessories or work with other manufacturers and organizations to define
622    /// standard protocols for different accessory types.
623    ///
624    /// ## Availability
625    /// * iOS 3.0+
626    ///
627    /// ## Framework
628    /// * UIKit
629    #[serde(
630        rename = "UISupportedExternalAccessoryProtocols",
631        serialize_with = "crate::serialize_option",
632        skip_serializing_if = "Option::is_none"
633    )]
634    pub supported_external_accessory_protocols: Option<Vec<String>>,
635}
636
637/// Service Management
638#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
639pub struct ServiceManagement {
640    /// The Service Management clients authorized to add and remove tools.
641    ///
642    /// ## Availability
643    /// * iOS 12.1+
644    /// * macOS 10.6+
645    /// * tvOS 12.1+
646    /// * watchOS 5.1+
647    ///
648    /// ## Framework
649    /// * Service Management
650    #[serde(
651        rename = "SMAuthorizedClients",
652        serialize_with = "crate::serialize_option",
653        skip_serializing_if = "Option::is_none"
654    )]
655    pub authorized_clients: Option<Vec<String>>,
656    /// The Service Management tools owned by the app.
657    ///
658    /// ## Availability
659    /// * iOS 12.1+
660    /// * macOS 10.6+
661    /// * tvOS 12.1+
662    /// * watchOS 5.1+
663    ///
664    /// ## Framework
665    /// * Service Management
666    #[serde(
667        rename = "SMPrivilegedExecutables",
668        serialize_with = "crate::serialize_option",
669        skip_serializing_if = "Option::is_none"
670    )]
671    pub privileged_executables: Option<DefaultDictionary>,
672}
673
674/// Interprocess Communication
675#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
676pub struct InterprocessCommunication {
677    /// ## Availability
678    /// * iOS 6.0+
679    /// * macOS 10.8+
680    /// * tvOS 9.0+
681    /// * watchOS 2.0+
682    ///
683    /// ## Framework
684    /// * Foundation
685    #[serde(
686        rename = "XPCService",
687        serialize_with = "crate::serialize_option",
688        skip_serializing_if = "Option::is_none"
689    )]
690    pub service: Option<Service>,
691}
692
693/// Service
694#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
695pub struct Service {
696    #[serde(
697        rename = "EnvironmentVariables",
698        serialize_with = "crate::serialize_option",
699        skip_serializing_if = "Option::is_none"
700    )]
701    pub environment_variables: Option<DefaultDictionary>,
702    #[serde(
703        rename = "JoinExistingSession",
704        serialize_with = "crate::serialize_option",
705        skip_serializing_if = "Option::is_none"
706    )]
707    pub join_existing_session: Option<bool>,
708    #[serde(
709        rename = "RunLoopType",
710        serialize_with = "crate::serialize_enum_option",
711        skip_serializing_if = "Option::is_none"
712    )]
713    pub run_loop_type: Option<RunLoopType>,
714    #[serde(
715        rename = "ServiceType",
716        serialize_with = "crate::serialize_enum_option",
717        skip_serializing_if = "Option::is_none"
718    )]
719    pub service_type: Option<ServiceType>,
720}
721
722/// Run Loop Type
723#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
724pub enum RunLoopType {
725    #[serde(rename = "dispatch_main")]
726    DispatchMain,
727    #[serde(rename = "NSRunLoop")]
728    RunLoop,
729}
730
731/// Service Type
732#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
733pub enum ServiceType {
734    #[serde(rename = "Application")]
735    Application,
736}
737
738/// Store
739#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
740pub struct Store {
741    /// An array of dictionaries containing a list of ad network identifiers.
742    ///
743    /// Apps that display ads and initiate install validation information shared with ad
744    /// networks, must include the ad network identifiers in this key.
745    ///
746    /// Each dictionary contains one SKAdNetworkIdentifier.
747    /// Provide one dictionary for each ad network with which you work.
748    ///
749    /// ### Important
750    /// Ad network identifiers are case-sensitive, and are in lowercase.
751    ///
752    /// ## Availability
753    /// * iOS 11.3+
754    ///
755    /// ## Framework
756    /// * StoreKit
757    #[serde(
758        rename = "SKAdNetworkItems",
759        serialize_with = "crate::serialize_option",
760        skip_serializing_if = "Option::is_none"
761    )]
762    pub ad_network_items: Option<Vec<AdNetworkItems>>,
763}
764
765/// Ad Network Items
766#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
767pub struct AdNetworkItems {
768    /// A string that contains an ad network identifier.
769    ///
770    /// Contact the ad network to learn their ad network identifier.
771    ///
772    /// Include this key, and the value of the ad network identifier as a string, as a
773    /// dictionary in the SKAdNetworkItems key.
774    ///
775    /// ## Availability
776    /// * iOS 11.3+
777    ///
778    /// ## Framework
779    /// * StoreKit
780    #[serde(
781        rename = "SKAdNetworkIdentifier",
782        serialize_with = "crate::serialize_option",
783        skip_serializing_if = "Option::is_none"
784    )]
785    pub ad_network_identifier: Option<String>,
786}