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}