apple_bundle/info_plist/
user_interface.rs

1//! # User Interface.
2//!
3//! Configure an app's scenes, storyboards, icons, fonts, and other user interface
4//! elements.
5//!
6//! You define the user interface that your app presents during normal operation with a
7//! combination of code and storyboards. However, the system needs to know a few things
8//! about your app’s user interface before execution begins. For example,
9//! on some platforms, you have to specify what device orientations your app supports and
10//! what the system should display while your app launches. You add keys to your app’s
11//! Information Property List file to control certain aspects of its user interface.
12//!
13//! ## Framework
14//! * Bundle Resources
15
16use serde::{Deserialize, Serialize};
17use std::{collections::BTreeMap, str::FromStr};
18
19/// Main User Interface
20#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
21pub struct MainUserInterface {
22    /// The information about the app's scene-based life-cycle support.
23    ///
24    /// The presence of this key indicates that the app supports scenes and does not
25    /// use an app delegate object to manage transitions to and from the foreground or
26    /// background.
27    ///
28    /// ## Availability
29    /// * iOS 13.0+
30    ///
31    /// ## Framework
32    /// * UIKit
33    #[serde(
34        rename = "UIApplicationSceneManifest",
35        serialize_with = "crate::serialize_option",
36        skip_serializing_if = "Option::is_none"
37    )]
38    pub application_scene_manifest: Option<ApplicationSceneManifest>,
39    /// The name of an app's storyboard resource file.
40    ///
41    /// ## Availability
42    /// * macOS 10.10+
43    ///
44    /// ## Framework
45    /// * Foundation
46    #[serde(
47        rename = "NSMainStoryboardFile",
48        serialize_with = "crate::serialize_option",
49        skip_serializing_if = "Option::is_none"
50    )]
51    pub main_storyboard_resource_file_base_name: Option<String>,
52    /// The name of the app’s main storyboard file.
53    ///
54    /// ## Availability
55    /// * iOS 5.0+
56    /// * tvOS 9.0+
57    ///
58    /// ## Framework
59    /// * UIKit
60    #[serde(
61        rename = "UIMainStoryboardFile",
62        serialize_with = "crate::serialize_option",
63        skip_serializing_if = "Option::is_none"
64    )]
65    pub main_storyboard_file_base_name: Option<String>,
66    /// The name of an app’s main user interface file.
67    ///
68    /// ## Availability
69    /// * iOS 2.0+
70    /// * macOS 10.0+
71    /// * tvOS 9.0+
72    /// * watchOS 2.0+
73    ///
74    /// ## Framework
75    /// * Foundation
76    #[serde(
77        rename = "NSMainNibFile",
78        serialize_with = "crate::serialize_option",
79        skip_serializing_if = "Option::is_none"
80    )]
81    pub main_nib_file_base_name: Option<String>,
82    /// A Boolean value indicating whether the app is an agent app that runs in the
83    /// background and doesn't appear in the Dock.
84    ///
85    /// ## Availability
86    /// * macOS 10.0+
87    ///
88    /// ## Framework
89    /// * Core Services
90    #[serde(
91        rename = "LSUIElement",
92        serialize_with = "crate::serialize_option",
93        skip_serializing_if = "Option::is_none"
94    )]
95    pub application_is_agent: Option<bool>,
96}
97
98/// Launch Interface
99#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
100pub struct LaunchInterface {
101    /// The user interface to show while an app launches.
102    ///
103    /// You use this key to define the launch screen that the system displays while your
104    /// app launches. If you need to provide different launch screens in response to
105    /// being launched by different URL schemes, use UILaunchScreens instead.
106    ///
107    /// ## Availability
108    /// * iOS 14.0+
109    ///
110    /// ## Framework
111    /// * SwiftUI
112    #[serde(
113        rename = "UILaunchScreen",
114        serialize_with = "crate::serialize_option",
115        skip_serializing_if = "Option::is_none"
116    )]
117    pub launch_screen: Option<LaunchScreen>,
118    /// The user interfaces to show while an app launches in response to different URL
119    /// schemes.
120    ///
121    /// You use this key if your app supports launching in response to one or more URL
122    /// schemes, and if you want to provide different launch screens for different
123    /// launch triggers. If you need only one launch screen, use UILaunchScreen
124    /// instead.
125    ///
126    /// To define launch screens, create an array of dictionaries, each similar to the one
127    /// you might provide for UILaunchScreen, but with an added
128    /// UILaunchScreenIdentifier key that uniquely identifies the screen. Store the
129    /// array as the value for the UILaunchScreenDefinitions key.
130    ///
131    /// To map from URL schemes to a launch screens, create a dictionary of schemes and
132    /// identifiers, and store it as the value for the UIURLToLaunchScreenAssociations
133    /// key. Additionally, indicate a default launch screen by setting a value for the
134    /// UIDefaultLaunchScreen key.
135    ///
136    /// ## Availability
137    /// * iOS 14.0+
138    ///
139    /// ## Framework
140    /// * SwiftUI
141    #[serde(
142        rename = "UILaunchScreens",
143        serialize_with = "crate::serialize_option",
144        skip_serializing_if = "Option::is_none"
145    )]
146    pub launch_screens: Option<LaunchScreens>,
147    /// The filename of the storyboard from which to generate the app’s launch image.
148    ///
149    /// Specify the name of the storyboard file without the filename extension. For
150    /// example, if the filename of your storyboard is LaunchScreen.storyboard,
151    /// specify "LaunchScreen" as the value for this key.
152    ///
153    /// If you prefer to configure your app’s launch screen without storyboards, use
154    /// UILaunchScreen instead.
155    ///
156    /// ## Availability
157    /// * iOS 14.0+
158    /// * tvOS 9.0+
159    /// * watchOS 2.0+
160    ///
161    /// ## Framework
162    /// * UIKit
163    #[serde(
164        rename = "UILaunchStoryboardName",
165        serialize_with = "crate::serialize_option",
166        skip_serializing_if = "Option::is_none"
167    )]
168    pub launch_storyboard_name: Option<String>,
169    /// The launch storyboards.
170    ///
171    /// ## Availability
172    /// * iOS 9.0+
173    ///
174    /// ## Framework
175    /// * UIKit
176    #[serde(
177        rename = "UILaunchStoryboards",
178        serialize_with = "crate::serialize_option",
179        skip_serializing_if = "Option::is_none"
180    )]
181    pub launch_storyboards: Option<LaunchStoryboards>,
182    /// The initial user-interface mode for the app.
183    ///
184    /// Possible Values: 0, 1, 2, 3, 4
185    ///
186    /// ## Availability
187    /// * macOS 10.0+
188    ///
189    /// ## Framework
190    /// * Core Services
191    #[serde(
192        rename = "LSUIPresentationMode",
193        serialize_with = "crate::serialize_option",
194        skip_serializing_if = "Option::is_none"
195    )]
196    pub presentation_mode: Option<u8>,
197}
198
199/// Icons
200#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
201pub struct Icons {
202    /// Information about all of the icons used by the app.
203    ///
204    /// ## Availability
205    /// * macOS 10.0+
206    /// * tvOS 9.0+
207    /// * watchOS 2.0+
208    ///
209    /// ## Framework
210    /// * Core Foundation
211    #[serde(
212        rename = "CFBundleIcons",
213        serialize_with = "crate::serialize_option",
214        skip_serializing_if = "Option::is_none"
215    )]
216    pub bundle_icons: Option<BundleIcons>,
217    /// The names of the bundle’s icon image files.
218    ///
219    /// ## Availability
220    /// * iOS 3.2+
221    /// * tvOS 9.0+
222    /// * watchOS 2.0+
223    ///
224    /// ## Framework
225    /// * Core Foundation
226    #[serde(
227        rename = "CFBundleIconFiles",
228        serialize_with = "crate::serialize_option",
229        skip_serializing_if = "Option::is_none"
230    )]
231    pub bundle_icon_files: Option<Vec<String>>,
232    /// The file containing the bundle's icon.
233    ///
234    /// ## Availability
235    /// * iOS 2.0+
236    /// * macOS 10.0+
237    /// * tvOS 9.0+
238    /// * watchOS 2.0+
239    ///
240    /// ## Framework
241    /// * Core Foundation
242    #[serde(
243        rename = "CFBundleIconFile",
244        serialize_with = "crate::serialize_option",
245        skip_serializing_if = "Option::is_none"
246    )]
247    pub bundle_icon_file: Option<String>,
248    /// The name of the asset that represents the app icon.
249    ///
250    /// ## Availability
251    /// * macOS 10.13+
252    ///
253    /// ## Framework
254    /// * Core Foundation
255    #[serde(
256        rename = "CFBundleIconName",
257        serialize_with = "crate::serialize_option",
258        skip_serializing_if = "Option::is_none"
259    )]
260    pub bundle_icon_name: Option<String>,
261    /// A Boolean value indicating whether the app’s icon already contains a shine effect.
262    ///
263    /// ## Availability
264    /// * iOS 2.0+
265    /// * tvOS 9.0+
266    /// * watchOS 2.0+
267    ///
268    /// ## Framework
269    /// * UIKit
270    #[serde(
271        rename = "UIPrerenderedIcon",
272        serialize_with = "crate::serialize_option",
273        skip_serializing_if = "Option::is_none"
274    )]
275    pub prerendered_icon: Option<bool>,
276}
277
278/// Orientation
279#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
280pub struct Orientation {
281    /// The initial orientation of the app’s user interface.
282    ///
283    /// ## Availability
284    /// * iOS 2.0+
285    ///
286    /// ## Framework
287    /// * UIKit
288    #[serde(
289        rename = "UIInterfaceOrientation",
290        skip_serializing_if = "Option::is_none",
291        serialize_with = "crate::serialize_enum_option"
292    )]
293    pub interface_orientation: Option<InterfaceOrientation>,
294    /// The initial orientation of the app’s user interface.
295    ///
296    /// ## Availability
297    /// * iOS 3.2+
298    ///
299    /// ## Framework
300    /// * UIKit
301    #[serde(
302        rename = "UISupportedInterfaceOrientations",
303        skip_serializing_if = "Option::is_none",
304        serialize_with = "crate::serialize_vec_enum_option"
305    )]
306    pub supported_interface_orientations: Option<Vec<InterfaceOrientation>>,
307}
308
309/// Styling
310#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
311pub struct Styling {
312    /// The user interface style for the app.
313    ///
314    /// ## Availability
315    /// * iOS 13.0+
316    /// * tvOS 10.0+
317    ///
318    /// ## Framework
319    /// * UIKit
320    #[serde(
321        rename = "UIUserInterfaceStyle",
322        skip_serializing_if = "Option::is_none",
323        serialize_with = "crate::serialize_enum_option"
324    )]
325    pub user_interface_style: Option<UserInterfaceStyle>,
326    /// A Boolean value indicating whether Core Animation layers use antialiasing when
327    /// drawing a layer that's not aligned to pixel boundaries.
328    ///
329    /// ## Availability
330    /// * iOS 3.0+
331    /// * tvOS 9.0+
332    /// * watchOS 2.0+
333    ///
334    /// ## Framework
335    /// * UIKit
336    #[serde(
337        rename = "UIViewEdgeAntialiasing",
338        serialize_with = "crate::serialize_option",
339        skip_serializing_if = "Option::is_none"
340    )]
341    pub view_edge_antialiasing: Option<bool>,
342    /// The app’s white point adaptivity style, enabled on devices with True Tone
343    /// displays.
344    ///
345    /// ## Availability
346    /// * iOS 9.3+
347    ///
348    /// ## Framework
349    /// * UIKit
350    #[serde(
351        rename = "UIWhitePointAdaptivityStyle",
352        skip_serializing_if = "Option::is_none",
353        serialize_with = "crate::serialize_enum_option"
354    )]
355    pub white_point_adaptivity_style: Option<WhitePointAdaptivityStyle>,
356    /// A Boolean value indicating whether Core Animation sublayers inherit the opacity of
357    /// their superlayer.
358    ///
359    /// ## Availability
360    /// * iOS 3.0+
361    /// * tvOS 9.0+
362    /// * watchOS 2.0+
363    ///
364    /// ## Framework
365    /// * UIKit
366    #[serde(
367        rename = "UIViewGroupOpacity",
368        serialize_with = "crate::serialize_option",
369        skip_serializing_if = "Option::is_none"
370    )]
371    pub view_group_opacity: Option<bool>,
372    /// A Boolean value indicating whether the app requires fullscreen or not.
373    ///
374    /// ## Availability
375    /// * iOS 9.0+
376    ///
377    /// ## Framework
378    /// * UIKit
379    #[serde(
380        rename = "UIRequiresFullScreen",
381        serialize_with = "crate::serialize_option",
382        skip_serializing_if = "Option::is_none"
383    )]
384    pub requires_full_screen: Option<bool>,
385    /// The name of a color in an asset catalog to use for a target’s global accent color.
386    ///
387    /// This Info.plist value controls the global tint color (iOS and watchOS) or accent
388    /// color (macOS) for the target. When set in a widget extension, the widget
389    /// configuration user interface uses this color as the tint color while editing a
390    /// widget.
391    ///
392    /// While you can set this directly in your Info.plist, the recommended approach is to
393    /// use the Global Accent Color Name build setting (in the Asset Catalog Compiler
394    /// - Options section) of the target. Set the value of the build setting to the
395    /// name of the Color Set in the asset catalog. Xcode automatically sets
396    /// NSAccentColorName to the appropriate value in the Info.plist file when
397    /// building your project.
398    ///
399    /// ## Availability
400    /// * iOS 14.0+
401    /// * macOS 11.0+
402    /// * tvOS 14.0+
403    /// * watchOS 7.0+
404    ///
405    /// ## Framework
406    /// * Foundation
407    #[serde(
408        rename = "NSAccentColorName",
409        serialize_with = "crate::serialize_option",
410        skip_serializing_if = "Option::is_none"
411    )]
412    pub accent_color_name: Option<String>,
413    /// The name of a color in an asset catalog to use for a widget’s configuration
414    /// interface.
415    ///
416    /// This Info.plist value controls the background color shown in the widget
417    /// configuration interface while editing a widget.
418    ///
419    /// While you can set this directly in your Info.plist, the recommended approach is to
420    /// use the Widget Background Color Name build setting (in the Asset Catalog
421    /// Compiler - Options section) of the widget extension target. Set the value
422    /// of the build setting to the name of the Color Set in the asset catalog. Xcode
423    /// automatically sets NSWidgetBackgroundColorName to the appropriate value in the
424    /// Info.plist file when building your project.
425    ///
426    /// ## Availability
427    /// * iOS 14.0+
428    /// * macOS 11.0+
429    ///
430    /// ## Framework
431    /// * WidgetKit
432    #[serde(
433        rename = "NSWidgetBackgroundColorName",
434        serialize_with = "crate::serialize_option",
435        skip_serializing_if = "Option::is_none"
436    )]
437    pub widget_background_color_name: Option<String>,
438}
439
440/// Fonts
441#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
442pub struct Fonts {
443    /// The location of a font file or directory of fonts in the bundle’s Resources
444    /// folder.
445    ///
446    /// ## Availability
447    /// * macOS 10.0+
448    ///
449    /// ## Framework
450    /// * AppKit
451    #[serde(
452        rename = "ATSApplicationFontsPath",
453        serialize_with = "crate::serialize_option",
454        skip_serializing_if = "Option::is_none"
455    )]
456    pub application_fonts_path: Option<String>,
457    /// App-specific font files located in the bundle and that the system loads at
458    /// runtime.
459    ///
460    /// ## Availability
461    /// * iOS 3.2+
462    /// * tvOS 9.0+
463    /// * watchOS 2.0+
464    ///
465    /// ## Framework
466    /// * UIKit
467    #[serde(
468        rename = "UIAppFonts",
469        serialize_with = "crate::serialize_option",
470        skip_serializing_if = "Option::is_none"
471    )]
472    pub app_fonts: Option<Vec<String>>,
473}
474
475/// Status Bar
476#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Default)]
477pub struct StatusBar {
478    /// A Boolean value indicating whether the status bar is initially hidden when the app
479    /// launches.
480    ///
481    /// ## Availability
482    /// * iOS 2.0+
483    ///
484    /// ## Framework
485    /// * UIKit
486    #[serde(
487        rename = "UIStatusBarHidden",
488        serialize_with = "crate::serialize_option",
489        skip_serializing_if = "Option::is_none"
490    )]
491    pub status_bar_hidden: Option<bool>,
492    /// The style of the status bar as the app launches.
493    ///
494    /// ## Availability
495    /// * iOS 2.0+
496    ///
497    /// ## Framework
498    /// * UIKit
499    #[serde(
500        rename = "UIStatusBarStyle",
501        skip_serializing_if = "Option::is_none",
502        serialize_with = "crate::serialize_enum_option"
503    )]
504    pub status_bar_style: Option<StatusBarStyle>,
505    /// The status bar tint.
506    ///
507    /// ## Availability
508    /// * iOS 2.0+
509    /// * tvOS 9.0+
510    /// * watchOS 2.0+
511    ///
512    /// ## Framework
513    /// * UIKit
514    #[serde(
515        rename = "UIStatusBarTintParameters",
516        serialize_with = "crate::serialize_option",
517        skip_serializing_if = "Option::is_none"
518    )]
519    pub status_bar_tint_parameters: Option<StatusBarTintParameters>,
520    /// A Boolean value indicating whether the status bar appearance is based on the style
521    /// preferred for the current view controller.
522    ///
523    /// ## Availability
524    /// * iOS 2.0+
525    ///
526    /// ## Framework
527    /// * UIKit
528    #[serde(
529        rename = "UIViewControllerBasedStatusBarAppearance",
530        serialize_with = "crate::serialize_option",
531        skip_serializing_if = "Option::is_none"
532    )]
533    pub view_controller_based_status_bar_appearance: Option<bool>,
534}
535
536/// Preferences
537#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
538pub struct Preferences {
539    /// The name of an image file used to represent a preference pane in the System
540    /// Preferences app.
541    ///
542    /// ## Availability
543    /// * macOS 10.1+
544    ///
545    /// ## Framework
546    /// * Preference Panes
547    #[serde(
548        rename = "NSPrefPaneIconFile",
549        serialize_with = "crate::serialize_option",
550        skip_serializing_if = "Option::is_none"
551    )]
552    pub pref_pane_icon_file: Option<String>,
553    /// The name of a preference pane displayed beneath the preference pane icon in the
554    /// System Preferences app.
555    ///
556    /// ## Availability
557    /// * macOS 10.1+
558    ///
559    /// ## Framework
560    /// * Preference Panes
561    #[serde(
562        rename = "NSPrefPaneIconLabel",
563        serialize_with = "crate::serialize_option",
564        skip_serializing_if = "Option::is_none"
565    )]
566    pub pref_pane_icon_label: Option<String>,
567}
568
569/// Graphics
570#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
571pub struct Graphics {
572    /// A Boolean value indicating whether the app supports HDR mode on Apple TV 4K.
573    ///
574    /// ## Availability
575    /// * tvOS 11.2+
576    ///
577    /// ## Framework
578    /// * UIKit
579    #[serde(
580        rename = "UIAppSupportsHDR",
581        serialize_with = "crate::serialize_option",
582        skip_serializing_if = "Option::is_none"
583    )]
584    pub app_supports_hdr: Option<bool>,
585    /// A Boolean value indicating whether the Cocoa app supports high-resolution
586    /// displays.
587    ///
588    /// ## Availability
589    /// * iOS 2.0+
590    /// * macOS 10.0+
591    /// * tvOS 9.0+
592    /// * watchOS 2.0+
593    ///
594    /// ## Framework
595    /// * Foundation
596    #[serde(
597        rename = "NSHighResolutionCapable",
598        serialize_with = "crate::serialize_option",
599        skip_serializing_if = "Option::is_none"
600    )]
601    pub high_resolution_capable: Option<bool>,
602    /// A Boolean value indicating whether an OpenGL app may utilize the integrated GPU.
603    ///
604    /// ## Availability
605    /// * macOS 10.7+
606    ///
607    /// ## Framework
608    /// * Foundation
609    #[serde(
610        rename = "NSSupportsAutomaticGraphicsSwitching",
611        serialize_with = "crate::serialize_option",
612        skip_serializing_if = "Option::is_none"
613    )]
614    pub supports_automatic_graphics_switching: Option<bool>,
615    /// The preferred system action when an external GPU is connected from the system.
616    ///
617    /// ## Availability
618    /// * macOS 10.14+
619    ///
620    /// ## Framework
621    /// * Metal
622    #[serde(
623        rename = "GPUEjectPolicy",
624        skip_serializing_if = "Option::is_none",
625        serialize_with = "crate::serialize_enum_option"
626    )]
627    pub gpu_eject_policy: Option<GpuEjectPolicy>,
628    /// The app's preference for whether it wants to use external graphics processors.
629    ///
630    /// ## Availability
631    /// * macOS 10.14+
632    ///
633    /// ## Framework
634    /// * Metal
635    #[serde(
636        rename = "GPUSelectionPolicy",
637        skip_serializing_if = "Option::is_none",
638        serialize_with = "crate::serialize_enum_option"
639    )]
640    pub gpu_selection_policy: Option<GpuSelectionPolicy>,
641}
642
643/// Quick Look
644#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Default)]
645pub struct QuickLook {
646    /// A Boolean value indicating whether a Quick Look app's generator can be run in
647    /// threads other than the main thread.
648    ///
649    /// ## Availability
650    /// * iOS 4.0+
651    /// * macOS 10.5+
652    ///
653    /// ## Framework
654    /// * QuickLook
655    #[serde(
656        rename = "QLNeedsToBeRunInMainThread",
657        serialize_with = "crate::serialize_option",
658        skip_serializing_if = "Option::is_none"
659    )]
660    pub needs_to_be_run_in_main_thread: Option<bool>,
661    /// A hint at the height, in points, of a Quick Look app's previews.
662    ///
663    /// ## Availability
664    /// * iOS 4.0+
665    /// * macOS 10.5+
666    ///
667    /// ## Framework
668    /// * QuickLook
669    #[serde(
670        rename = "QLPreviewHeight",
671        serialize_with = "crate::serialize_option",
672        skip_serializing_if = "Option::is_none"
673    )]
674    pub preview_height: Option<f32>,
675    /// A hint at the width, in points, of a Quick Look app's previews.
676    ///
677    /// ## Availability
678    /// * iOS 4.0+
679    /// * macOS 10.5+
680    ///
681    /// ## Framework
682    /// * QuickLook
683    #[serde(
684        rename = "QLPreviewWidth",
685        serialize_with = "crate::serialize_option",
686        skip_serializing_if = "Option::is_none"
687    )]
688    pub preview_width: Option<f32>,
689    /// A Boolean value indicating whether a Quick Look app's generator can handle
690    /// concurrent thumbnail and preview requests.
691    ///
692    /// ## Availability
693    /// * iOS 4.0+
694    /// * macOS 10.5+
695    ///
696    /// ## Framework
697    /// * QuickLook
698    #[serde(
699        rename = "QLSupportsConcurrentRequests",
700        serialize_with = "crate::serialize_option",
701        skip_serializing_if = "Option::is_none"
702    )]
703    pub supports_concurrent_requests: Option<bool>,
704    /// The minimum size, in points, along one dimension of thumbnails for a Quick Look
705    /// app's generator.
706    ///
707    /// ## Availability
708    /// * iOS 4.0+
709    /// * macOS 10.5+
710    ///
711    /// ## Framework
712    /// * QuickLook
713    #[serde(
714        rename = "QLThumbnailMinimumSize",
715        serialize_with = "crate::serialize_option",
716        skip_serializing_if = "Option::is_none"
717    )]
718    pub thumbnail_minimum_size: Option<f32>,
719}
720
721/// Deprecated Keys
722#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
723pub struct DeprecatedKeys {
724    /// A dictionary containing information about launch images.
725    ///
726    /// ## Availability
727    /// * iOS 7.0–13.0
728    /// * tvOS 9.0–13.0
729    ///
730    /// ## Framework
731    /// * UIKit
732    #[deprecated(
733        since = "iOS 7.0-13.0, tvOS 9.0-13.0",
734        note = "UILaunchImages has been deprecated; use Xcode launch storyboards instead."
735    )]
736    #[serde(
737        rename = "UILaunchImages",
738        serialize_with = "crate::serialize_option",
739        skip_serializing_if = "Option::is_none"
740    )]
741    pub launch_images: Option<Vec<LaunchImage>>,
742}
743
744/// Default Dictionary
745#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
746pub struct LaunchImage {
747    pub default: String,
748}
749
750/// GPU Eject Policy
751#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
752pub enum GpuEjectPolicy {
753    /// Set this value to allow macOS to quit and relaunch your app with another GPU.
754    /// Your app can implement the application(_:willEncodeRestorableState:) method to
755    /// save any state before it quits, and it can implement the
756    /// application(_:didDecodeRestorableState:) method to restore any saved state
757    /// after it relaunches.
758    #[serde(rename = "relaunch")]
759    Relaunch,
760    /// Set this value to manually respond to the safe disconnect request. Your app must
761    /// register and respond to the removalRequested notification posted by Metal.
762    /// macOS waits for your app to remove all references to the external GPU before
763    /// notifying the user that it's safe to disconnect the GPU.
764    #[serde(rename = "wait")]
765    Wait,
766    /// Set this value to allow macOS to force your app to quit.
767    #[serde(rename = "kill")]
768    Kill,
769    /// Tells the system to ignore the disconnect message. Don’t use this key in new macOS
770    /// apps.
771    #[serde(rename = "ignore")]
772    Ignore,
773}
774
775/// GPU Selection Policy
776#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
777pub enum GpuSelectionPolicy {
778    /// Metal tries to avoid creating contexts on external GPUs. For legacy OpenGL apps,
779    /// OpenGL also avoids creating contexts using external GPUs. Set this option only
780    /// if your app doesn't support external GPU event handling.
781    #[serde(rename = "avoidRemovable")]
782    AvoidRemovable,
783    /// If external GPUs are visible to the system, Metal prefers them over other GPUs.
784    /// Similarly, for legacy OpenGL apps, OpenGL also prefers to create contexts on
785    /// the external GPU.
786    #[serde(rename = "preferRemovable")]
787    PreferRemovable,
788}
789
790/// NavigationBar
791#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Default)]
792pub struct StatusBarTintParameters {
793    /// The initial navigation bar’s style and translucency.
794    ///
795    /// ## Availability
796    /// * iOS 2.0+
797    /// * tvOS 9.0+
798    /// * watchOS 2.0+
799    ///
800    /// ## Framework
801    /// * UIKit
802    #[serde(
803        rename = "UINavigationBar",
804        serialize_with = "crate::serialize_option",
805        skip_serializing_if = "Option::is_none"
806    )]
807    pub navigation_bar: Option<NavigationBar>,
808}
809
810/// Navigation Bar
811#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Default)]
812pub struct NavigationBar {
813    #[serde(rename = "BackgroundImage")]
814    pub background_image: String,
815    #[serde(rename = "Style")]
816    pub style: BarStyle,
817    #[serde(rename = "Translucent")]
818    pub translucent: bool,
819    /// The tint color to apply to the background of the navigation bar.
820    ///
821    /// ## Availability
822    /// * iOS 2.0+
823    /// * tvOS 9.0+
824    /// * watchOS 2.0+
825    ///
826    /// ## Framework
827    /// * UIKit
828    #[serde(
829        rename = "TintColor",
830        serialize_with = "crate::serialize_option",
831        skip_serializing_if = "Option::is_none"
832    )]
833    pub tint_color: Option<TintColor>,
834}
835
836/// Bar Style
837#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
838pub enum BarStyle {
839    #[serde(rename = "UIBarStyleDefault")]
840    Default,
841    #[serde(rename = "UIBarStyleBlack")]
842    Black,
843}
844
845impl Default for BarStyle {
846    fn default() -> Self {
847        Self::Default
848    }
849}
850
851/// Tint Color
852#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Default)]
853pub struct TintColor {
854    #[serde(rename = "Blue")]
855    pub blue: f32,
856    #[serde(rename = "Green")]
857    pub green: f32,
858    #[serde(rename = "Red")]
859    pub red: f32,
860}
861
862/// Status Bar Style
863#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
864pub enum StatusBarStyle {
865    #[serde(rename = "UIStatusBarStyleDefault")]
866    Default,
867    #[serde(rename = "UIStatusBarStyleBlackTranslucent")]
868    BlackTranslucent,
869    #[serde(rename = "UIStatusBarStyleBlackOpaque")]
870    BlackOpaque,
871}
872
873/// White Point Adaptivity Style
874#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
875pub enum WhitePointAdaptivityStyle {
876    #[serde(rename = "UIWhitePointAdaptivityStyleStandard")]
877    Standard,
878    #[serde(rename = "UIWhitePointAdaptivityStyleReading")]
879    Reading,
880    #[serde(rename = "UIWhitePointAdaptivityStylePhoto")]
881    Photo,
882    #[serde(rename = "UIWhitePointAdaptivityStyleVideo")]
883    Video,
884    #[serde(rename = "UIWhitePointAdaptivityStyleGame")]
885    Game,
886}
887
888/// User Interface Style
889#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
890pub enum UserInterfaceStyle {
891    /// Set this value to adopt the systemwide user interface style, and observe any
892    /// changes to that style. This is the default value, and provides the same
893    /// functionality as if the key weren’t explicitly set.
894    Automatic,
895    /// Set this value to force the light user interface style, even when the systemwide
896    /// style is set to dark. Your app will ignore any changes to the systemwide
897    /// style.
898    Light,
899    /// Set this value to force the dark user interface style, even when the systemwide
900    /// style is set to light. Your app will ignore any changes to the systemwide
901    /// style.
902    Dark,
903}
904
905/// Interface Orientation
906#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
907pub enum InterfaceOrientation {
908    /// The app supports the display in portrait mode, with the device upright and the
909    /// front camera at the top.
910    #[serde(rename = "UIInterfaceOrientationPortrait")]
911    Portrait,
912    /// The app supports the display in portrait mode but is upside down, with the device
913    /// upright and the front camera at the bottom. UIViewController ignores this
914    /// option on devices without a Home button.
915    #[serde(rename = "UIInterfaceOrientationPortraitUpsideDown")]
916    PortraitUpsideDown,
917    /// The app supports the display in landscape mode, with the device upright and the
918    /// front camera on the left.
919    #[serde(rename = "UIInterfaceOrientationLandscapeLeft")]
920    LandscapeLeft,
921    /// The app supports the display in landscape mode, with the device upright and the
922    /// front camera on the right.
923    #[serde(rename = "UIInterfaceOrientationLandscapeRight")]
924    LandscapeRight,
925}
926
927impl FromStr for InterfaceOrientation {
928    type Err = Box<dyn std::error::Error>;
929
930    fn from_str(s: &str) -> Result<InterfaceOrientation, Self::Err> {
931        match s {
932            "portrait" => Ok(InterfaceOrientation::Portrait),
933            "portrait-upside-down" => Ok(InterfaceOrientation::PortraitUpsideDown),
934            "landscape-left" => Ok(InterfaceOrientation::LandscapeLeft),
935            "landscape-right" => Ok(InterfaceOrientation::LandscapeRight),
936            _ => Err(s.into()),
937        }
938    }
939}
940
941/// Bundle Icons
942#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
943pub struct BundleIcons {
944    ///
945    /// ## Availability
946    /// * iOS 5.0+
947    /// * tvOS 9.0+
948    /// * watchOS 2.0+
949    ///
950    /// ## Framework
951    /// * Core Foundation
952    #[serde(
953        rename = "CFBundleAlternateIcons",
954        serialize_with = "crate::serialize_option",
955        skip_serializing_if = "Option::is_none"
956    )]
957    pub bundle_alternate_icons: Option<BTreeMap<String, AppIconReferenceName>>,
958    /// The primary icon for the Home screen and Settings app, among others.
959    ///
960    /// ## Availability
961    /// * iOS 5.0+
962    /// * tvOS 9.0+
963    /// * watchOS 2.0+
964    ///
965    /// ## Framework
966    /// * Core Foundation
967    #[serde(rename = "CFBundlePrimaryIcon")]
968    pub bundle_primary_icon: BundlePrimaryIcon,
969}
970
971/// App Icon Reference Name
972#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
973pub struct AppIconReferenceName {
974    #[serde(
975        rename = "CFBundleIconFiles",
976        serialize_with = "crate::serialize_option",
977        skip_serializing_if = "Option::is_none"
978    )]
979    pub bundle_icon_files: Option<Vec<String>>,
980    #[serde(
981        rename = "UIPrerenderedIcon",
982        serialize_with = "crate::serialize_option",
983        skip_serializing_if = "Option::is_none"
984    )]
985    pub prerendered_icon: Option<bool>,
986}
987
988/// Bundle Primary Icon
989#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
990pub struct BundlePrimaryIcon {
991    /// The names of a bundle’s icon files.
992    ///
993    /// ## Availability
994    /// * iOS 3.2+
995    /// * tvOS 9.0+
996    /// * watchOS 2.0+
997    ///
998    /// ## Framework
999    /// * Core Foundation
1000    #[serde(rename = "CFBundleIconFiles")]
1001    pub bundle_icon_files: Vec<String>,
1002    /// The name of a symbol from SF Symbols.
1003    ///
1004    /// Action extensions use template images for their icons. To use a symbol from SF
1005    /// Symbols as the icon, set the value of CFBundleSymbolName to the symbol’s name.
1006    ///
1007    /// ## Availability
1008    /// * iOS 13.0+
1009    ///
1010    /// ## Framework
1011    /// * Core Foundation
1012    #[serde(
1013        rename = "CFBundleSymbolName",
1014        serialize_with = "crate::serialize_option",
1015        skip_serializing_if = "Option::is_none"
1016    )]
1017    pub bundle_symbol_name: Option<String>,
1018    /// A Boolean value indicating whether the icon files already incorporate a shine
1019    /// effect.
1020    ///
1021    /// ## Availability
1022    /// * iOS 2.0+
1023    /// * tvOS 9.0+
1024    /// * watchOS 2.0+
1025    ///
1026    /// ## Framework
1027    /// * UIKit
1028    #[serde(rename = "UIPrerenderedIcon")]
1029    pub prerendered_icon: bool,
1030}
1031
1032/// Launch Screen
1033#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1034pub struct LaunchScreen {
1035    // Main Interface.
1036    /// The name of a color to use as the background color on the launch screen.
1037    ///
1038    /// Provide a value for this key that’s the name of a color in your asset catalog.
1039    /// You use the same string for the value that you might use when calling the
1040    /// init(named:) initializer of UIColor.
1041    ///
1042    /// If you don’t set a color, the system uses a default of systemBackground, which
1043    /// varies according to whether the user has selected the light appearance or Dark
1044    /// Mode for the device.
1045    ///
1046    /// ## Availability
1047    /// * iOS 14.0+
1048    ///
1049    /// ## Framework
1050    /// * SwiftUI
1051    #[serde(
1052        rename = "UIColorName",
1053        serialize_with = "crate::serialize_option",
1054        skip_serializing_if = "Option::is_none"
1055    )]
1056    pub color_name: Option<String>,
1057    /// The name of an image to display during app launch.
1058    ///
1059    /// Provide a value for this key that’s the name of an image in your asset catalog.
1060    /// You use the same string for the value that you might use when calling the
1061    /// init(named:) initializer of UIImage. Because the image comes from your asset
1062    /// catalog, you can use slicing to provide a small image that works on many different
1063    /// platforms.
1064    ///
1065    /// If you don’t specify an image, the display shows the background color, as given by
1066    /// the UIColorName key. The background color may also show through any
1067    /// transparency in your image.
1068    ///
1069    /// ## Availability
1070    /// * iOS 14.0+
1071    ///
1072    /// ## Framework
1073    /// * SwiftUI
1074    #[serde(
1075        rename = "UIImageName",
1076        serialize_with = "crate::serialize_option",
1077        skip_serializing_if = "Option::is_none"
1078    )]
1079    pub image_name: Option<String>,
1080    /// A Boolean that specifies whether the launch image should respect the safe area
1081    /// insets.
1082    ///
1083    /// ## Availability
1084    /// * iOS 14.0+
1085    ///
1086    /// ## Framework
1087    /// * SwiftUI
1088    #[serde(
1089        rename = "UIImageRespectsSafeAreaInsets",
1090        serialize_with = "crate::serialize_option",
1091        skip_serializing_if = "Option::is_none"
1092    )]
1093    pub image_respects_safe_area_insets: Option<bool>,
1094    // Border Elements.
1095    /// Navigation bar visibility and configuration during launch.
1096    ///
1097    /// When you provide a dictionary for this key, the system displays a navigation bar
1098    /// during launch. You can optionally set the dictionary’s UIImageName key to
1099    /// define a custom image for the navigation bar.
1100    ///
1101    /// Omit this key if you don’t want to display a navigation bar during launch.
1102    ///
1103    /// ## Availability
1104    /// * iOS 14.0+
1105    ///
1106    /// ## Framework
1107    /// * SwiftUI
1108    #[serde(
1109        rename = "UINavigationBar",
1110        serialize_with = "crate::serialize_option",
1111        skip_serializing_if = "Option::is_none"
1112    )]
1113    pub navigation_bar: Option<Bar>,
1114    /// Tab bar visibility and configuration during launch.
1115    ///
1116    /// When you provide a dictionary for this key, the system displays a tab bar during
1117    /// launch. You can optionally set the dictionary’s UIImageName key to define a
1118    /// custom image for the tab bar.
1119    ///
1120    /// Omit this key if you don’t want to display a tab bar during launch.
1121    ///
1122    /// ## Availability
1123    /// * iOS 14.0+
1124    ///
1125    /// ## Framework
1126    /// * SwiftUI
1127    #[serde(
1128        rename = "UITabBar",
1129        serialize_with = "crate::serialize_option",
1130        skip_serializing_if = "Option::is_none"
1131    )]
1132    pub tab_bar: Option<Bar>,
1133    /// When you provide a dictionary for this key, the system displays a toolbar during
1134    /// launch. You can optionally set the dictionary’s UIImageName key to define a
1135    /// custom image for the toolbar.
1136    ///
1137    /// Omit this key if you don’t want to display a toolbar during launch.
1138    ///
1139    /// ## Availability
1140    /// * iOS 14.0+
1141    ///
1142    /// ## Framework
1143    /// * SwiftUI
1144    #[serde(
1145        rename = "UIToolbar",
1146        serialize_with = "crate::serialize_option",
1147        skip_serializing_if = "Option::is_none"
1148    )]
1149    pub toolbar: Option<Bar>,
1150}
1151
1152/// Application Scene Manifest
1153#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1154pub struct Bar {
1155    /// A custom image that replaces the navigation/tab/tool bar during launch.
1156    ///
1157    /// Provide a value for this key that’s the name of an image in your asset catalog.
1158    /// You use the same string for the value that you might use when calling the
1159    /// init(named:) initializer of UIImage.
1160    ///
1161    /// ## Availability
1162    /// * iOS 14.0+
1163    ///
1164    /// ## Framework
1165    /// * SwiftUI
1166    #[serde(
1167        rename = "UIImageName",
1168        serialize_with = "crate::serialize_option",
1169        skip_serializing_if = "Option::is_none"
1170    )]
1171    pub image_name: Option<String>,
1172}
1173
1174/// Launch Screens
1175#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1176pub struct LaunchScreens {
1177    // Launch Screen Definitions.
1178    /// A collection of launch screen configuration dictionaries.
1179    ///
1180    /// Each dictionary in the array resembles the one you might define for the
1181    /// UILaunchScreen key, with the addition of a UILaunchScreenIdentifier key that
1182    /// provides a unique identifier for the dictionary. You use that identifier when
1183    /// associating to the dictionary with a URL scheme in the
1184    /// UIURLToLaunchScreenAssociations array, or to indicate it as the default launch
1185    /// screen with the UIDefaultLaunchScreen key.
1186    ///
1187    /// ## Availability
1188    /// * iOS 14.0+
1189    ///
1190    /// ## Framework
1191    /// * SwiftUI
1192    #[serde(
1193        rename = "UILaunchScreenDefinitions",
1194        serialize_with = "crate::serialize_option",
1195        skip_serializing_if = "Option::is_none"
1196    )]
1197    pub launch_screen_definitions: Option<LaunchScreenDefinitions>,
1198    // Associations.
1199    /// The mapping of URL schemes to launch screen configurations.
1200    ///
1201    /// Set the keys of this dictionary to the URL schemes that your app supports.
1202    /// Provide a value for each key that is the identifier, stored in the
1203    /// UILaunchScreenIdentifier key, of one of the launch screen definitions in your
1204    /// UILaunchScreenDefinitions array.
1205    ///
1206    /// Any Key - A URL scheme. Set one of the configuration identifiers as the value.
1207    ///
1208    /// ## Availability
1209    /// * iOS 14.0+
1210    ///
1211    /// ## Framework
1212    /// * SwiftUI
1213    #[serde(
1214        rename = "UIURLToLaunchScreenAssociations",
1215        serialize_with = "crate::serialize_option",
1216        skip_serializing_if = "Option::is_none"
1217    )]
1218    pub url_to_launch_screen_associations: Option<BTreeMap<String, String>>,
1219    /// The default launch screen configuration.
1220    ///
1221    /// Provide the identifier, stored in the UILaunchScreenIdentifier key, of one of the
1222    /// launch screen definitions in your UILaunchScreenDefinitions array. The system
1223    /// displays the named launch screen when launching your app in response to a URL
1224    /// scheme that you don’t enumerate in the UIURLToLaunchStoryboardAssociations
1225    /// dictionary, or when the user launches your app directly.
1226    ///
1227    /// ## Availability
1228    /// * iOS 14.0+
1229    ///
1230    /// ## Framework
1231    /// * SwiftUI
1232    #[serde(
1233        rename = "UIDefaultLaunchScreen",
1234        serialize_with = "crate::serialize_option",
1235        skip_serializing_if = "Option::is_none"
1236    )]
1237    pub default_launch_screen: Option<String>,
1238}
1239
1240/// Launch Screen Definitions
1241#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1242pub struct LaunchScreenDefinitions {
1243    /// A unique name for the launch screen configuration.
1244    ///
1245    /// You can choose any name you want for the identifier, as long as it’s unique among
1246    /// all your app’s configuration identifiers. Use this value to refer to the
1247    /// configuration when storing a URL to configuration mapping as the value for the
1248    /// UIURLToLaunchScreenAssociations key, or when specifying a default configuration
1249    /// with the UIDefaultLaunchScreen key.
1250    #[serde(
1251        rename = "UIColorName",
1252        serialize_with = "crate::serialize_option",
1253        skip_serializing_if = "Option::is_none"
1254    )]
1255    pub color_name: Option<String>,
1256    /// Launch Storyboards.
1257    ///
1258    /// ## Availability
1259    /// * iOS 14.0+
1260    ///
1261    /// ## Framework
1262    /// * SwiftUI
1263    #[serde(flatten)]
1264    pub launch_screen: LaunchScreen,
1265}
1266
1267/// Launch Storyboards
1268#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1269pub struct LaunchStoryboards {
1270    #[serde(
1271        rename = "UIDefaultLaunchStoryboard",
1272        serialize_with = "crate::serialize_option",
1273        skip_serializing_if = "Option::is_none"
1274    )]
1275    pub default_launch_storyboard: Option<String>,
1276    #[serde(
1277        rename = "UILaunchStoryboardDefinitions",
1278        serialize_with = "crate::serialize_option",
1279        skip_serializing_if = "Option::is_none"
1280    )]
1281    pub launch_storyboard_definitions: Option<Vec<LaunchStoryboardDefinition>>,
1282    #[serde(
1283        rename = "UIURLToLaunchStoryboardAssociations",
1284        serialize_with = "crate::serialize_option",
1285        skip_serializing_if = "Option::is_none"
1286    )]
1287    pub url_to_launch_storyboard_associations: Option<BTreeMap<String, String>>,
1288}
1289
1290/// Launch Storyboard Definition
1291#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1292pub struct LaunchStoryboardDefinition {
1293    #[serde(
1294        rename = "UILaunchStoryboardFile",
1295        serialize_with = "crate::serialize_option",
1296        skip_serializing_if = "Option::is_none"
1297    )]
1298    pub launch_storyboard_file: Option<String>,
1299    #[serde(
1300        rename = "UILaunchStoryboardIdentifier",
1301        serialize_with = "crate::serialize_option",
1302        skip_serializing_if = "Option::is_none"
1303    )]
1304    pub launch_storyboard_identifier: Option<String>,
1305}
1306
1307/// Application Scene Manifest
1308#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1309pub struct ApplicationSceneManifest {
1310    /// A Boolean value indicating whether the app supports two or more scenes
1311    /// simultaneously.
1312    ///
1313    /// If your app supports multiple scenes, set the value of this key to true.
1314    /// If you set the value to false, UIKit never creates more than one scene for your
1315    /// app.
1316    ///
1317    /// Setting this key to true has implications for your code. An app that supports
1318    /// multiple scenes must coordinate operations to prevent scenes from interfering
1319    /// with each other. For example, if two scenes access the same shared resource,
1320    /// you must synchronize access to that resource using a serial dispatch queue or
1321    /// some other mechanism. Failure to do so may lead to corrupted data or
1322    /// unexpected behavior from your app.
1323    ///
1324    /// ## Availability
1325    /// * iOS 13.0+
1326    ///
1327    /// ## Framework
1328    /// * UIKit
1329    #[serde(
1330        rename = "UIApplicationSupportsMultipleScenes",
1331        serialize_with = "crate::serialize_option",
1332        skip_serializing_if = "Option::is_none"
1333    )]
1334    pub enable_multiple_windows: Option<bool>,
1335    /// The default configuration details for UIKit to use when creating new scenes.
1336    ///
1337    /// ## Availability
1338    /// * iOS 13.0+
1339    ///
1340    /// ## Framework
1341    /// * UIKit
1342    #[serde(
1343        flatten,
1344        rename = "UISceneConfigurations",
1345        serialize_with = "crate::serialize_option",
1346        skip_serializing_if = "Option::is_none"
1347    )]
1348    pub scene_configurations: Option<SceneConfigurations>,
1349}
1350
1351/// Scene Configurations
1352#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1353pub struct SceneConfigurations {
1354    /// Scenes that you use to display content on the device's main screen and respond to
1355    /// user interactions.
1356    ///
1357    /// Use this key to specify the scene configurations for your app.
1358    /// Each scene corresponds to one you use for content you display on the device's main
1359    /// screen. Make your app's default scene the first entry in the array.
1360    ///
1361    /// ## Availability
1362    /// * iOS 13.0+
1363    ///
1364    /// ## Framework
1365    /// * UIKit
1366    #[serde(
1367        flatten,
1368        rename = "UIWindowSceneSessionRoleApplication",
1369        serialize_with = "crate::serialize_option",
1370        skip_serializing_if = "Option::is_none"
1371    )]
1372    pub application_session_role: Option<WindowSceneSessionRole>,
1373    /// Scenes that you use to display content on an externally connected display.
1374    ///
1375    /// Use this key to specify the scene configurations you use when displaying content
1376    /// on an external display. Make the default scene the first entry in the array.
1377    ///
1378    /// ## Availability
1379    /// * iOS 13.0+
1380    ///
1381    /// ## Framework
1382    /// * UIKit
1383    #[serde(
1384        flatten,
1385        rename = "UIWindowSceneSessionRoleExternalDisplay",
1386        serialize_with = "crate::serialize_option",
1387        skip_serializing_if = "Option::is_none"
1388    )]
1389    pub external_display_session_role: Option<WindowSceneSessionRole>,
1390}
1391
1392/// Window Scene Session Role
1393#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Default)]
1394pub struct WindowSceneSessionRole {
1395    /// The app-specific name you use to identify the scene.
1396    ///
1397    /// ## Availability
1398    /// * iOS 13.0+
1399    ///
1400    /// ## Framework
1401    /// * UIKit
1402    #[serde(
1403        rename = "UISceneConfigurationName",
1404        serialize_with = "crate::serialize_option",
1405        skip_serializing_if = "Option::is_none"
1406    )]
1407    pub configuration_name: Option<String>,
1408    /// The name of the scene class you want UIKit to instantiate.
1409    ///
1410    /// Specify UIWindowScene for scenes meant for your app or an external display. Do not
1411    /// specify UIScene.
1412    ///
1413    /// ## Availability
1414    /// * iOS 13.0+
1415    ///
1416    /// ## Framework
1417    /// * UIKit
1418    #[serde(
1419        rename = "UISceneClassName",
1420        serialize_with = "crate::serialize_option",
1421        skip_serializing_if = "Option::is_none"
1422    )]
1423    pub class_name: Option<String>,
1424    /// The name of the app-specific class that you want UIKit to instantiate and use as
1425    /// the scene delegate object.
1426    ///
1427    /// The class you specify for this key must adopt the UISceneDelegate protocol.
1428    /// If the class you specify for the UISceneClassName key is UIWindowScene,
1429    /// your class must adopt the UIWindowSceneDelegate protocol.
1430    ///
1431    /// ## Availability
1432    /// * iOS 13.0+
1433    ///
1434    /// ## Framework
1435    /// * UIKit
1436    #[serde(
1437        rename = "UISceneDelegateClassName",
1438        serialize_with = "crate::serialize_option",
1439        skip_serializing_if = "Option::is_none"
1440    )]
1441    pub delegate_class_name: Option<String>,
1442    /// The name of the storyboard file containing the scene's initial user interface.
1443    ///
1444    /// Specify the name of the storyboard file without the filename extension. For
1445    /// example, if the filename of your storyboard is Main.storyboard, specify Main
1446    /// as the value for this key.
1447    ///
1448    /// ## Availability
1449    /// * iOS 13.0+
1450    ///
1451    /// ## Framework
1452    /// * UIKit
1453    #[serde(
1454        rename = "UISceneStoryboardFile",
1455        serialize_with = "crate::serialize_option",
1456        skip_serializing_if = "Option::is_none"
1457    )]
1458    pub storyboard_name: Option<String>,
1459}