From 5afa0b571c7cb5e9df5b15d097c550d7c342ef96 Mon Sep 17 00:00:00 2001 From: Carson Katri Date: Thu, 26 Dec 2024 15:02:24 -0500 Subject: [PATCH] Update to v0.4.0 --- .../project.pbxproj | 77 +++++++++++-------- .../xcshareddata/swiftpm/Package.resolved | 64 ++++++--------- .../LiveViewNativeGo/Helpers/Constants.swift | 4 + .../Phase Views/ErrorView.swift | 3 +- .../LiveViewNativeGo/Screens/AppsScreen.swift | 19 ++++- .../Screens/SettingsScreen.swift | 1 + 6 files changed, 91 insertions(+), 77 deletions(-) diff --git a/swiftui/LiveViewNativeGo.xcodeproj/project.pbxproj b/swiftui/LiveViewNativeGo.xcodeproj/project.pbxproj index 56f2f8c..7785cc1 100644 --- a/swiftui/LiveViewNativeGo.xcodeproj/project.pbxproj +++ b/swiftui/LiveViewNativeGo.xcodeproj/project.pbxproj @@ -14,7 +14,6 @@ 000C92812BB30FC600E553D4 /* AppsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000C92802BB30FC600E553D4 /* AppsScreen.swift */; }; 000C92832BB3146800E553D4 /* SettingsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000C92822BB3146800E553D4 /* SettingsScreen.swift */; }; 000C92862BB3150F00E553D4 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000C92852BB3150F00E553D4 /* Settings.swift */; }; - 001B1CFE2CF7BC01006D53C9 /* LiveViewNativeRealityKit in Frameworks */ = {isa = PBXBuildFile; platformFilters = (xros, ); productRef = 001B1CFD2CF7BC01006D53C9 /* LiveViewNativeRealityKit */; }; 00232F112CC8286A0081DF3D /* Logs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00232F102CC828660081DF3D /* Logs.swift */; }; 00232F122CC8286A0081DF3D /* Logs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00232F102CC828660081DF3D /* Logs.swift */; }; 00242ED92C6E513000CC972C /* LiveViewNativeGoAppClipApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00242ED82C6E513000CC972C /* LiveViewNativeGoAppClipApp.swift */; }; @@ -41,7 +40,9 @@ 003255822CAF30020097904C /* LiveViewNativeCharts in Frameworks */ = {isa = PBXBuildFile; productRef = 003255812CAF30020097904C /* LiveViewNativeCharts */; }; 003255842CAF30040097904C /* LiveViewNativeMapKit in Frameworks */ = {isa = PBXBuildFile; platformFilters = (ios, macos, xros, ); productRef = 003255832CAF30040097904C /* LiveViewNativeMapKit */; }; 00336C782CEF89400038B915 /* LiveViewNative in Frameworks */ = {isa = PBXBuildFile; productRef = 00336C772CEF89400038B915 /* LiveViewNative */; }; - 00336C7E2CEFCE6B0038B915 /* LiveViewNativeRealityKit in Frameworks */ = {isa = PBXBuildFile; platformFilters = (xros, ); productRef = 00336C7D2CEFCE6B0038B915 /* LiveViewNativeRealityKit */; }; + 006F21DD2D1DDDF300B4D3DC /* LiveViewNativePhotoKit in Frameworks */ = {isa = PBXBuildFile; platformFilter = ios; productRef = 006F21DC2D1DDDF300B4D3DC /* LiveViewNativePhotoKit */; }; + 006F21DF2D1DDE0400B4D3DC /* LiveViewNative in Frameworks */ = {isa = PBXBuildFile; productRef = 006F21DE2D1DDE0400B4D3DC /* LiveViewNative */; }; + 006F21E12D1DDE0400B4D3DC /* LiveViewNativePhotoKit in Frameworks */ = {isa = PBXBuildFile; productRef = 006F21E02D1DDE0400B4D3DC /* LiveViewNativePhotoKit */; }; 00ABCC452BED72B80039E1CE /* ShakeGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00ABCC442BED72B80039E1CE /* ShakeGesture.swift */; }; 00ABCC482BF395170039E1CE /* DataScannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00ABCC472BF395170039E1CE /* DataScannerView.swift */; }; 00C48D4F2C656C47002B23FF /* ErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D4E2C656C47002B23FF /* ErrorView.swift */; }; @@ -122,13 +123,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 001B1CFE2CF7BC01006D53C9 /* LiveViewNativeRealityKit in Frameworks */, 003255842CAF30040097904C /* LiveViewNativeMapKit in Frameworks */, 00336C782CEF89400038B915 /* LiveViewNative in Frameworks */, - 00336C7E2CEFCE6B0038B915 /* LiveViewNativeRealityKit in Frameworks */, 00C48D602C6BBA60002B23FF /* LiveViewNativeAVKit in Frameworks */, 00C48D5D2C6BBA58002B23FF /* LiveViewNativeLiveForm in Frameworks */, 003255822CAF30020097904C /* LiveViewNativeCharts in Frameworks */, + 006F21DD2D1DDDF300B4D3DC /* LiveViewNativePhotoKit in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,8 +137,10 @@ buildActionMask = 2147483647; files = ( 003255802CAF2FFE0097904C /* LiveViewNativeMapKit in Frameworks */, + 006F21DF2D1DDE0400B4D3DC /* LiveViewNative in Frameworks */, 00242EF82C6E516500CC972C /* LiveViewNativeAVKit in Frameworks */, 00242F002C6E516500CC972C /* LiveViewNativeLiveForm in Frameworks */, + 006F21E12D1DDE0400B4D3DC /* LiveViewNativePhotoKit in Frameworks */, 0032557E2CAF2FFB0097904C /* LiveViewNativeCharts in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -293,8 +295,7 @@ 003255812CAF30020097904C /* LiveViewNativeCharts */, 003255832CAF30040097904C /* LiveViewNativeMapKit */, 00336C772CEF89400038B915 /* LiveViewNative */, - 00336C7D2CEFCE6B0038B915 /* LiveViewNativeRealityKit */, - 001B1CFD2CF7BC01006D53C9 /* LiveViewNativeRealityKit */, + 006F21DC2D1DDDF300B4D3DC /* LiveViewNativePhotoKit */, ); productName = LiveViewNativeGo; productReference = 000C926D2BB30EDD00E553D4 /* LVN Go.app */; @@ -318,6 +319,8 @@ 00242EFF2C6E516500CC972C /* LiveViewNativeLiveForm */, 0032557D2CAF2FFB0097904C /* LiveViewNativeCharts */, 0032557F2CAF2FFE0097904C /* LiveViewNativeMapKit */, + 006F21DE2D1DDE0400B4D3DC /* LiveViewNative */, + 006F21E02D1DDE0400B4D3DC /* LiveViewNativePhotoKit */, ); productName = LiveViewNativeGoAppClip; productReference = 00242ED62C6E513000CC972C /* LiveViewNativeGoAppClip.app */; @@ -356,7 +359,7 @@ 0032557B2CAF29CA0097904C /* XCRemoteSwiftPackageReference "liveview-native-swiftui-charts" */, 0032557C2CAF29E00097904C /* XCRemoteSwiftPackageReference "liveview-native-swiftui-mapkit" */, 00336C762CEF89330038B915 /* XCRemoteSwiftPackageReference "liveview-client-swiftui" */, - 001B1CFC2CF7BC01006D53C9 /* XCRemoteSwiftPackageReference "liveview-native-swiftui-realitykit" */, + 006F21DB2D1DDDF300B4D3DC /* XCRemoteSwiftPackageReference "liveview-native-swiftui-photokit" */, ); productRefGroup = 000C926E2BB30EDD00E553D4 /* Products */; projectDirPath = ""; @@ -576,7 +579,7 @@ CODE_SIGN_ENTITLEMENTS = LiveViewNativeGo/LiveViewNativeGo.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"LiveViewNativeGo/Preview Content\""; DEVELOPMENT_TEAM = 8YF596VCP4; ENABLE_PREVIEWS = YES; @@ -600,7 +603,7 @@ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 0.3.1; + MARKETING_VERSION = 0.4.0; PRODUCT_BUNDLE_IDENTIFIER = com.dockyard.LiveViewNativeGo; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -625,7 +628,7 @@ CODE_SIGN_ENTITLEMENTS = LiveViewNativeGo/LiveViewNativeGo.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"LiveViewNativeGo/Preview Content\""; DEVELOPMENT_TEAM = 8YF596VCP4; ENABLE_PREVIEWS = YES; @@ -649,7 +652,7 @@ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 0.3.1; + MARKETING_VERSION = 0.4.0; PRODUCT_BUNDLE_IDENTIFIER = com.dockyard.LiveViewNativeGo; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -688,7 +691,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.3.1; + MARKETING_VERSION = 0.4.0; PRODUCT_BUNDLE_IDENTIFIER = com.dockyard.LiveViewNativeGo.Clip; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -722,7 +725,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.3.1; + MARKETING_VERSION = 0.4.0; PRODUCT_BUNDLE_IDENTIFIER = com.dockyard.LiveViewNativeGo.Clip; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -766,20 +769,12 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 001B1CFC2CF7BC01006D53C9 /* XCRemoteSwiftPackageReference "liveview-native-swiftui-realitykit" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/liveview-native/liveview-native-swiftui-realitykit"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.3.1; - }; - }; 0032557B2CAF29CA0097904C /* XCRemoteSwiftPackageReference "liveview-native-swiftui-charts" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/liveview-native/liveview-native-swiftui-charts"; requirement = { kind = exactVersion; - version = 0.3.0; + version = "0.4.0-rc.0"; }; }; 0032557C2CAF29E00097904C /* XCRemoteSwiftPackageReference "liveview-native-swiftui-mapkit" */ = { @@ -787,15 +782,23 @@ repositoryURL = "https://github.com/liveview-native/liveview-native-swiftui-mapkit"; requirement = { kind = exactVersion; - version = 0.3.0; + version = "0.4.0-rc.0"; }; }; 00336C762CEF89330038B915 /* XCRemoteSwiftPackageReference "liveview-client-swiftui" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/liveview-native/liveview-client-swiftui/"; requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.3.1; + kind = exactVersion; + version = "0.4.0-rc.0"; + }; + }; + 006F21DB2D1DDDF300B4D3DC /* XCRemoteSwiftPackageReference "liveview-native-swiftui-photokit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/liveview-native/liveview-native-swiftui-photokit"; + requirement = { + kind = exactVersion; + version = "0.1.0-rc.0"; }; }; 00C48D5B2C6BBA58002B23FF /* XCRemoteSwiftPackageReference "liveview-native-live-form" */ = { @@ -803,7 +806,7 @@ repositoryURL = "https://github.com/liveview-native/liveview-native-live-form"; requirement = { kind = exactVersion; - version = 0.3.1; + version = "0.4.0-rc.0"; }; }; 00CB96302C62886500ADBF08 /* XCRemoteSwiftPackageReference "liveview-native-swiftui-avkit" */ = { @@ -811,17 +814,12 @@ repositoryURL = "https://github.com/liveview-native/liveview-native-swiftui-avkit"; requirement = { kind = exactVersion; - version = 0.3.0; + version = "0.4.0-rc.0"; }; }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 001B1CFD2CF7BC01006D53C9 /* LiveViewNativeRealityKit */ = { - isa = XCSwiftPackageProductDependency; - package = 001B1CFC2CF7BC01006D53C9 /* XCRemoteSwiftPackageReference "liveview-native-swiftui-realitykit" */; - productName = LiveViewNativeRealityKit; - }; 00242EF72C6E516500CC972C /* LiveViewNativeAVKit */ = { isa = XCSwiftPackageProductDependency; package = 00CB96302C62886500ADBF08 /* XCRemoteSwiftPackageReference "liveview-native-swiftui-avkit" */; @@ -857,9 +855,20 @@ package = 00336C762CEF89330038B915 /* XCRemoteSwiftPackageReference "liveview-client-swiftui" */; productName = LiveViewNative; }; - 00336C7D2CEFCE6B0038B915 /* LiveViewNativeRealityKit */ = { + 006F21DC2D1DDDF300B4D3DC /* LiveViewNativePhotoKit */ = { + isa = XCSwiftPackageProductDependency; + package = 006F21DB2D1DDDF300B4D3DC /* XCRemoteSwiftPackageReference "liveview-native-swiftui-photokit" */; + productName = LiveViewNativePhotoKit; + }; + 006F21DE2D1DDE0400B4D3DC /* LiveViewNative */ = { + isa = XCSwiftPackageProductDependency; + package = 00336C762CEF89330038B915 /* XCRemoteSwiftPackageReference "liveview-client-swiftui" */; + productName = LiveViewNative; + }; + 006F21E02D1DDE0400B4D3DC /* LiveViewNativePhotoKit */ = { isa = XCSwiftPackageProductDependency; - productName = LiveViewNativeRealityKit; + package = 006F21DB2D1DDDF300B4D3DC /* XCRemoteSwiftPackageReference "liveview-native-swiftui-photokit" */; + productName = LiveViewNativePhotoKit; }; 00C48D5C2C6BBA58002B23FF /* LiveViewNativeLiveForm */ = { isa = XCSwiftPackageProductDependency; diff --git a/swiftui/LiveViewNativeGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/swiftui/LiveViewNativeGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 8ff9b78..375dec5 100644 --- a/swiftui/LiveViewNativeGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/swiftui/LiveViewNativeGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,22 +1,22 @@ { - "originHash" : "b8cfef38b65ab52e7c29ba031026ab1f29f0b6ce0a13fa7bb96e517ed832ba79", + "originHash" : "26e64dfa8be48def8e4b84de1d64caf922d830f825a7c0cb945835ac86491762", "pins" : [ { "identity" : "liveview-client-swiftui", "kind" : "remoteSourceControl", "location" : "https://github.com/liveview-native/liveview-client-swiftui", "state" : { - "revision" : "669274b2314862b36a622d52f78eab007769bed9", - "version" : "0.3.1" + "revision" : "94676fce9fdfabc6b24fdf942ef874cdaac8ed5e", + "version" : "0.4.0-rc.0" } }, { - "identity" : "liveview-native-core-swift", + "identity" : "liveview-native-core", "kind" : "remoteSourceControl", - "location" : "https://github.com/liveview-native/liveview-native-core-swift.git", + "location" : "https://github.com/liveview-native/liveview-native-core", "state" : { - "revision" : "339594b395938e38f1fb2216a31c8791030ec9ba", - "version" : "0.2.1" + "revision" : "369503f39d7f257ac3361a1b7104ab14015c721c", + "version" : "0.4.0" } }, { @@ -24,8 +24,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/liveview-native/liveview-native-live-form", "state" : { - "revision" : "ecedbf941e8818f6ba25ce71e612e3b2371a5039", - "version" : "0.3.1" + "revision" : "9e61b02906353bac563bf842f8ca8ab8441117d0", + "version" : "0.4.0-rc.0" } }, { @@ -33,8 +33,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/liveview-native/liveview-native-swiftui-avkit", "state" : { - "revision" : "964c46d3a225d8822a196614e6317f7341445647", - "version" : "0.3.0" + "revision" : "a4c8757dfc644bc42ed001927edb0995ee93f8e9", + "version" : "0.4.0-rc.0" } }, { @@ -42,8 +42,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/liveview-native/liveview-native-swiftui-charts", "state" : { - "revision" : "e5ffd6d3e55f677f12a976a1b3554f32a328ddf2", - "version" : "0.3.0" + "revision" : "dcef3897d0178eb43634b86dc8b20cc6f918582d", + "version" : "0.4.0-rc.0" } }, { @@ -51,17 +51,17 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/liveview-native/liveview-native-swiftui-mapkit", "state" : { - "revision" : "5b4e8edfb00c77dda8ed53635c8414451f56bd9e", - "version" : "0.3.0" + "revision" : "659eaa48cc41c64f3562698d1d337a5db72c307f", + "version" : "0.4.0-rc.0" } }, { - "identity" : "liveview-native-swiftui-realitykit", + "identity" : "liveview-native-swiftui-photokit", "kind" : "remoteSourceControl", - "location" : "https://github.com/liveview-native/liveview-native-swiftui-realitykit", + "location" : "https://github.com/liveview-native/liveview-native-swiftui-photokit", "state" : { - "revision" : "39e91d394dedb4417c863f2cd4f01f9d48091635", - "version" : "0.3.1" + "revision" : "358e31c63d06093a32e885657060c0d8e21e1141", + "version" : "0.1.0-rc.0" } }, { @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-async-algorithms", "state" : { - "revision" : "9cfed92b026c524674ed869a4ff2dcfdeedf8a2a", - "version" : "0.1.0" + "revision" : "4c3ea81f81f0a25d0470188459c6d4bf20cf2f97", + "version" : "1.0.3" } }, { @@ -114,26 +114,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swiftlang/swift-syntax.git", "state" : { - "revision" : "64889f0c732f210a935a0ad7cda38f77f876262d", - "version" : "509.1.1" - } - }, - { - "identity" : "swiftphoenixclient", - "kind" : "remoteSourceControl", - "location" : "https://github.com/davidstump/SwiftPhoenixClient.git", - "state" : { - "revision" : "2ea54b43202b053a1e84529509b91621d5601606", - "version" : "5.3.4" - } - }, - { - "identity" : "swiftsoup", - "kind" : "remoteSourceControl", - "location" : "https://github.com/scinfu/SwiftSoup.git", - "state" : { - "revision" : "0837db354faf9c9deb710dc597046edaadf5360f", - "version" : "2.7.6" + "revision" : "0687f71944021d616d34d922343dcef086855920", + "version" : "600.0.1" } }, { diff --git a/swiftui/LiveViewNativeGo/Helpers/Constants.swift b/swiftui/LiveViewNativeGo/Helpers/Constants.swift index 5eed6ed..ff6ba7e 100644 --- a/swiftui/LiveViewNativeGo/Helpers/Constants.swift +++ b/swiftui/LiveViewNativeGo/Helpers/Constants.swift @@ -31,4 +31,8 @@ extension URL { static var realityKit: Self { URL(string: "https://github.com/liveview-native/liveview-native-swiftui-realitykit")! } + + static var photoKit: Self { + URL(string: "https://github.com/liveview-native/liveview-native-swiftui-photokit")! + } } diff --git a/swiftui/LiveViewNativeGo/Phase Views/ErrorView.swift b/swiftui/LiveViewNativeGo/Phase Views/ErrorView.swift index 5a52df7..fc94cbb 100644 --- a/swiftui/LiveViewNativeGo/Phase Views/ErrorView.swift +++ b/swiftui/LiveViewNativeGo/Phase Views/ErrorView.swift @@ -7,6 +7,7 @@ import SwiftUI import LiveViewNative +import LiveViewNativeCore struct ErrorView: View { let error: Error @@ -93,5 +94,5 @@ struct ErrorView: View { } #Preview { - ErrorView(error: LiveConnectionError.initialParseError(missingOrInvalid: .csrfToken)) + ErrorView(error: LiveSocketError.NoDocumentInJoinPayload) } diff --git a/swiftui/LiveViewNativeGo/Screens/AppsScreen.swift b/swiftui/LiveViewNativeGo/Screens/AppsScreen.swift index f5f2564..aa56bac 100644 --- a/swiftui/LiveViewNativeGo/Screens/AppsScreen.swift +++ b/swiftui/LiveViewNativeGo/Screens/AppsScreen.swift @@ -9,6 +9,7 @@ import SwiftUI import Foundation #if os(iOS) import VisionKit +import LiveViewNativePhotoKit #endif import LiveViewNative import LiveViewNativeLiveForm @@ -49,8 +50,24 @@ struct SelectedApp: Identifiable, Hashable, Codable { #endif @ViewBuilder + @MainActor func makeLiveView(settings: Settings, dynamicType: DynamicTypeSize) -> some View { - #if os(tvOS) + #if os(iOS) + let view: AnyView = #LiveView( + url, + addons: [.liveForm, .avKit, .charts, .mapKit, .photoKit] + ) { + ConnectingView(url: url) + } disconnected: { + DisconnectedView() + } reconnecting: { content, isReconnecting in + ReconnectingView(isReconnecting: isReconnecting) { + content + } + } error: { error in + ErrorView(error: error) + } + #elseif os(tvOS) let view: AnyView = #LiveView( url, addons: [.liveForm, .avKit, .charts] diff --git a/swiftui/LiveViewNativeGo/Screens/SettingsScreen.swift b/swiftui/LiveViewNativeGo/Screens/SettingsScreen.swift index 796ce09..0017ffc 100644 --- a/swiftui/LiveViewNativeGo/Screens/SettingsScreen.swift +++ b/swiftui/LiveViewNativeGo/Screens/SettingsScreen.swift @@ -64,6 +64,7 @@ struct SettingsScreen: View { Link("Swift Charts", destination: .charts) Link("MapKit", destination: .mapKit) Link("RealityKit", destination: .realityKit) + Link("PhotoKit", destination: .photoKit) } header: { Text("Included Addons") } footer: {