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