├── .DS_Store ├── .gitignore └── swiftui ├── .DS_Store ├── LiveViewNativeGo.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── swiftpm │ │ └── Package.resolved └── xcshareddata │ └── xcschemes │ ├── LiveViewNativeGo.xcscheme │ └── LiveViewNativeGoAppClip.xcscheme ├── LiveViewNativeGo ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── 128x128.png │ │ ├── 128x128@2x.png │ │ ├── 16x16.png │ │ ├── 16x16@2x.png │ │ ├── 256x256.png │ │ ├── 256x256@2x.png │ │ ├── 32x32.png │ │ ├── 32x32@2x.png │ │ ├── 512x512.png │ │ ├── 512x512@2x.png │ │ ├── AppIcon.jpg │ │ └── Contents.json │ ├── AppIcon.solidimagestack │ │ ├── Back.solidimagestacklayer │ │ │ ├── Content.imageset │ │ │ │ ├── Back.png │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Front.solidimagestacklayer │ │ │ ├── Content.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── Front(1).png │ │ │ └── Contents.json │ │ └── Middle.solidimagestacklayer │ │ │ ├── Content.imageset │ │ │ ├── Contents.json │ │ │ └── Middle.png │ │ │ └── Contents.json │ ├── Contents.json │ └── tvOS Brand Assets.brandassets │ │ ├── App Icon - App Store.imagestack │ │ ├── Back.imagestacklayer │ │ │ ├── Content.imageset │ │ │ │ ├── Back.png │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Front.imagestacklayer │ │ │ ├── Content.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── Front.png │ │ │ └── Contents.json │ │ └── Middle.imagestacklayer │ │ │ ├── Content.imageset │ │ │ ├── Contents.json │ │ │ └── Middle.png │ │ │ └── Contents.json │ │ ├── App Icon.imagestack │ │ ├── Back.imagestacklayer │ │ │ ├── Content.imageset │ │ │ │ ├── Back.png │ │ │ │ ├── Back@2x.png │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Front.imagestacklayer │ │ │ ├── Content.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── Front.png │ │ │ │ └── Front@2x.png │ │ │ └── Contents.json │ │ └── Middle.imagestacklayer │ │ │ ├── Content.imageset │ │ │ ├── Contents.json │ │ │ ├── Middle.png │ │ │ └── Middle@2x.png │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Top Shelf Image Wide.imageset │ │ ├── Contents.json │ │ ├── tvOS Top Shelf Image (Wide).png │ │ └── tvOS Top Shelf Image (Wide)@2x.png │ │ └── Top Shelf Image.imageset │ │ ├── Contents.json │ │ ├── tvOS Top Shelf Image.png │ │ └── tvOS Top Shelf Image@2x.png ├── ContentView.swift ├── Helpers │ ├── Constants.swift │ ├── DataScannerView.swift │ ├── QuickActions │ │ ├── QuickActionsCommands.swift │ │ └── QuickActionsModifier.swift │ ├── ShakeGesture.swift │ └── URL+replacing.swift ├── Info.plist ├── LiveViewNativeGo.entitlements ├── LiveViewNativeGoApp.swift ├── Model │ ├── Logs.swift │ └── Settings.swift ├── Phase Views │ ├── ConnectingView.swift │ ├── DisconnectedView.swift │ ├── ErrorView.swift │ └── ReconnectingView.swift ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json └── Screens │ ├── AppsScreen.swift │ ├── LiveViewCodeScanner.swift │ ├── LogsScreen.swift │ └── SettingsScreen.swift ├── LiveViewNativeGoAppClip ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── AppIcon.jpg │ │ └── Contents.json │ └── Contents.json ├── Info.plist ├── LiveViewNativeGoAppClip.entitlements ├── LiveViewNativeGoAppClipApp.swift └── Preview Content │ └── Preview Assets.xcassets │ └── Contents.json └── PRIVACY_POLICY.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | build/ 14 | DerivedData/ 15 | *.moved-aside 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | 28 | ## App packaging 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 40 | # Packages/ 41 | # Package.pins 42 | # Package.resolved 43 | # *.xcodeproj 44 | # 45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 46 | # hence it is not needed unless you have added a package configuration file to your project 47 | # .swiftpm 48 | 49 | .build/ 50 | 51 | # CocoaPods 52 | # 53 | # We recommend against adding the Pods directory to your .gitignore. However 54 | # you should judge for yourself, the pros and cons are mentioned at: 55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 56 | # 57 | # Pods/ 58 | # 59 | # Add this line if you want to avoid checking in source code from the Xcode workspace 60 | # *.xcworkspace 61 | 62 | # Carthage 63 | # 64 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 65 | # Carthage/Checkouts 66 | 67 | Carthage/Build/ 68 | 69 | # Accio dependency management 70 | Dependencies/ 71 | .accio/ 72 | 73 | # fastlane 74 | # 75 | # It is recommended to not store the screenshots in the git repo. 76 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 77 | # For more information about the recommended setup visit: 78 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 79 | 80 | fastlane/report.xml 81 | fastlane/Preview.html 82 | fastlane/screenshots/**/*.png 83 | fastlane/test_output 84 | 85 | # Code Injection 86 | # 87 | # After new code Injection tools there's a generated folder /iOSInjectionProject 88 | # https://github.com/johnno1962/injectionforxcode 89 | 90 | iOSInjectionProject/ 91 | -------------------------------------------------------------------------------- /swiftui/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/.DS_Store -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 56; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 000C92712BB30EDD00E553D4 /* LiveViewNativeGoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000C92702BB30EDD00E553D4 /* LiveViewNativeGoApp.swift */; }; 11 | 000C92732BB30EDD00E553D4 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000C92722BB30EDD00E553D4 /* ContentView.swift */; }; 12 | 000C92752BB30EDF00E553D4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 000C92742BB30EDF00E553D4 /* Assets.xcassets */; }; 13 | 000C92792BB30EDF00E553D4 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 000C92782BB30EDF00E553D4 /* Preview Assets.xcassets */; }; 14 | 000C92812BB30FC600E553D4 /* AppsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000C92802BB30FC600E553D4 /* AppsScreen.swift */; }; 15 | 000C92832BB3146800E553D4 /* SettingsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000C92822BB3146800E553D4 /* SettingsScreen.swift */; }; 16 | 000C92862BB3150F00E553D4 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000C92852BB3150F00E553D4 /* Settings.swift */; }; 17 | 001B1CFE2CF7BC01006D53C9 /* LiveViewNativeRealityKit in Frameworks */ = {isa = PBXBuildFile; platformFilters = (xros, ); productRef = 001B1CFD2CF7BC01006D53C9 /* LiveViewNativeRealityKit */; }; 18 | 00232F112CC8286A0081DF3D /* Logs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00232F102CC828660081DF3D /* Logs.swift */; }; 19 | 00232F122CC8286A0081DF3D /* Logs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00232F102CC828660081DF3D /* Logs.swift */; }; 20 | 00242ED92C6E513000CC972C /* LiveViewNativeGoAppClipApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00242ED82C6E513000CC972C /* LiveViewNativeGoAppClipApp.swift */; }; 21 | 00242EDD2C6E513100CC972C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 00242EDC2C6E513100CC972C /* Assets.xcassets */; }; 22 | 00242EE02C6E513100CC972C /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 00242EDF2C6E513100CC972C /* Preview Assets.xcassets */; }; 23 | 00242EE52C6E513100CC972C /* LiveViewNativeGoAppClip.app in Embed App Clips */ = {isa = PBXBuildFile; fileRef = 00242ED62C6E513000CC972C /* LiveViewNativeGoAppClip.app */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 24 | 00242EE92C6E515200CC972C /* AppsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000C92802BB30FC600E553D4 /* AppsScreen.swift */; }; 25 | 00242EEA2C6E515200CC972C /* QuickActionsModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D562C6BAA02002B23FF /* QuickActionsModifier.swift */; }; 26 | 00242EEB2C6E515200CC972C /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000C92722BB30EDD00E553D4 /* ContentView.swift */; }; 27 | 00242EEC2C6E515200CC972C /* QuickActionsCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D582C6BAA18002B23FF /* QuickActionsCommands.swift */; }; 28 | 00242EED2C6E515200CC972C /* SettingsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000C92822BB3146800E553D4 /* SettingsScreen.swift */; }; 29 | 00242EEE2C6E515200CC972C /* ErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D4E2C656C47002B23FF /* ErrorView.swift */; }; 30 | 00242EEF2C6E515200CC972C /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00CB96392C62988300ADBF08 /* Constants.swift */; }; 31 | 00242EF02C6E515200CC972C /* ShakeGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00ABCC442BED72B80039E1CE /* ShakeGesture.swift */; }; 32 | 00242EF12C6E515200CC972C /* DisconnectedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D502C656C60002B23FF /* DisconnectedView.swift */; }; 33 | 00242EF22C6E515200CC972C /* ReconnectingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D522C656C7B002B23FF /* ReconnectingView.swift */; }; 34 | 00242EF32C6E515200CC972C /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000C92852BB3150F00E553D4 /* Settings.swift */; }; 35 | 00242EF42C6E515200CC972C /* DataScannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00ABCC472BF395170039E1CE /* DataScannerView.swift */; }; 36 | 00242EF52C6E515200CC972C /* ConnectingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D542C656CAD002B23FF /* ConnectingView.swift */; }; 37 | 00242EF82C6E516500CC972C /* LiveViewNativeAVKit in Frameworks */ = {isa = PBXBuildFile; productRef = 00242EF72C6E516500CC972C /* LiveViewNativeAVKit */; }; 38 | 00242F002C6E516500CC972C /* LiveViewNativeLiveForm in Frameworks */ = {isa = PBXBuildFile; productRef = 00242EFF2C6E516500CC972C /* LiveViewNativeLiveForm */; }; 39 | 0032557E2CAF2FFB0097904C /* LiveViewNativeCharts in Frameworks */ = {isa = PBXBuildFile; productRef = 0032557D2CAF2FFB0097904C /* LiveViewNativeCharts */; }; 40 | 003255802CAF2FFE0097904C /* LiveViewNativeMapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 0032557F2CAF2FFE0097904C /* LiveViewNativeMapKit */; }; 41 | 003255822CAF30020097904C /* LiveViewNativeCharts in Frameworks */ = {isa = PBXBuildFile; productRef = 003255812CAF30020097904C /* LiveViewNativeCharts */; }; 42 | 003255842CAF30040097904C /* LiveViewNativeMapKit in Frameworks */ = {isa = PBXBuildFile; platformFilters = (ios, macos, xros, ); productRef = 003255832CAF30040097904C /* LiveViewNativeMapKit */; }; 43 | 00336C782CEF89400038B915 /* LiveViewNative in Frameworks */ = {isa = PBXBuildFile; productRef = 00336C772CEF89400038B915 /* LiveViewNative */; }; 44 | 00336C7E2CEFCE6B0038B915 /* LiveViewNativeRealityKit in Frameworks */ = {isa = PBXBuildFile; platformFilters = (xros, ); productRef = 00336C7D2CEFCE6B0038B915 /* LiveViewNativeRealityKit */; }; 45 | 00ABCC452BED72B80039E1CE /* ShakeGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00ABCC442BED72B80039E1CE /* ShakeGesture.swift */; }; 46 | 00ABCC482BF395170039E1CE /* DataScannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00ABCC472BF395170039E1CE /* DataScannerView.swift */; }; 47 | 00C48D4F2C656C47002B23FF /* ErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D4E2C656C47002B23FF /* ErrorView.swift */; }; 48 | 00C48D512C656C60002B23FF /* DisconnectedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D502C656C60002B23FF /* DisconnectedView.swift */; }; 49 | 00C48D532C656C7B002B23FF /* ReconnectingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D522C656C7B002B23FF /* ReconnectingView.swift */; }; 50 | 00C48D552C656CAD002B23FF /* ConnectingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D542C656CAD002B23FF /* ConnectingView.swift */; }; 51 | 00C48D572C6BAA02002B23FF /* QuickActionsModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D562C6BAA02002B23FF /* QuickActionsModifier.swift */; }; 52 | 00C48D592C6BAA18002B23FF /* QuickActionsCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C48D582C6BAA18002B23FF /* QuickActionsCommands.swift */; }; 53 | 00C48D5D2C6BBA58002B23FF /* LiveViewNativeLiveForm in Frameworks */ = {isa = PBXBuildFile; productRef = 00C48D5C2C6BBA58002B23FF /* LiveViewNativeLiveForm */; }; 54 | 00C48D602C6BBA60002B23FF /* LiveViewNativeAVKit in Frameworks */ = {isa = PBXBuildFile; productRef = 00C48D5F2C6BBA60002B23FF /* LiveViewNativeAVKit */; }; 55 | 00CB963A2C62988300ADBF08 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00CB96392C62988300ADBF08 /* Constants.swift */; }; 56 | 00D674A32CAEE29F002E2838 /* LiveViewCodeScanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D674A22CAEE291002E2838 /* LiveViewCodeScanner.swift */; }; 57 | 00D674A42CAEE29F002E2838 /* LiveViewCodeScanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D674A22CAEE291002E2838 /* LiveViewCodeScanner.swift */; }; 58 | 00D674A62CAEF91A002E2838 /* URL+replacing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D674A52CAEF904002E2838 /* URL+replacing.swift */; }; 59 | 00D674A72CAEF91A002E2838 /* URL+replacing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D674A52CAEF904002E2838 /* URL+replacing.swift */; }; 60 | 00FC5E192CC82B410012361E /* LogsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00FC5E182CC82B3E0012361E /* LogsScreen.swift */; }; 61 | 00FC5E1A2CC82B410012361E /* LogsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00FC5E182CC82B3E0012361E /* LogsScreen.swift */; }; 62 | /* End PBXBuildFile section */ 63 | 64 | /* Begin PBXContainerItemProxy section */ 65 | 00242EE32C6E513100CC972C /* PBXContainerItemProxy */ = { 66 | isa = PBXContainerItemProxy; 67 | containerPortal = 000C92652BB30EDD00E553D4 /* Project object */; 68 | proxyType = 1; 69 | remoteGlobalIDString = 00242ED52C6E513000CC972C; 70 | remoteInfo = LiveViewNativeGoAppClip; 71 | }; 72 | /* End PBXContainerItemProxy section */ 73 | 74 | /* Begin PBXCopyFilesBuildPhase section */ 75 | 00ABCC392BED5D7A0039E1CE /* Embed App Clips */ = { 76 | isa = PBXCopyFilesBuildPhase; 77 | buildActionMask = 2147483647; 78 | dstPath = "$(CONTENTS_FOLDER_PATH)/AppClips"; 79 | dstSubfolderSpec = 16; 80 | files = ( 81 | 00242EE52C6E513100CC972C /* LiveViewNativeGoAppClip.app in Embed App Clips */, 82 | ); 83 | name = "Embed App Clips"; 84 | runOnlyForDeploymentPostprocessing = 0; 85 | }; 86 | /* End PBXCopyFilesBuildPhase section */ 87 | 88 | /* Begin PBXFileReference section */ 89 | 000C926D2BB30EDD00E553D4 /* LVN Go.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "LVN Go.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 90 | 000C92702BB30EDD00E553D4 /* LiveViewNativeGoApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveViewNativeGoApp.swift; sourceTree = ""; }; 91 | 000C92722BB30EDD00E553D4 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 92 | 000C92742BB30EDF00E553D4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 93 | 000C92762BB30EDF00E553D4 /* LiveViewNativeGo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = LiveViewNativeGo.entitlements; sourceTree = ""; }; 94 | 000C92782BB30EDF00E553D4 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 95 | 000C92802BB30FC600E553D4 /* AppsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppsScreen.swift; sourceTree = ""; }; 96 | 000C92822BB3146800E553D4 /* SettingsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreen.swift; sourceTree = ""; }; 97 | 000C92852BB3150F00E553D4 /* Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = ""; }; 98 | 00232F102CC828660081DF3D /* Logs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logs.swift; sourceTree = ""; }; 99 | 00242ED62C6E513000CC972C /* LiveViewNativeGoAppClip.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LiveViewNativeGoAppClip.app; sourceTree = BUILT_PRODUCTS_DIR; }; 100 | 00242ED82C6E513000CC972C /* LiveViewNativeGoAppClipApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveViewNativeGoAppClipApp.swift; sourceTree = ""; }; 101 | 00242EDC2C6E513100CC972C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 102 | 00242EDF2C6E513100CC972C /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 103 | 00242EE12C6E513100CC972C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 104 | 00242EE22C6E513100CC972C /* LiveViewNativeGoAppClip.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = LiveViewNativeGoAppClip.entitlements; sourceTree = ""; }; 105 | 00ABCC442BED72B80039E1CE /* ShakeGesture.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShakeGesture.swift; sourceTree = ""; }; 106 | 00ABCC472BF395170039E1CE /* DataScannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataScannerView.swift; sourceTree = ""; }; 107 | 00C48D4E2C656C47002B23FF /* ErrorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorView.swift; sourceTree = ""; }; 108 | 00C48D502C656C60002B23FF /* DisconnectedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisconnectedView.swift; sourceTree = ""; }; 109 | 00C48D522C656C7B002B23FF /* ReconnectingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReconnectingView.swift; sourceTree = ""; }; 110 | 00C48D542C656CAD002B23FF /* ConnectingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectingView.swift; sourceTree = ""; }; 111 | 00C48D562C6BAA02002B23FF /* QuickActionsModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickActionsModifier.swift; sourceTree = ""; }; 112 | 00C48D582C6BAA18002B23FF /* QuickActionsCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickActionsCommands.swift; sourceTree = ""; }; 113 | 00CB96392C62988300ADBF08 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; 114 | 00CB96412C62BD3100ADBF08 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 115 | 00D674A22CAEE291002E2838 /* LiveViewCodeScanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveViewCodeScanner.swift; sourceTree = ""; }; 116 | 00D674A52CAEF904002E2838 /* URL+replacing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+replacing.swift"; sourceTree = ""; }; 117 | 00FC5E182CC82B3E0012361E /* LogsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogsScreen.swift; sourceTree = ""; }; 118 | /* End PBXFileReference section */ 119 | 120 | /* Begin PBXFrameworksBuildPhase section */ 121 | 000C926A2BB30EDD00E553D4 /* Frameworks */ = { 122 | isa = PBXFrameworksBuildPhase; 123 | buildActionMask = 2147483647; 124 | files = ( 125 | 001B1CFE2CF7BC01006D53C9 /* LiveViewNativeRealityKit in Frameworks */, 126 | 003255842CAF30040097904C /* LiveViewNativeMapKit in Frameworks */, 127 | 00336C782CEF89400038B915 /* LiveViewNative in Frameworks */, 128 | 00336C7E2CEFCE6B0038B915 /* LiveViewNativeRealityKit in Frameworks */, 129 | 00C48D602C6BBA60002B23FF /* LiveViewNativeAVKit in Frameworks */, 130 | 00C48D5D2C6BBA58002B23FF /* LiveViewNativeLiveForm in Frameworks */, 131 | 003255822CAF30020097904C /* LiveViewNativeCharts in Frameworks */, 132 | ); 133 | runOnlyForDeploymentPostprocessing = 0; 134 | }; 135 | 00242ED32C6E513000CC972C /* Frameworks */ = { 136 | isa = PBXFrameworksBuildPhase; 137 | buildActionMask = 2147483647; 138 | files = ( 139 | 003255802CAF2FFE0097904C /* LiveViewNativeMapKit in Frameworks */, 140 | 00242EF82C6E516500CC972C /* LiveViewNativeAVKit in Frameworks */, 141 | 00242F002C6E516500CC972C /* LiveViewNativeLiveForm in Frameworks */, 142 | 0032557E2CAF2FFB0097904C /* LiveViewNativeCharts in Frameworks */, 143 | ); 144 | runOnlyForDeploymentPostprocessing = 0; 145 | }; 146 | /* End PBXFrameworksBuildPhase section */ 147 | 148 | /* Begin PBXGroup section */ 149 | 000C92642BB30EDD00E553D4 = { 150 | isa = PBXGroup; 151 | children = ( 152 | 000C926F2BB30EDD00E553D4 /* LiveViewNativeGo */, 153 | 00242ED72C6E513000CC972C /* LiveViewNativeGoAppClip */, 154 | 000C926E2BB30EDD00E553D4 /* Products */, 155 | 00242EF62C6E516500CC972C /* Frameworks */, 156 | ); 157 | sourceTree = ""; 158 | }; 159 | 000C926E2BB30EDD00E553D4 /* Products */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | 000C926D2BB30EDD00E553D4 /* LVN Go.app */, 163 | 00242ED62C6E513000CC972C /* LiveViewNativeGoAppClip.app */, 164 | ); 165 | name = Products; 166 | sourceTree = ""; 167 | }; 168 | 000C926F2BB30EDD00E553D4 /* LiveViewNativeGo */ = { 169 | isa = PBXGroup; 170 | children = ( 171 | 00CB96412C62BD3100ADBF08 /* Info.plist */, 172 | 000C92702BB30EDD00E553D4 /* LiveViewNativeGoApp.swift */, 173 | 000C92722BB30EDD00E553D4 /* ContentView.swift */, 174 | 000C92842BB3150400E553D4 /* Model */, 175 | 000C927F2BB30FB000E553D4 /* Screens */, 176 | 00ABCC432BED72AF0039E1CE /* Helpers */, 177 | 00C48D4D2C656C3B002B23FF /* Phase Views */, 178 | 000C92742BB30EDF00E553D4 /* Assets.xcassets */, 179 | 000C92762BB30EDF00E553D4 /* LiveViewNativeGo.entitlements */, 180 | 000C92772BB30EDF00E553D4 /* Preview Content */, 181 | ); 182 | path = LiveViewNativeGo; 183 | sourceTree = ""; 184 | }; 185 | 000C92772BB30EDF00E553D4 /* Preview Content */ = { 186 | isa = PBXGroup; 187 | children = ( 188 | 000C92782BB30EDF00E553D4 /* Preview Assets.xcassets */, 189 | ); 190 | path = "Preview Content"; 191 | sourceTree = ""; 192 | }; 193 | 000C927F2BB30FB000E553D4 /* Screens */ = { 194 | isa = PBXGroup; 195 | children = ( 196 | 00FC5E182CC82B3E0012361E /* LogsScreen.swift */, 197 | 00D674A22CAEE291002E2838 /* LiveViewCodeScanner.swift */, 198 | 000C92802BB30FC600E553D4 /* AppsScreen.swift */, 199 | 000C92822BB3146800E553D4 /* SettingsScreen.swift */, 200 | ); 201 | path = Screens; 202 | sourceTree = ""; 203 | }; 204 | 000C92842BB3150400E553D4 /* Model */ = { 205 | isa = PBXGroup; 206 | children = ( 207 | 00232F102CC828660081DF3D /* Logs.swift */, 208 | 000C92852BB3150F00E553D4 /* Settings.swift */, 209 | ); 210 | path = Model; 211 | sourceTree = ""; 212 | }; 213 | 00242ED72C6E513000CC972C /* LiveViewNativeGoAppClip */ = { 214 | isa = PBXGroup; 215 | children = ( 216 | 00242ED82C6E513000CC972C /* LiveViewNativeGoAppClipApp.swift */, 217 | 00242EDC2C6E513100CC972C /* Assets.xcassets */, 218 | 00242EE12C6E513100CC972C /* Info.plist */, 219 | 00242EE22C6E513100CC972C /* LiveViewNativeGoAppClip.entitlements */, 220 | 00242EDE2C6E513100CC972C /* Preview Content */, 221 | ); 222 | path = LiveViewNativeGoAppClip; 223 | sourceTree = ""; 224 | }; 225 | 00242EDE2C6E513100CC972C /* Preview Content */ = { 226 | isa = PBXGroup; 227 | children = ( 228 | 00242EDF2C6E513100CC972C /* Preview Assets.xcassets */, 229 | ); 230 | path = "Preview Content"; 231 | sourceTree = ""; 232 | }; 233 | 00242EF62C6E516500CC972C /* Frameworks */ = { 234 | isa = PBXGroup; 235 | children = ( 236 | ); 237 | name = Frameworks; 238 | sourceTree = ""; 239 | }; 240 | 00ABCC432BED72AF0039E1CE /* Helpers */ = { 241 | isa = PBXGroup; 242 | children = ( 243 | 00D674A52CAEF904002E2838 /* URL+replacing.swift */, 244 | 00C48D5A2C6BAAAE002B23FF /* QuickActions */, 245 | 00ABCC472BF395170039E1CE /* DataScannerView.swift */, 246 | 00ABCC442BED72B80039E1CE /* ShakeGesture.swift */, 247 | 00CB96392C62988300ADBF08 /* Constants.swift */, 248 | ); 249 | path = Helpers; 250 | sourceTree = ""; 251 | }; 252 | 00C48D4D2C656C3B002B23FF /* Phase Views */ = { 253 | isa = PBXGroup; 254 | children = ( 255 | 00C48D542C656CAD002B23FF /* ConnectingView.swift */, 256 | 00C48D502C656C60002B23FF /* DisconnectedView.swift */, 257 | 00C48D4E2C656C47002B23FF /* ErrorView.swift */, 258 | 00C48D522C656C7B002B23FF /* ReconnectingView.swift */, 259 | ); 260 | path = "Phase Views"; 261 | sourceTree = ""; 262 | }; 263 | 00C48D5A2C6BAAAE002B23FF /* QuickActions */ = { 264 | isa = PBXGroup; 265 | children = ( 266 | 00C48D562C6BAA02002B23FF /* QuickActionsModifier.swift */, 267 | 00C48D582C6BAA18002B23FF /* QuickActionsCommands.swift */, 268 | ); 269 | path = QuickActions; 270 | sourceTree = ""; 271 | }; 272 | /* End PBXGroup section */ 273 | 274 | /* Begin PBXNativeTarget section */ 275 | 000C926C2BB30EDD00E553D4 /* LVN Go */ = { 276 | isa = PBXNativeTarget; 277 | buildConfigurationList = 000C927C2BB30EDF00E553D4 /* Build configuration list for PBXNativeTarget "LVN Go" */; 278 | buildPhases = ( 279 | 000C92692BB30EDD00E553D4 /* Sources */, 280 | 000C926A2BB30EDD00E553D4 /* Frameworks */, 281 | 000C926B2BB30EDD00E553D4 /* Resources */, 282 | 00ABCC392BED5D7A0039E1CE /* Embed App Clips */, 283 | ); 284 | buildRules = ( 285 | ); 286 | dependencies = ( 287 | 00242EE42C6E513100CC972C /* PBXTargetDependency */, 288 | ); 289 | name = "LVN Go"; 290 | packageProductDependencies = ( 291 | 00C48D5C2C6BBA58002B23FF /* LiveViewNativeLiveForm */, 292 | 00C48D5F2C6BBA60002B23FF /* LiveViewNativeAVKit */, 293 | 003255812CAF30020097904C /* LiveViewNativeCharts */, 294 | 003255832CAF30040097904C /* LiveViewNativeMapKit */, 295 | 00336C772CEF89400038B915 /* LiveViewNative */, 296 | 00336C7D2CEFCE6B0038B915 /* LiveViewNativeRealityKit */, 297 | 001B1CFD2CF7BC01006D53C9 /* LiveViewNativeRealityKit */, 298 | ); 299 | productName = LiveViewNativeGo; 300 | productReference = 000C926D2BB30EDD00E553D4 /* LVN Go.app */; 301 | productType = "com.apple.product-type.application"; 302 | }; 303 | 00242ED52C6E513000CC972C /* LiveViewNativeGoAppClip */ = { 304 | isa = PBXNativeTarget; 305 | buildConfigurationList = 00242EE62C6E513100CC972C /* Build configuration list for PBXNativeTarget "LiveViewNativeGoAppClip" */; 306 | buildPhases = ( 307 | 00242ED22C6E513000CC972C /* Sources */, 308 | 00242ED32C6E513000CC972C /* Frameworks */, 309 | 00242ED42C6E513000CC972C /* Resources */, 310 | ); 311 | buildRules = ( 312 | ); 313 | dependencies = ( 314 | ); 315 | name = LiveViewNativeGoAppClip; 316 | packageProductDependencies = ( 317 | 00242EF72C6E516500CC972C /* LiveViewNativeAVKit */, 318 | 00242EFF2C6E516500CC972C /* LiveViewNativeLiveForm */, 319 | 0032557D2CAF2FFB0097904C /* LiveViewNativeCharts */, 320 | 0032557F2CAF2FFE0097904C /* LiveViewNativeMapKit */, 321 | ); 322 | productName = LiveViewNativeGoAppClip; 323 | productReference = 00242ED62C6E513000CC972C /* LiveViewNativeGoAppClip.app */; 324 | productType = "com.apple.product-type.application.on-demand-install-capable"; 325 | }; 326 | /* End PBXNativeTarget section */ 327 | 328 | /* Begin PBXProject section */ 329 | 000C92652BB30EDD00E553D4 /* Project object */ = { 330 | isa = PBXProject; 331 | attributes = { 332 | BuildIndependentTargetsInParallel = 1; 333 | LastSwiftUpdateCheck = 1540; 334 | LastUpgradeCheck = 1520; 335 | TargetAttributes = { 336 | 000C926C2BB30EDD00E553D4 = { 337 | CreatedOnToolsVersion = 15.2; 338 | }; 339 | 00242ED52C6E513000CC972C = { 340 | CreatedOnToolsVersion = 15.4; 341 | }; 342 | }; 343 | }; 344 | buildConfigurationList = 000C92682BB30EDD00E553D4 /* Build configuration list for PBXProject "LiveViewNativeGo" */; 345 | compatibilityVersion = "Xcode 14.0"; 346 | developmentRegion = en; 347 | hasScannedForEncodings = 0; 348 | knownRegions = ( 349 | en, 350 | Base, 351 | ); 352 | mainGroup = 000C92642BB30EDD00E553D4; 353 | packageReferences = ( 354 | 00CB96302C62886500ADBF08 /* XCRemoteSwiftPackageReference "liveview-native-swiftui-avkit" */, 355 | 00C48D5B2C6BBA58002B23FF /* XCRemoteSwiftPackageReference "liveview-native-live-form" */, 356 | 0032557B2CAF29CA0097904C /* XCRemoteSwiftPackageReference "liveview-native-swiftui-charts" */, 357 | 0032557C2CAF29E00097904C /* XCRemoteSwiftPackageReference "liveview-native-swiftui-mapkit" */, 358 | 00336C762CEF89330038B915 /* XCRemoteSwiftPackageReference "liveview-client-swiftui" */, 359 | 001B1CFC2CF7BC01006D53C9 /* XCRemoteSwiftPackageReference "liveview-native-swiftui-realitykit" */, 360 | ); 361 | productRefGroup = 000C926E2BB30EDD00E553D4 /* Products */; 362 | projectDirPath = ""; 363 | projectRoot = ""; 364 | targets = ( 365 | 000C926C2BB30EDD00E553D4 /* LVN Go */, 366 | 00242ED52C6E513000CC972C /* LiveViewNativeGoAppClip */, 367 | ); 368 | }; 369 | /* End PBXProject section */ 370 | 371 | /* Begin PBXResourcesBuildPhase section */ 372 | 000C926B2BB30EDD00E553D4 /* Resources */ = { 373 | isa = PBXResourcesBuildPhase; 374 | buildActionMask = 2147483647; 375 | files = ( 376 | 000C92792BB30EDF00E553D4 /* Preview Assets.xcassets in Resources */, 377 | 000C92752BB30EDF00E553D4 /* Assets.xcassets in Resources */, 378 | ); 379 | runOnlyForDeploymentPostprocessing = 0; 380 | }; 381 | 00242ED42C6E513000CC972C /* Resources */ = { 382 | isa = PBXResourcesBuildPhase; 383 | buildActionMask = 2147483647; 384 | files = ( 385 | 00242EE02C6E513100CC972C /* Preview Assets.xcassets in Resources */, 386 | 00242EDD2C6E513100CC972C /* Assets.xcassets in Resources */, 387 | ); 388 | runOnlyForDeploymentPostprocessing = 0; 389 | }; 390 | /* End PBXResourcesBuildPhase section */ 391 | 392 | /* Begin PBXSourcesBuildPhase section */ 393 | 000C92692BB30EDD00E553D4 /* Sources */ = { 394 | isa = PBXSourcesBuildPhase; 395 | buildActionMask = 2147483647; 396 | files = ( 397 | 00FC5E192CC82B410012361E /* LogsScreen.swift in Sources */, 398 | 000C92812BB30FC600E553D4 /* AppsScreen.swift in Sources */, 399 | 00D674A62CAEF91A002E2838 /* URL+replacing.swift in Sources */, 400 | 00C48D592C6BAA18002B23FF /* QuickActionsCommands.swift in Sources */, 401 | 000C92732BB30EDD00E553D4 /* ContentView.swift in Sources */, 402 | 00C48D552C656CAD002B23FF /* ConnectingView.swift in Sources */, 403 | 00ABCC452BED72B80039E1CE /* ShakeGesture.swift in Sources */, 404 | 00C48D572C6BAA02002B23FF /* QuickActionsModifier.swift in Sources */, 405 | 000C92832BB3146800E553D4 /* SettingsScreen.swift in Sources */, 406 | 000C92712BB30EDD00E553D4 /* LiveViewNativeGoApp.swift in Sources */, 407 | 000C92862BB3150F00E553D4 /* Settings.swift in Sources */, 408 | 00ABCC482BF395170039E1CE /* DataScannerView.swift in Sources */, 409 | 00C48D532C656C7B002B23FF /* ReconnectingView.swift in Sources */, 410 | 00C48D4F2C656C47002B23FF /* ErrorView.swift in Sources */, 411 | 00CB963A2C62988300ADBF08 /* Constants.swift in Sources */, 412 | 00D674A32CAEE29F002E2838 /* LiveViewCodeScanner.swift in Sources */, 413 | 00232F122CC8286A0081DF3D /* Logs.swift in Sources */, 414 | 00C48D512C656C60002B23FF /* DisconnectedView.swift in Sources */, 415 | ); 416 | runOnlyForDeploymentPostprocessing = 0; 417 | }; 418 | 00242ED22C6E513000CC972C /* Sources */ = { 419 | isa = PBXSourcesBuildPhase; 420 | buildActionMask = 2147483647; 421 | files = ( 422 | 00FC5E1A2CC82B410012361E /* LogsScreen.swift in Sources */, 423 | 00242ED92C6E513000CC972C /* LiveViewNativeGoAppClipApp.swift in Sources */, 424 | 00D674A72CAEF91A002E2838 /* URL+replacing.swift in Sources */, 425 | 00242EE92C6E515200CC972C /* AppsScreen.swift in Sources */, 426 | 00242EEA2C6E515200CC972C /* QuickActionsModifier.swift in Sources */, 427 | 00242EEB2C6E515200CC972C /* ContentView.swift in Sources */, 428 | 00242EEC2C6E515200CC972C /* QuickActionsCommands.swift in Sources */, 429 | 00242EED2C6E515200CC972C /* SettingsScreen.swift in Sources */, 430 | 00242EEE2C6E515200CC972C /* ErrorView.swift in Sources */, 431 | 00242EEF2C6E515200CC972C /* Constants.swift in Sources */, 432 | 00242EF02C6E515200CC972C /* ShakeGesture.swift in Sources */, 433 | 00242EF12C6E515200CC972C /* DisconnectedView.swift in Sources */, 434 | 00242EF22C6E515200CC972C /* ReconnectingView.swift in Sources */, 435 | 00242EF32C6E515200CC972C /* Settings.swift in Sources */, 436 | 00242EF42C6E515200CC972C /* DataScannerView.swift in Sources */, 437 | 00D674A42CAEE29F002E2838 /* LiveViewCodeScanner.swift in Sources */, 438 | 00232F112CC8286A0081DF3D /* Logs.swift in Sources */, 439 | 00242EF52C6E515200CC972C /* ConnectingView.swift in Sources */, 440 | ); 441 | runOnlyForDeploymentPostprocessing = 0; 442 | }; 443 | /* End PBXSourcesBuildPhase section */ 444 | 445 | /* Begin PBXTargetDependency section */ 446 | 00242EE42C6E513100CC972C /* PBXTargetDependency */ = { 447 | isa = PBXTargetDependency; 448 | platformFilter = ios; 449 | target = 00242ED52C6E513000CC972C /* LiveViewNativeGoAppClip */; 450 | targetProxy = 00242EE32C6E513100CC972C /* PBXContainerItemProxy */; 451 | }; 452 | /* End PBXTargetDependency section */ 453 | 454 | /* Begin XCBuildConfiguration section */ 455 | 000C927A2BB30EDF00E553D4 /* Debug */ = { 456 | isa = XCBuildConfiguration; 457 | buildSettings = { 458 | ALWAYS_SEARCH_USER_PATHS = NO; 459 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 460 | CLANG_ANALYZER_NONNULL = YES; 461 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 462 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 463 | CLANG_ENABLE_MODULES = YES; 464 | CLANG_ENABLE_OBJC_ARC = YES; 465 | CLANG_ENABLE_OBJC_WEAK = YES; 466 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 467 | CLANG_WARN_BOOL_CONVERSION = YES; 468 | CLANG_WARN_COMMA = YES; 469 | CLANG_WARN_CONSTANT_CONVERSION = YES; 470 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 471 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 472 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 473 | CLANG_WARN_EMPTY_BODY = YES; 474 | CLANG_WARN_ENUM_CONVERSION = YES; 475 | CLANG_WARN_INFINITE_RECURSION = YES; 476 | CLANG_WARN_INT_CONVERSION = YES; 477 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 478 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 479 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 480 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 481 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 482 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 483 | CLANG_WARN_STRICT_PROTOTYPES = YES; 484 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 485 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 486 | CLANG_WARN_UNREACHABLE_CODE = YES; 487 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 488 | COPY_PHASE_STRIP = NO; 489 | DEBUG_INFORMATION_FORMAT = dwarf; 490 | ENABLE_STRICT_OBJC_MSGSEND = YES; 491 | ENABLE_TESTABILITY = YES; 492 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 493 | GCC_C_LANGUAGE_STANDARD = gnu17; 494 | GCC_DYNAMIC_NO_PIC = NO; 495 | GCC_NO_COMMON_BLOCKS = YES; 496 | GCC_OPTIMIZATION_LEVEL = 0; 497 | GCC_PREPROCESSOR_DEFINITIONS = ( 498 | "DEBUG=1", 499 | "$(inherited)", 500 | ); 501 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 502 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 503 | GCC_WARN_UNDECLARED_SELECTOR = YES; 504 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 505 | GCC_WARN_UNUSED_FUNCTION = YES; 506 | GCC_WARN_UNUSED_VARIABLE = YES; 507 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 508 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 509 | MTL_FAST_MATH = YES; 510 | ONLY_ACTIVE_ARCH = YES; 511 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; 512 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 513 | }; 514 | name = Debug; 515 | }; 516 | 000C927B2BB30EDF00E553D4 /* Release */ = { 517 | isa = XCBuildConfiguration; 518 | buildSettings = { 519 | ALWAYS_SEARCH_USER_PATHS = NO; 520 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 521 | CLANG_ANALYZER_NONNULL = YES; 522 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 523 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 524 | CLANG_ENABLE_MODULES = YES; 525 | CLANG_ENABLE_OBJC_ARC = YES; 526 | CLANG_ENABLE_OBJC_WEAK = YES; 527 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 528 | CLANG_WARN_BOOL_CONVERSION = YES; 529 | CLANG_WARN_COMMA = YES; 530 | CLANG_WARN_CONSTANT_CONVERSION = YES; 531 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 532 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 533 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 534 | CLANG_WARN_EMPTY_BODY = YES; 535 | CLANG_WARN_ENUM_CONVERSION = YES; 536 | CLANG_WARN_INFINITE_RECURSION = YES; 537 | CLANG_WARN_INT_CONVERSION = YES; 538 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 539 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 540 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 541 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 542 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 543 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 544 | CLANG_WARN_STRICT_PROTOTYPES = YES; 545 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 546 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 547 | CLANG_WARN_UNREACHABLE_CODE = YES; 548 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 549 | COPY_PHASE_STRIP = NO; 550 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 551 | ENABLE_NS_ASSERTIONS = NO; 552 | ENABLE_STRICT_OBJC_MSGSEND = YES; 553 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 554 | GCC_C_LANGUAGE_STANDARD = gnu17; 555 | GCC_NO_COMMON_BLOCKS = YES; 556 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 557 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 558 | GCC_WARN_UNDECLARED_SELECTOR = YES; 559 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 560 | GCC_WARN_UNUSED_FUNCTION = YES; 561 | GCC_WARN_UNUSED_VARIABLE = YES; 562 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 563 | MTL_ENABLE_DEBUG_INFO = NO; 564 | MTL_FAST_MATH = YES; 565 | SWIFT_COMPILATION_MODE = wholemodule; 566 | }; 567 | name = Release; 568 | }; 569 | 000C927D2BB30EDF00E553D4 /* Debug */ = { 570 | isa = XCBuildConfiguration; 571 | buildSettings = { 572 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 573 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 574 | "ASSETCATALOG_COMPILER_APPICON_NAME[sdk=appletvos*]" = "tvOS Brand Assets"; 575 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 576 | CODE_SIGN_ENTITLEMENTS = LiveViewNativeGo/LiveViewNativeGo.entitlements; 577 | CODE_SIGN_IDENTITY = "Apple Development"; 578 | CODE_SIGN_STYLE = Automatic; 579 | CURRENT_PROJECT_VERSION = 3; 580 | DEVELOPMENT_ASSET_PATHS = "\"LiveViewNativeGo/Preview Content\""; 581 | DEVELOPMENT_TEAM = 8YF596VCP4; 582 | ENABLE_PREVIEWS = YES; 583 | GENERATE_INFOPLIST_FILE = YES; 584 | INFOPLIST_FILE = LiveViewNativeGo/Info.plist; 585 | INFOPLIST_KEY_CFBundleDisplayName = "LVN Go"; 586 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; 587 | INFOPLIST_KEY_NSCameraUsageDescription = "Scan a QR code to connect to a LiveView"; 588 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 589 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; 590 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; 591 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; 592 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; 593 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; 594 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; 595 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; 596 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; 597 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 598 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 599 | IPHONEOS_DEPLOYMENT_TARGET = 17.0; 600 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; 601 | "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; 602 | MACOSX_DEPLOYMENT_TARGET = 14.0; 603 | MARKETING_VERSION = 0.3.1; 604 | PRODUCT_BUNDLE_IDENTIFIER = com.dockyard.LiveViewNativeGo; 605 | PRODUCT_NAME = "$(TARGET_NAME)"; 606 | PROVISIONING_PROFILE_SPECIFIER = ""; 607 | SDKROOT = auto; 608 | SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator macosx xros xrsimulator"; 609 | SUPPORTS_MACCATALYST = NO; 610 | SWIFT_EMIT_LOC_STRINGS = YES; 611 | SWIFT_VERSION = 5.0; 612 | TARGETED_DEVICE_FAMILY = "1,2,3,7"; 613 | TVOS_DEPLOYMENT_TARGET = 18.0; 614 | XROS_DEPLOYMENT_TARGET = 2.0; 615 | }; 616 | name = Debug; 617 | }; 618 | 000C927E2BB30EDF00E553D4 /* Release */ = { 619 | isa = XCBuildConfiguration; 620 | buildSettings = { 621 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 622 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 623 | "ASSETCATALOG_COMPILER_APPICON_NAME[sdk=appletvos*]" = "tvOS Brand Assets"; 624 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 625 | CODE_SIGN_ENTITLEMENTS = LiveViewNativeGo/LiveViewNativeGo.entitlements; 626 | CODE_SIGN_IDENTITY = "Apple Development"; 627 | CODE_SIGN_STYLE = Automatic; 628 | CURRENT_PROJECT_VERSION = 3; 629 | DEVELOPMENT_ASSET_PATHS = "\"LiveViewNativeGo/Preview Content\""; 630 | DEVELOPMENT_TEAM = 8YF596VCP4; 631 | ENABLE_PREVIEWS = YES; 632 | GENERATE_INFOPLIST_FILE = YES; 633 | INFOPLIST_FILE = LiveViewNativeGo/Info.plist; 634 | INFOPLIST_KEY_CFBundleDisplayName = "LVN Go"; 635 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; 636 | INFOPLIST_KEY_NSCameraUsageDescription = "Scan a QR code to connect to a LiveView"; 637 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 638 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; 639 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; 640 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; 641 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; 642 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; 643 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; 644 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; 645 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; 646 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 647 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 648 | IPHONEOS_DEPLOYMENT_TARGET = 17.0; 649 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; 650 | "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; 651 | MACOSX_DEPLOYMENT_TARGET = 14.0; 652 | MARKETING_VERSION = 0.3.1; 653 | PRODUCT_BUNDLE_IDENTIFIER = com.dockyard.LiveViewNativeGo; 654 | PRODUCT_NAME = "$(TARGET_NAME)"; 655 | PROVISIONING_PROFILE_SPECIFIER = ""; 656 | SDKROOT = auto; 657 | SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator macosx xros xrsimulator"; 658 | SUPPORTS_MACCATALYST = NO; 659 | SWIFT_EMIT_LOC_STRINGS = YES; 660 | SWIFT_VERSION = 5.0; 661 | TARGETED_DEVICE_FAMILY = "1,2,3,7"; 662 | TVOS_DEPLOYMENT_TARGET = 18.0; 663 | XROS_DEPLOYMENT_TARGET = 2.0; 664 | }; 665 | name = Release; 666 | }; 667 | 00242EE72C6E513100CC972C /* Debug */ = { 668 | isa = XCBuildConfiguration; 669 | buildSettings = { 670 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 671 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 672 | CODE_SIGN_ENTITLEMENTS = LiveViewNativeGoAppClip/LiveViewNativeGoAppClip.entitlements; 673 | CODE_SIGN_STYLE = Automatic; 674 | CURRENT_PROJECT_VERSION = 1; 675 | DEVELOPMENT_ASSET_PATHS = "\"LiveViewNativeGoAppClip/Preview Content\""; 676 | DEVELOPMENT_TEAM = 8YF596VCP4; 677 | ENABLE_PREVIEWS = YES; 678 | GENERATE_INFOPLIST_FILE = YES; 679 | INFOPLIST_FILE = LiveViewNativeGoAppClip/Info.plist; 680 | INFOPLIST_KEY_CFBundleDisplayName = LiveViewNativeGo; 681 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 682 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 683 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 684 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 685 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 686 | IPHONEOS_DEPLOYMENT_TARGET = 17.5; 687 | LD_RUNPATH_SEARCH_PATHS = ( 688 | "$(inherited)", 689 | "@executable_path/Frameworks", 690 | ); 691 | MARKETING_VERSION = 0.3.1; 692 | PRODUCT_BUNDLE_IDENTIFIER = com.dockyard.LiveViewNativeGo.Clip; 693 | PRODUCT_NAME = "$(TARGET_NAME)"; 694 | SDKROOT = iphoneos; 695 | SWIFT_EMIT_LOC_STRINGS = YES; 696 | SWIFT_VERSION = 5.0; 697 | TARGETED_DEVICE_FAMILY = "1,2"; 698 | }; 699 | name = Debug; 700 | }; 701 | 00242EE82C6E513100CC972C /* Release */ = { 702 | isa = XCBuildConfiguration; 703 | buildSettings = { 704 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 705 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 706 | CODE_SIGN_ENTITLEMENTS = LiveViewNativeGoAppClip/LiveViewNativeGoAppClip.entitlements; 707 | CODE_SIGN_STYLE = Automatic; 708 | CURRENT_PROJECT_VERSION = 1; 709 | DEVELOPMENT_ASSET_PATHS = "\"LiveViewNativeGoAppClip/Preview Content\""; 710 | DEVELOPMENT_TEAM = 8YF596VCP4; 711 | ENABLE_PREVIEWS = YES; 712 | GENERATE_INFOPLIST_FILE = YES; 713 | INFOPLIST_FILE = LiveViewNativeGoAppClip/Info.plist; 714 | INFOPLIST_KEY_CFBundleDisplayName = LiveViewNativeGo; 715 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 716 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 717 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 718 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 719 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 720 | IPHONEOS_DEPLOYMENT_TARGET = 17.5; 721 | LD_RUNPATH_SEARCH_PATHS = ( 722 | "$(inherited)", 723 | "@executable_path/Frameworks", 724 | ); 725 | MARKETING_VERSION = 0.3.1; 726 | PRODUCT_BUNDLE_IDENTIFIER = com.dockyard.LiveViewNativeGo.Clip; 727 | PRODUCT_NAME = "$(TARGET_NAME)"; 728 | SDKROOT = iphoneos; 729 | SWIFT_EMIT_LOC_STRINGS = YES; 730 | SWIFT_VERSION = 5.0; 731 | TARGETED_DEVICE_FAMILY = "1,2"; 732 | VALIDATE_PRODUCT = YES; 733 | }; 734 | name = Release; 735 | }; 736 | /* End XCBuildConfiguration section */ 737 | 738 | /* Begin XCConfigurationList section */ 739 | 000C92682BB30EDD00E553D4 /* Build configuration list for PBXProject "LiveViewNativeGo" */ = { 740 | isa = XCConfigurationList; 741 | buildConfigurations = ( 742 | 000C927A2BB30EDF00E553D4 /* Debug */, 743 | 000C927B2BB30EDF00E553D4 /* Release */, 744 | ); 745 | defaultConfigurationIsVisible = 0; 746 | defaultConfigurationName = Release; 747 | }; 748 | 000C927C2BB30EDF00E553D4 /* Build configuration list for PBXNativeTarget "LVN Go" */ = { 749 | isa = XCConfigurationList; 750 | buildConfigurations = ( 751 | 000C927D2BB30EDF00E553D4 /* Debug */, 752 | 000C927E2BB30EDF00E553D4 /* Release */, 753 | ); 754 | defaultConfigurationIsVisible = 0; 755 | defaultConfigurationName = Release; 756 | }; 757 | 00242EE62C6E513100CC972C /* Build configuration list for PBXNativeTarget "LiveViewNativeGoAppClip" */ = { 758 | isa = XCConfigurationList; 759 | buildConfigurations = ( 760 | 00242EE72C6E513100CC972C /* Debug */, 761 | 00242EE82C6E513100CC972C /* Release */, 762 | ); 763 | defaultConfigurationIsVisible = 0; 764 | defaultConfigurationName = Release; 765 | }; 766 | /* End XCConfigurationList section */ 767 | 768 | /* Begin XCRemoteSwiftPackageReference section */ 769 | 001B1CFC2CF7BC01006D53C9 /* XCRemoteSwiftPackageReference "liveview-native-swiftui-realitykit" */ = { 770 | isa = XCRemoteSwiftPackageReference; 771 | repositoryURL = "https://github.com/liveview-native/liveview-native-swiftui-realitykit"; 772 | requirement = { 773 | kind = upToNextMajorVersion; 774 | minimumVersion = 0.3.1; 775 | }; 776 | }; 777 | 0032557B2CAF29CA0097904C /* XCRemoteSwiftPackageReference "liveview-native-swiftui-charts" */ = { 778 | isa = XCRemoteSwiftPackageReference; 779 | repositoryURL = "https://github.com/liveview-native/liveview-native-swiftui-charts"; 780 | requirement = { 781 | kind = exactVersion; 782 | version = 0.3.0; 783 | }; 784 | }; 785 | 0032557C2CAF29E00097904C /* XCRemoteSwiftPackageReference "liveview-native-swiftui-mapkit" */ = { 786 | isa = XCRemoteSwiftPackageReference; 787 | repositoryURL = "https://github.com/liveview-native/liveview-native-swiftui-mapkit"; 788 | requirement = { 789 | kind = exactVersion; 790 | version = 0.3.0; 791 | }; 792 | }; 793 | 00336C762CEF89330038B915 /* XCRemoteSwiftPackageReference "liveview-client-swiftui" */ = { 794 | isa = XCRemoteSwiftPackageReference; 795 | repositoryURL = "https://github.com/liveview-native/liveview-client-swiftui/"; 796 | requirement = { 797 | kind = upToNextMajorVersion; 798 | minimumVersion = 0.3.1; 799 | }; 800 | }; 801 | 00C48D5B2C6BBA58002B23FF /* XCRemoteSwiftPackageReference "liveview-native-live-form" */ = { 802 | isa = XCRemoteSwiftPackageReference; 803 | repositoryURL = "https://github.com/liveview-native/liveview-native-live-form"; 804 | requirement = { 805 | kind = exactVersion; 806 | version = 0.3.1; 807 | }; 808 | }; 809 | 00CB96302C62886500ADBF08 /* XCRemoteSwiftPackageReference "liveview-native-swiftui-avkit" */ = { 810 | isa = XCRemoteSwiftPackageReference; 811 | repositoryURL = "https://github.com/liveview-native/liveview-native-swiftui-avkit"; 812 | requirement = { 813 | kind = exactVersion; 814 | version = 0.3.0; 815 | }; 816 | }; 817 | /* End XCRemoteSwiftPackageReference section */ 818 | 819 | /* Begin XCSwiftPackageProductDependency section */ 820 | 001B1CFD2CF7BC01006D53C9 /* LiveViewNativeRealityKit */ = { 821 | isa = XCSwiftPackageProductDependency; 822 | package = 001B1CFC2CF7BC01006D53C9 /* XCRemoteSwiftPackageReference "liveview-native-swiftui-realitykit" */; 823 | productName = LiveViewNativeRealityKit; 824 | }; 825 | 00242EF72C6E516500CC972C /* LiveViewNativeAVKit */ = { 826 | isa = XCSwiftPackageProductDependency; 827 | package = 00CB96302C62886500ADBF08 /* XCRemoteSwiftPackageReference "liveview-native-swiftui-avkit" */; 828 | productName = LiveViewNativeAVKit; 829 | }; 830 | 00242EFF2C6E516500CC972C /* LiveViewNativeLiveForm */ = { 831 | isa = XCSwiftPackageProductDependency; 832 | package = 00C48D5B2C6BBA58002B23FF /* XCRemoteSwiftPackageReference "liveview-native-live-form" */; 833 | productName = LiveViewNativeLiveForm; 834 | }; 835 | 0032557D2CAF2FFB0097904C /* LiveViewNativeCharts */ = { 836 | isa = XCSwiftPackageProductDependency; 837 | package = 0032557B2CAF29CA0097904C /* XCRemoteSwiftPackageReference "liveview-native-swiftui-charts" */; 838 | productName = LiveViewNativeCharts; 839 | }; 840 | 0032557F2CAF2FFE0097904C /* LiveViewNativeMapKit */ = { 841 | isa = XCSwiftPackageProductDependency; 842 | package = 0032557C2CAF29E00097904C /* XCRemoteSwiftPackageReference "liveview-native-swiftui-mapkit" */; 843 | productName = LiveViewNativeMapKit; 844 | }; 845 | 003255812CAF30020097904C /* LiveViewNativeCharts */ = { 846 | isa = XCSwiftPackageProductDependency; 847 | package = 0032557B2CAF29CA0097904C /* XCRemoteSwiftPackageReference "liveview-native-swiftui-charts" */; 848 | productName = LiveViewNativeCharts; 849 | }; 850 | 003255832CAF30040097904C /* LiveViewNativeMapKit */ = { 851 | isa = XCSwiftPackageProductDependency; 852 | package = 0032557C2CAF29E00097904C /* XCRemoteSwiftPackageReference "liveview-native-swiftui-mapkit" */; 853 | productName = LiveViewNativeMapKit; 854 | }; 855 | 00336C772CEF89400038B915 /* LiveViewNative */ = { 856 | isa = XCSwiftPackageProductDependency; 857 | package = 00336C762CEF89330038B915 /* XCRemoteSwiftPackageReference "liveview-client-swiftui" */; 858 | productName = LiveViewNative; 859 | }; 860 | 00336C7D2CEFCE6B0038B915 /* LiveViewNativeRealityKit */ = { 861 | isa = XCSwiftPackageProductDependency; 862 | productName = LiveViewNativeRealityKit; 863 | }; 864 | 00C48D5C2C6BBA58002B23FF /* LiveViewNativeLiveForm */ = { 865 | isa = XCSwiftPackageProductDependency; 866 | package = 00C48D5B2C6BBA58002B23FF /* XCRemoteSwiftPackageReference "liveview-native-live-form" */; 867 | productName = LiveViewNativeLiveForm; 868 | }; 869 | 00C48D5F2C6BBA60002B23FF /* LiveViewNativeAVKit */ = { 870 | isa = XCSwiftPackageProductDependency; 871 | package = 00CB96302C62886500ADBF08 /* XCRemoteSwiftPackageReference "liveview-native-swiftui-avkit" */; 872 | productName = LiveViewNativeAVKit; 873 | }; 874 | /* End XCSwiftPackageProductDependency section */ 875 | }; 876 | rootObject = 000C92652BB30EDD00E553D4 /* Project object */; 877 | } 878 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "originHash" : "b8cfef38b65ab52e7c29ba031026ab1f29f0b6ce0a13fa7bb96e517ed832ba79", 3 | "pins" : [ 4 | { 5 | "identity" : "liveview-client-swiftui", 6 | "kind" : "remoteSourceControl", 7 | "location" : "https://github.com/liveview-native/liveview-client-swiftui", 8 | "state" : { 9 | "revision" : "669274b2314862b36a622d52f78eab007769bed9", 10 | "version" : "0.3.1" 11 | } 12 | }, 13 | { 14 | "identity" : "liveview-native-core-swift", 15 | "kind" : "remoteSourceControl", 16 | "location" : "https://github.com/liveview-native/liveview-native-core-swift.git", 17 | "state" : { 18 | "revision" : "339594b395938e38f1fb2216a31c8791030ec9ba", 19 | "version" : "0.2.1" 20 | } 21 | }, 22 | { 23 | "identity" : "liveview-native-live-form", 24 | "kind" : "remoteSourceControl", 25 | "location" : "https://github.com/liveview-native/liveview-native-live-form", 26 | "state" : { 27 | "revision" : "ecedbf941e8818f6ba25ce71e612e3b2371a5039", 28 | "version" : "0.3.1" 29 | } 30 | }, 31 | { 32 | "identity" : "liveview-native-swiftui-avkit", 33 | "kind" : "remoteSourceControl", 34 | "location" : "https://github.com/liveview-native/liveview-native-swiftui-avkit", 35 | "state" : { 36 | "revision" : "964c46d3a225d8822a196614e6317f7341445647", 37 | "version" : "0.3.0" 38 | } 39 | }, 40 | { 41 | "identity" : "liveview-native-swiftui-charts", 42 | "kind" : "remoteSourceControl", 43 | "location" : "https://github.com/liveview-native/liveview-native-swiftui-charts", 44 | "state" : { 45 | "revision" : "e5ffd6d3e55f677f12a976a1b3554f32a328ddf2", 46 | "version" : "0.3.0" 47 | } 48 | }, 49 | { 50 | "identity" : "liveview-native-swiftui-mapkit", 51 | "kind" : "remoteSourceControl", 52 | "location" : "https://github.com/liveview-native/liveview-native-swiftui-mapkit", 53 | "state" : { 54 | "revision" : "5b4e8edfb00c77dda8ed53635c8414451f56bd9e", 55 | "version" : "0.3.0" 56 | } 57 | }, 58 | { 59 | "identity" : "liveview-native-swiftui-realitykit", 60 | "kind" : "remoteSourceControl", 61 | "location" : "https://github.com/liveview-native/liveview-native-swiftui-realitykit", 62 | "state" : { 63 | "revision" : "39e91d394dedb4417c863f2cd4f01f9d48091635", 64 | "version" : "0.3.1" 65 | } 66 | }, 67 | { 68 | "identity" : "swift-argument-parser", 69 | "kind" : "remoteSourceControl", 70 | "location" : "https://github.com/apple/swift-argument-parser", 71 | "state" : { 72 | "revision" : "41982a3656a71c768319979febd796c6fd111d5c", 73 | "version" : "1.5.0" 74 | } 75 | }, 76 | { 77 | "identity" : "swift-async-algorithms", 78 | "kind" : "remoteSourceControl", 79 | "location" : "https://github.com/apple/swift-async-algorithms", 80 | "state" : { 81 | "revision" : "9cfed92b026c524674ed869a4ff2dcfdeedf8a2a", 82 | "version" : "0.1.0" 83 | } 84 | }, 85 | { 86 | "identity" : "swift-case-paths", 87 | "kind" : "remoteSourceControl", 88 | "location" : "https://github.com/pointfreeco/swift-case-paths", 89 | "state" : { 90 | "revision" : "bc92c4b27f9a84bfb498cdbfdf35d5a357e9161f", 91 | "version" : "1.5.6" 92 | } 93 | }, 94 | { 95 | "identity" : "swift-collections", 96 | "kind" : "remoteSourceControl", 97 | "location" : "https://github.com/apple/swift-collections.git", 98 | "state" : { 99 | "revision" : "671108c96644956dddcd89dd59c203dcdb36cec7", 100 | "version" : "1.1.4" 101 | } 102 | }, 103 | { 104 | "identity" : "swift-parsing", 105 | "kind" : "remoteSourceControl", 106 | "location" : "https://github.com/pointfreeco/swift-parsing", 107 | "state" : { 108 | "revision" : "a0e7d73f462c1c38c59dc40a3969ac40cea42950", 109 | "version" : "0.13.0" 110 | } 111 | }, 112 | { 113 | "identity" : "swift-syntax", 114 | "kind" : "remoteSourceControl", 115 | "location" : "https://github.com/swiftlang/swift-syntax.git", 116 | "state" : { 117 | "revision" : "64889f0c732f210a935a0ad7cda38f77f876262d", 118 | "version" : "509.1.1" 119 | } 120 | }, 121 | { 122 | "identity" : "swiftphoenixclient", 123 | "kind" : "remoteSourceControl", 124 | "location" : "https://github.com/davidstump/SwiftPhoenixClient.git", 125 | "state" : { 126 | "revision" : "2ea54b43202b053a1e84529509b91621d5601606", 127 | "version" : "5.3.4" 128 | } 129 | }, 130 | { 131 | "identity" : "swiftsoup", 132 | "kind" : "remoteSourceControl", 133 | "location" : "https://github.com/scinfu/SwiftSoup.git", 134 | "state" : { 135 | "revision" : "0837db354faf9c9deb710dc597046edaadf5360f", 136 | "version" : "2.7.6" 137 | } 138 | }, 139 | { 140 | "identity" : "xctest-dynamic-overlay", 141 | "kind" : "remoteSourceControl", 142 | "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", 143 | "state" : { 144 | "revision" : "a3f634d1a409c7979cabc0a71b3f26ffa9fc8af1", 145 | "version" : "1.4.3" 146 | } 147 | } 148 | ], 149 | "version" : 3 150 | } 151 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo.xcodeproj/xcshareddata/xcschemes/LiveViewNativeGo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 9 | 10 | 16 | 22 | 23 | 24 | 25 | 26 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 60 | 62 | 68 | 69 | 70 | 71 | 73 | 74 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo.xcodeproj/xcshareddata/xcschemes/LiveViewNativeGoAppClip.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 9 | 10 | 16 | 22 | 23 | 24 | 25 | 26 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 58 | 59 | 60 | 61 | 67 | 69 | 75 | 76 | 77 | 78 | 80 | 81 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/128x128.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/128x128@2x.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/16x16.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/16x16@2x.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/256x256.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/256x256@2x.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/32x32.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/32x32@2x.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/512x512.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/512x512@2x.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/AppIcon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/AppIcon.jpg -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "AppIcon.jpg", 5 | "idiom" : "universal", 6 | "platform" : "ios", 7 | "size" : "1024x1024" 8 | }, 9 | { 10 | "filename" : "16x16.png", 11 | "idiom" : "mac", 12 | "scale" : "1x", 13 | "size" : "16x16" 14 | }, 15 | { 16 | "filename" : "16x16@2x.png", 17 | "idiom" : "mac", 18 | "scale" : "2x", 19 | "size" : "16x16" 20 | }, 21 | { 22 | "filename" : "32x32.png", 23 | "idiom" : "mac", 24 | "scale" : "1x", 25 | "size" : "32x32" 26 | }, 27 | { 28 | "filename" : "32x32@2x.png", 29 | "idiom" : "mac", 30 | "scale" : "2x", 31 | "size" : "32x32" 32 | }, 33 | { 34 | "filename" : "128x128.png", 35 | "idiom" : "mac", 36 | "scale" : "1x", 37 | "size" : "128x128" 38 | }, 39 | { 40 | "filename" : "128x128@2x.png", 41 | "idiom" : "mac", 42 | "scale" : "2x", 43 | "size" : "128x128" 44 | }, 45 | { 46 | "filename" : "256x256.png", 47 | "idiom" : "mac", 48 | "scale" : "1x", 49 | "size" : "256x256" 50 | }, 51 | { 52 | "filename" : "256x256@2x.png", 53 | "idiom" : "mac", 54 | "scale" : "2x", 55 | "size" : "256x256" 56 | }, 57 | { 58 | "filename" : "512x512.png", 59 | "idiom" : "mac", 60 | "scale" : "1x", 61 | "size" : "512x512" 62 | }, 63 | { 64 | "filename" : "512x512@2x.png", 65 | "idiom" : "mac", 66 | "scale" : "2x", 67 | "size" : "512x512" 68 | } 69 | ], 70 | "info" : { 71 | "author" : "xcode", 72 | "version" : 1 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Back.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Back.png", 5 | "idiom" : "vision", 6 | "scale" : "2x" 7 | } 8 | ], 9 | "info" : { 10 | "author" : "xcode", 11 | "version" : 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "layers" : [ 7 | { 8 | "filename" : "Front.solidimagestacklayer" 9 | }, 10 | { 11 | "filename" : "Middle.solidimagestacklayer" 12 | }, 13 | { 14 | "filename" : "Back.solidimagestacklayer" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Front(1).png", 5 | "idiom" : "vision", 6 | "scale" : "2x" 7 | } 8 | ], 9 | "info" : { 10 | "author" : "xcode", 11 | "version" : 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Front(1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Front(1).png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Middle.png", 5 | "idiom" : "vision", 6 | "scale" : "2x" 7 | } 8 | ], 9 | "info" : { 10 | "author" : "xcode", 11 | "version" : 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Middle.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Back.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Back.png", 5 | "idiom" : "tv" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "layers" : [ 7 | { 8 | "filename" : "Front.imagestacklayer" 9 | }, 10 | { 11 | "filename" : "Middle.imagestacklayer" 12 | }, 13 | { 14 | "filename" : "Back.imagestacklayer" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Front.png", 5 | "idiom" : "tv" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Front.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Front.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Middle.png", 5 | "idiom" : "tv" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Middle.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Back.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Back@2x.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Back.png", 5 | "idiom" : "tv", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "Back@2x.png", 10 | "idiom" : "tv", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "layers" : [ 7 | { 8 | "filename" : "Front.imagestacklayer" 9 | }, 10 | { 11 | "filename" : "Middle.imagestacklayer" 12 | }, 13 | { 14 | "filename" : "Back.imagestacklayer" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Front.png", 5 | "idiom" : "tv", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "Front@2x.png", 10 | "idiom" : "tv", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Front.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Front.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Front@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Front@2x.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Middle.png", 5 | "idiom" : "tv", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "Middle@2x.png", 10 | "idiom" : "tv", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Middle.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Middle@2x.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "assets" : [ 3 | { 4 | "filename" : "App Icon - App Store.imagestack", 5 | "idiom" : "tv", 6 | "role" : "primary-app-icon", 7 | "size" : "1280x768" 8 | }, 9 | { 10 | "filename" : "App Icon.imagestack", 11 | "idiom" : "tv", 12 | "role" : "primary-app-icon", 13 | "size" : "400x240" 14 | }, 15 | { 16 | "filename" : "Top Shelf Image Wide.imageset", 17 | "idiom" : "tv", 18 | "role" : "top-shelf-image-wide", 19 | "size" : "2320x720" 20 | }, 21 | { 22 | "filename" : "Top Shelf Image.imageset", 23 | "idiom" : "tv", 24 | "role" : "top-shelf-image", 25 | "size" : "1920x720" 26 | } 27 | ], 28 | "info" : { 29 | "author" : "xcode", 30 | "version" : 1 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/Top Shelf Image Wide.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tvOS Top Shelf Image (Wide).png", 5 | "idiom" : "tv", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "tvOS Top Shelf Image (Wide)@2x.png", 10 | "idiom" : "tv", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/Top Shelf Image Wide.imageset/tvOS Top Shelf Image (Wide).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/Top Shelf Image Wide.imageset/tvOS Top Shelf Image (Wide).png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/Top Shelf Image Wide.imageset/tvOS Top Shelf Image (Wide)@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/Top Shelf Image Wide.imageset/tvOS Top Shelf Image (Wide)@2x.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/Top Shelf Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tvOS Top Shelf Image.png", 5 | "idiom" : "tv", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "tvOS Top Shelf Image@2x.png", 10 | "idiom" : "tv", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/Top Shelf Image.imageset/tvOS Top Shelf Image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/Top Shelf Image.imageset/tvOS Top Shelf Image.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/Top Shelf Image.imageset/tvOS Top Shelf Image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGo/Assets.xcassets/tvOS Brand Assets.brandassets/Top Shelf Image.imageset/tvOS Top Shelf Image@2x.png -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 3/26/24. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ContentView: View { 11 | @State private var isSettingsOpen = false 12 | 13 | #if os(visionOS) 14 | @Environment(\.openWindow) private var openWindow 15 | @Environment(\.dismissWindow) private var dismissWindow 16 | #endif 17 | 18 | var body: some View { 19 | #if os(tvOS) 20 | TabView { 21 | Tab("Apps", systemImage: "square.on.square") { 22 | NavigationStack { 23 | AppsScreen() 24 | } 25 | } 26 | Tab("Settings", systemImage: "gear") { 27 | NavigationStack { 28 | SettingsScreen() 29 | } 30 | } 31 | Tab("Logs", systemImage: "scroll") { 32 | NavigationStack { 33 | LogsScreen() 34 | } 35 | } 36 | } 37 | .tabViewStyle(.sidebarAdaptable) 38 | #else 39 | NavigationStack { 40 | AppsScreen() 41 | #if os(iOS) 42 | .toolbarTitleMenu { 43 | toolbarItems 44 | } 45 | #else 46 | .toolbar { 47 | toolbarItems 48 | } 49 | #endif 50 | #if os(iOS) || os(visionOS) 51 | .sheet(isPresented: $isSettingsOpen) { 52 | SettingsScreen() 53 | } 54 | #endif 55 | } 56 | #endif 57 | } 58 | 59 | @ViewBuilder 60 | var toolbarItems: some View { 61 | #if os(macOS) 62 | SettingsLink() 63 | #else 64 | Button { 65 | isSettingsOpen = true 66 | } label: { 67 | Label("Settings", systemImage: "gear") 68 | } 69 | #endif 70 | #if os(macOS) 71 | Button { 72 | NSWorkspace.shared.open(.documentation) 73 | } label: { 74 | Label("Documentation", systemImage: "book.closed.fill") 75 | } 76 | #elseif os(visionOS) 77 | Button { 78 | UIApplication.shared.open(.documentation) 79 | } label: { 80 | Label("Documentation", systemImage: "book.closed.fill") 81 | } 82 | #else 83 | Link(destination: .documentation) { 84 | Label("Documentation", systemImage: "book.closed.fill") 85 | } 86 | #endif 87 | #if os(visionOS) 88 | Button { 89 | dismissWindow(id: "logs") 90 | openWindow(id: "logs") 91 | } label: { 92 | Label("Logs", systemImage: "scroll") 93 | } 94 | #endif 95 | } 96 | } 97 | 98 | #Preview { 99 | ContentView() 100 | .environment(Settings()) 101 | } 102 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Helpers/Constants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Constants.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 8/6/24. 6 | // 7 | 8 | import Foundation 9 | 10 | extension URL { 11 | static var documentation: Self { 12 | URL(string: "https://hexdocs.pm/live_view_native_swiftui/index.html")! 13 | } 14 | 15 | static var liveForm: Self { 16 | URL(string: "https://github.com/liveview-native/liveview-native-live-form")! 17 | } 18 | 19 | static var avKit: Self { 20 | URL(string: "https://github.com/liveview-native/liveview-native-swiftui-avkit")! 21 | } 22 | 23 | static var charts: Self { 24 | URL(string: "https://github.com/liveview-native/liveview-native-swiftui-charts")! 25 | } 26 | 27 | static var mapKit: Self { 28 | URL(string: "https://github.com/liveview-native/liveview-native-swiftui-mapkit")! 29 | } 30 | 31 | static var realityKit: Self { 32 | URL(string: "https://github.com/liveview-native/liveview-native-swiftui-realitykit")! 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Helpers/DataScannerView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DataScannerView.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 5/14/24. 6 | // 7 | 8 | #if os(iOS) 9 | import SwiftUI 10 | import VisionKit 11 | 12 | /// A View that scans for codes. 13 | /// 14 | /// A binding is updated with the recognized items, 15 | /// and an action performed when a scanned item is tapped. 16 | struct DataScannerView: UIViewControllerRepresentable { 17 | @Binding var items: [RecognizedItem] 18 | 19 | var recognizedDataTypes: Set 20 | var qualityLevel: DataScannerViewController.QualityLevel = .balanced 21 | var recognizesMultipleItems: Bool = false 22 | var isHighFrameRateTrackingEnabled: Bool = true 23 | var isPinchToZoomEnabled: Bool = true 24 | var isGuidanceEnabled: Bool = true 25 | var isHighlightingEnabled: Bool = false 26 | 27 | let onTap: (RecognizedItem) -> () 28 | 29 | func makeUIViewController(context: Context) -> DataScannerViewController { 30 | let controller = DataScannerViewController( 31 | recognizedDataTypes: recognizedDataTypes, 32 | qualityLevel: qualityLevel, 33 | recognizesMultipleItems: recognizesMultipleItems, 34 | isHighFrameRateTrackingEnabled: isHighFrameRateTrackingEnabled, 35 | isPinchToZoomEnabled: isPinchToZoomEnabled, 36 | isGuidanceEnabled: isGuidanceEnabled, 37 | isHighlightingEnabled: isHighlightingEnabled 38 | ) 39 | controller.delegate = context.coordinator 40 | try? controller.startScanning() 41 | return controller 42 | } 43 | 44 | func updateUIViewController(_ uiViewController: DataScannerViewController, context: Context) { 45 | try? uiViewController.startScanning() 46 | } 47 | 48 | func makeCoordinator() -> Coordinator { 49 | Coordinator(items: $items, onTap: onTap) 50 | } 51 | 52 | class Coordinator: DataScannerViewControllerDelegate { 53 | @Binding var items: [RecognizedItem] 54 | let onTap: (RecognizedItem) -> () 55 | 56 | init( 57 | items: Binding<[RecognizedItem]>, 58 | onTap: @escaping (RecognizedItem) -> Void 59 | ) { 60 | self._items = items 61 | self.onTap = onTap 62 | } 63 | 64 | func dataScanner(_ dataScanner: DataScannerViewController, didTapOn item: RecognizedItem) { 65 | onTap(item) 66 | } 67 | 68 | func dataScanner(_ dataScanner: DataScannerViewController, didUpdate updatedItems: [RecognizedItem], allItems: [RecognizedItem]) { 69 | items = updatedItems 70 | } 71 | } 72 | } 73 | #endif 74 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Helpers/QuickActions/QuickActionsCommands.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QuickActionsCommands.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 8/13/24. 6 | // 7 | 8 | #if !os(tvOS) && !os(visionOS) 9 | import SwiftUI 10 | 11 | struct QuickActionsCommands: Commands { 12 | @FocusedValue(\.focusedApp) var focusedApp 13 | 14 | @Environment(\.dismissWindow) private var dismissWindow 15 | @Environment(\.openWindow) private var openWindow 16 | 17 | var body: some Commands { 18 | if let focusedApp { 19 | CommandMenu("LiveView") { 20 | Button("Reset...") { 21 | dismissWindow(value: focusedApp) 22 | openWindow(value: SelectedApp(url: focusedApp.url, id: UUID())) 23 | } 24 | .keyboardShortcut("r") 25 | Button("Logs") { 26 | openWindow(id: "logs") 27 | } 28 | } 29 | } 30 | } 31 | } 32 | 33 | extension FocusedValues { 34 | var focusedApp: SelectedApp? { 35 | get { self[FocusedAppKey.self] } 36 | set { self[FocusedAppKey.self] = newValue } 37 | } 38 | 39 | private enum FocusedAppKey: FocusedValueKey { 40 | typealias Value = SelectedApp 41 | } 42 | } 43 | #endif 44 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Helpers/QuickActions/QuickActionsModifier.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QuickActionsModifier.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 8/13/24. 6 | // 7 | 8 | import SwiftUI 9 | import TipKit 10 | 11 | struct QuickActionsModifier: ViewModifier { 12 | let app: SelectedApp 13 | @Binding var selection: SelectedApp? 14 | 15 | @State private var isPresented = false 16 | @State private var isSettingsOpen = false 17 | @State private var isLogsOpen = false 18 | 19 | @Environment(Settings.self) private var settings 20 | 21 | @Environment(\.horizontalSizeClass) private var horizontalSizeClass 22 | 23 | let tip = QuickActionsTip() 24 | 25 | func body(content: Content) -> some View { 26 | content 27 | #if os(iOS) 28 | .onShakeGesture { 29 | isPresented = true 30 | tip.invalidate(reason: .actionPerformed) 31 | } 32 | .inspector(isPresented: $isLogsOpen) { 33 | LogsScreen() 34 | .navigationTitle("Logs") 35 | } 36 | .safeAreaInset(edge: .bottom) { 37 | TipView(tip) 38 | .tipBackground(.ultraThinMaterial) 39 | .shadow(radius: 16) 40 | .padding() 41 | } 42 | #endif 43 | .quickActionsDialog(sizeClass: horizontalSizeClass ?? .regular, isPresented: $isPresented) { 44 | actions 45 | } 46 | .sheet(isPresented: $isSettingsOpen) { 47 | SettingsScreen() 48 | } 49 | } 50 | 51 | @ViewBuilder 52 | var actions: some View { 53 | Button("Settings") { 54 | isSettingsOpen = true 55 | } 56 | Button("Logs") { 57 | isLogsOpen = true 58 | } 59 | Button("Reset LiveView") { 60 | selection = app.withUniqueID() 61 | } 62 | Button("Disconnect", role: .destructive) { 63 | selection = nil 64 | } 65 | Button("Cancel", role: .cancel) {} 66 | } 67 | } 68 | 69 | fileprivate extension View { 70 | @ViewBuilder 71 | func quickActionsDialog(sizeClass: UserInterfaceSizeClass, isPresented: Binding, @ViewBuilder actions: () -> some View) -> some View { 72 | switch sizeClass { 73 | case .compact: 74 | self.confirmationDialog("Quick Actions", isPresented: isPresented, titleVisibility: .visible) { 75 | actions() 76 | } 77 | default: 78 | self.alert("Quick Actions", isPresented: isPresented) { 79 | actions() 80 | } 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Helpers/ShakeGesture.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShakeGesture.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 5/9/24. 6 | // 7 | 8 | #if os(iOS) 9 | import SwiftUI 10 | 11 | extension Notification.Name { 12 | static let deviceDidShakeNotification = Notification.Name(rawValue: "deviceDidShakeNotification") 13 | } 14 | 15 | extension UIWindow { 16 | open override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) { 17 | if motion == .motionShake { 18 | NotificationCenter.default.post(name: .deviceDidShakeNotification, object: nil) 19 | } 20 | } 21 | } 22 | 23 | struct OnShakeGestureModifier: ViewModifier { 24 | let action: () -> Void 25 | 26 | func body(content: Content) -> some View { 27 | content 28 | .onReceive(NotificationCenter.default.publisher(for: .deviceDidShakeNotification)) { _ in 29 | action() 30 | } 31 | } 32 | } 33 | 34 | extension View { 35 | /// Perform an action when the device is shaken. 36 | func onShakeGesture(perform action: @escaping () -> Void) -> some View { 37 | self.modifier(OnShakeGestureModifier(action: action)) 38 | } 39 | } 40 | #endif 41 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Helpers/URL+replacing.swift: -------------------------------------------------------------------------------- 1 | // 2 | // URL+replacing.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 10/3/24. 6 | // 7 | 8 | import Foundation 9 | 10 | extension URL { 11 | func replacing(path: String) -> Self { 12 | var components = URLComponents(url: self, resolvingAgainstBaseURL: true)! 13 | components.path = path 14 | return components.url! 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/LiveViewNativeGo.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | com.apple.security.network.client 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/LiveViewNativeGoApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LiveViewNativeGoApp.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 3/26/24. 6 | // 7 | 8 | import SwiftUI 9 | import TipKit 10 | 11 | @main 12 | struct LiveViewNativeGoApp: App { 13 | @State private var settings = Settings() 14 | @Environment(\.dynamicTypeSize) private var dynamicType 15 | 16 | #if os(macOS) || os(visionOS) 17 | @Environment(\.openWindow) private var openWindow 18 | #endif 19 | 20 | #if os(macOS) 21 | @NSApplicationDelegateAdaptor(AppDelegate.self) var delegate 22 | #endif 23 | 24 | init() { 25 | do { 26 | #if DEBUG 27 | try Tips.resetDatastore() 28 | #endif 29 | try Tips.configure() 30 | } catch { 31 | print("Error configuring tips: \(error)") 32 | } 33 | } 34 | 35 | var body: some Scene { 36 | // Shared Windows 37 | WindowGroup { 38 | ContentView() 39 | #if os(macOS) 40 | .task { 41 | delegate.openWindow = openWindow 42 | delegate.settings = settings 43 | } 44 | .onChange(of: settings.recentApps, initial: true) { _, newRecentApps in 45 | delegate.updateDockMenu(newRecentApps) 46 | } 47 | #endif 48 | } 49 | .environment(settings) 50 | #if os(macOS) 51 | .commands { 52 | CommandGroup(replacing: .newItem) {} 53 | } 54 | #endif 55 | #if os(visionOS) 56 | .defaultSize(width: 600, height: 400) 57 | #endif 58 | 59 | // macOS Windows 60 | #if os(macOS) 61 | WindowGroup(for: SelectedApp.self) { $app in 62 | if let app { 63 | app.makeLiveView(settings: settings, dynamicType: dynamicType) 64 | .environment(settings) 65 | .focusedSceneValue(\.focusedApp, app) 66 | } 67 | } 68 | .commands { 69 | QuickActionsCommands() 70 | } 71 | 72 | SwiftUI.Settings { 73 | SettingsScreen() 74 | } 75 | .environment(settings) 76 | 77 | SwiftUI.Window(Text("Logs"), id: "logs") { 78 | LogsScreen() 79 | } 80 | #endif 81 | 82 | // visionOS Windows 83 | #if os(visionOS) 84 | WindowGroup(id: SelectedApp.LaunchStyle.plain.rawValue, for: SelectedApp.self) { $app in 85 | if let app { 86 | app.makeLiveView(settings: settings, dynamicType: dynamicType) 87 | .environment(settings) 88 | .handlesExternalEvents(preferring: [], allowing: []) 89 | } 90 | } 91 | .defaultWindowPlacement { content, context in 92 | WindowPlacement(.leading(context.windows.first!)) 93 | } 94 | 95 | WindowGroup(id: SelectedApp.LaunchStyle.volumetric.rawValue, for: SelectedApp.self) { $app in 96 | if let app { 97 | app.makeLiveView(settings: settings, dynamicType: dynamicType) 98 | .environment(settings) 99 | .handlesExternalEvents(preferring: [], allowing: []) 100 | } 101 | } 102 | .windowStyle(.volumetric) 103 | .defaultWindowPlacement { content, context in 104 | WindowPlacement(.leading(context.windows.first!)) 105 | } 106 | 107 | ImmersiveSpace(id: SelectedApp.LaunchStyle.immersiveSpace.rawValue, for: SelectedApp.self) { $app in 108 | if let app { 109 | app.makeLiveView(settings: settings, dynamicType: dynamicType) 110 | .environment(settings) 111 | } 112 | } 113 | 114 | WindowGroup(id: "logs") { 115 | NavigationStack { 116 | LogsScreen() 117 | .navigationTitle("Logs") 118 | } 119 | .handlesExternalEvents(preferring: [], allowing: []) 120 | } 121 | .defaultSize(width: 600, height: 800) 122 | .defaultWindowPlacement { content, context in 123 | WindowPlacement(.trailing(context.windows.first!)) 124 | } 125 | #endif 126 | } 127 | } 128 | 129 | #if os(macOS) 130 | class AppDelegate: NSObject, NSApplicationDelegate { 131 | var openWindow: OpenWindowAction! 132 | weak var settings: Settings? 133 | 134 | func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 135 | return true 136 | } 137 | 138 | let dockMenu = NSMenu() 139 | 140 | func updateDockMenu(_ recentApps: [SelectedApp]) { 141 | dockMenu.removeAllItems() 142 | dockMenu.addItem(.sectionHeader(title: "Recents")) 143 | for app in recentApps.reversed() { 144 | let item = NSMenuItem( 145 | title: (app.url as NSURL).resourceSpecifier.flatMap({ String($0.dropFirst(2)) }) ?? app.url.absoluteString, 146 | action: #selector(openRecentApp(_:)), 147 | keyEquivalent: "" 148 | ) 149 | item.representedObject = app.url as NSURL 150 | dockMenu.addItem(item) 151 | } 152 | dockMenu.addItem(.separator()) 153 | dockMenu.addItem( 154 | withTitle: "Clear Recents", 155 | action: #selector(clearRecentApps(_:)), 156 | keyEquivalent: "" 157 | ) 158 | } 159 | 160 | func applicationDockMenu(_ sender: NSApplication) -> NSMenu? { 161 | return dockMenu 162 | } 163 | 164 | @objc func openRecentApp(_ sender: NSMenuItem) { 165 | guard let url = sender.representedObject as? NSURL 166 | else { return } 167 | let app = SelectedApp(url: url as URL, id: UUID()) 168 | openWindow(value: app) 169 | settings?.recentApps += [app] 170 | } 171 | 172 | @objc func clearRecentApps(_ sender: NSMenuItem) { 173 | settings?.recentApps = [] 174 | } 175 | } 176 | #endif 177 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Model/Logs.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Logs.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 10/22/24. 6 | // 7 | 8 | import SwiftUI 9 | import OSLog 10 | import Combine 11 | 12 | @Observable final class Logs { 13 | private var store: OSLogStore! 14 | private var cancellable: AnyCancellable? 15 | 16 | var startDate: Date? 17 | 18 | var logs = Array.Element>() 19 | 20 | init() { 21 | if let store = try? OSLogStore(scope: .currentProcessIdentifier) { 22 | self.store = store 23 | let predicate = NSPredicate(format: "subsystem IN %@", [ 24 | "LiveViewNative", 25 | "com.dockyard.LiveViewNativeGo" 26 | ]) 27 | self.cancellable = Timer 28 | .publish(every: 1, on: .current, in: .default) 29 | .autoconnect() 30 | .sink { date in 31 | Task { [weak self] in 32 | guard let self 33 | else { return } 34 | let position = self.startDate.flatMap({ self.store.position(date: $0) }) 35 | let logs = try self.store.getEntries(at: position, matching: predicate) 36 | var logEntryLogs = logs.compactMap({ $0 as? OSLogEntryLog }) 37 | if let startDate = self.startDate { 38 | logEntryLogs = logEntryLogs.filter({ 39 | $0.date >= startDate 40 | }) 41 | } 42 | self.logs = Array(logEntryLogs.enumerated()) 43 | } 44 | } 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Model/Settings.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Settings.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 3/26/24. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @Observable final class Settings { 11 | var colorScheme: ColorScheme? { 12 | get { 13 | access(keyPath: \.colorScheme) 14 | return (_ColorScheme(rawValue: UserDefaults.standard.integer(forKey: "colorScheme")) ?? .light).value 15 | } 16 | set { 17 | withMutation(keyPath: \.colorScheme) { 18 | UserDefaults.standard.setValue(_ColorScheme(from: newValue).rawValue, forKey: "colorScheme") 19 | } 20 | } 21 | } 22 | 23 | var dynamicTypeEnabled: Bool { 24 | get { 25 | access(keyPath: \.dynamicTypeEnabled) 26 | return UserDefaults.standard.bool(forKey: "dynamicTypeEnabled") 27 | } 28 | set { 29 | withMutation(keyPath: \.dynamicTypeEnabled) { 30 | UserDefaults.standard.setValue(newValue, forKey: "dynamicTypeEnabled") 31 | } 32 | } 33 | } 34 | 35 | var dynamicType: DynamicTypeSize { 36 | get { 37 | access(keyPath: \.dynamicType) 38 | return DynamicTypeSize.allCases[UserDefaults.standard.integer(forKey: "dynamicType")] 39 | } 40 | set { 41 | guard let index = DynamicTypeSize.allCases.firstIndex(of: newValue) 42 | else { return } 43 | withMutation(keyPath: \.dynamicType) { 44 | UserDefaults.standard.setValue(index, forKey: "dynamicType") 45 | } 46 | } 47 | } 48 | 49 | var recentApps: [SelectedApp] { 50 | get { 51 | access(keyPath: \.recentApps) 52 | return UserDefaults.standard.data(forKey: "recentApps") 53 | .flatMap({ try? JSONDecoder().decode([SelectedApp].self, from: $0) }) 54 | ?? [] 55 | } 56 | set { 57 | withMutation(keyPath: \.recentApps) { 58 | // remove duplicates 59 | guard let apps = try? JSONEncoder().encode(newValue.reduce(into: [SelectedApp]()) { partialResult, app in 60 | partialResult.removeAll(where: { $0.url.absoluteString == app.url.absoluteString }) 61 | partialResult.append(app) 62 | }) 63 | else { return } 64 | UserDefaults.standard.setValue(apps, forKey: "recentApps") 65 | } 66 | } 67 | } 68 | 69 | enum _ColorScheme: Int { 70 | case system 71 | case light 72 | case dark 73 | 74 | init(from value: ColorScheme?) { 75 | switch value { 76 | case .none: 77 | self = .system 78 | case .light: 79 | self = .light 80 | case .dark: 81 | self = .dark 82 | @unknown default: 83 | self = .light 84 | } 85 | } 86 | 87 | var value: ColorScheme? { 88 | switch self { 89 | case .system: 90 | return nil 91 | case .light: 92 | return .light 93 | case .dark: 94 | return .dark 95 | } 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Phase Views/ConnectingView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConnectingView.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 8/8/24. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ConnectingView: View { 11 | let url: URL 12 | 13 | var body: some View { 14 | ProgressView(url.absoluteString) 15 | } 16 | } 17 | 18 | #Preview { 19 | ConnectingView(url: URL(string: "http://localhost:4000")!) 20 | } 21 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Phase Views/DisconnectedView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DisconnectedView.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 8/8/24. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct DisconnectedView: View { 11 | var body: some View { 12 | ContentUnavailableView { 13 | Label("No Connection", systemImage: "network.slash") 14 | } description: { 15 | Text("The app will reconnect when network connection is regained.") 16 | } 17 | } 18 | } 19 | 20 | #Preview { 21 | DisconnectedView() 22 | } 23 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Phase Views/ErrorView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ErrorView.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 8/8/24. 6 | // 7 | 8 | import SwiftUI 9 | import LiveViewNative 10 | 11 | struct ErrorView: View { 12 | let error: Error 13 | 14 | @Environment(\.reconnectLiveView) private var reconnectLiveView 15 | 16 | var body: some View { 17 | LiveErrorView(error: error) { 18 | if #available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) { 19 | ContentUnavailableView { 20 | Label("Connection Failed", systemImage: "network.slash") 21 | } description: { 22 | description 23 | } actions: { 24 | actions 25 | } 26 | } else { 27 | VStack { 28 | Label("Connection Failed", systemImage: "network.slash") 29 | .font(.headline) 30 | description 31 | .foregroundStyle(.secondary) 32 | actions 33 | } 34 | } 35 | } 36 | } 37 | 38 | @ViewBuilder 39 | var description: some View { 40 | #if DEBUG 41 | ScrollView { 42 | Text(error.localizedDescription) 43 | .font(.caption.monospaced()) 44 | .multilineTextAlignment(.leading) 45 | } 46 | #else 47 | Text("The app will reconnect when network connection is regained.") 48 | #endif 49 | } 50 | 51 | @ViewBuilder 52 | var actions: some View { 53 | Button { 54 | #if os(iOS) 55 | UIPasteboard.general.string = error.localizedDescription 56 | #elseif os(macOS) 57 | NSPasteboard.general.setString(error.localizedDescription, forType: .string) 58 | #endif 59 | } label: { 60 | Label("Copy Error", systemImage: "doc.on.doc") 61 | } 62 | #if os(watchOS) 63 | SwiftUI.Button { 64 | Task { 65 | await reconnectLiveView(.restart) 66 | } 67 | } label: { 68 | SwiftUI.Label("Restart", systemImage: "arrow.circlepath") 69 | } 70 | .padding() 71 | #else 72 | Menu { 73 | Button { 74 | Task { 75 | await reconnectLiveView(.automatic) 76 | } 77 | } label: { 78 | Label("Reconnect this page", systemImage: "arrow.2.circlepath") 79 | } 80 | Button { 81 | Task { 82 | await reconnectLiveView(.restart) 83 | } 84 | } label: { 85 | Label("Restart from root", systemImage: "arrow.circlepath") 86 | } 87 | } label: { 88 | Label("Reconnect", systemImage: "arrow.2.circlepath") 89 | } 90 | .padding() 91 | #endif 92 | } 93 | } 94 | 95 | #Preview { 96 | ErrorView(error: LiveConnectionError.initialParseError(missingOrInvalid: .csrfToken)) 97 | } 98 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Phase Views/ReconnectingView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ReconnectingView.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 8/8/24. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ReconnectingView: View { 11 | let isReconnecting: Bool 12 | @ViewBuilder let content: Content 13 | 14 | var body: some View { 15 | content 16 | .frame(maxWidth: .infinity, maxHeight: .infinity) 17 | .overlay(alignment: .top) { 18 | if isReconnecting { 19 | VStack { 20 | Label("No Connection", systemImage: "wifi.slash") 21 | .bold() 22 | Text("Reconnecting") 23 | .foregroundStyle(.secondary) 24 | } 25 | .font(.caption) 26 | .padding(8) 27 | .frame(maxWidth: .infinity) 28 | #if os(watchOS) 29 | .background(.background) 30 | #else 31 | .background(.regularMaterial) 32 | #endif 33 | .transition(.move(edge: .top).combined(with: .opacity)) 34 | } 35 | } 36 | .animation(.default, value: isReconnecting) 37 | } 38 | } 39 | 40 | #Preview { 41 | struct PreviewView: View { 42 | @State private var isReconnecting = true 43 | 44 | var body: some View { 45 | ReconnectingView(isReconnecting: isReconnecting) { 46 | Toggle("Reconnecting", isOn: $isReconnecting) 47 | } 48 | } 49 | } 50 | return PreviewView() 51 | } 52 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Screens/AppsScreen.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppsScreen.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 3/26/24. 6 | // 7 | 8 | import SwiftUI 9 | import Foundation 10 | #if os(iOS) 11 | import VisionKit 12 | #endif 13 | import LiveViewNative 14 | import LiveViewNativeLiveForm 15 | import LiveViewNativeAVKit 16 | import LiveViewNativeCharts 17 | #if !os(tvOS) 18 | import LiveViewNativeMapKit 19 | #endif 20 | #if os(visionOS) 21 | import LiveViewNativeRealityKit 22 | #endif 23 | import TipKit 24 | 25 | /// The current app to display, with a unique ID for each instance of this app launched. 26 | struct SelectedApp: Identifiable, Hashable, Codable { 27 | let url: URL 28 | let id: UUID 29 | 30 | #if os(visionOS) 31 | let launchStyle: LaunchStyle 32 | 33 | enum LaunchStyle: String, Hashable, Codable, CustomStringConvertible { 34 | case plain 35 | case volumetric 36 | case immersiveSpace 37 | 38 | var description: String { 39 | switch self { 40 | case .plain: 41 | "Plain" 42 | case .volumetric: 43 | "Volumetric" 44 | case .immersiveSpace: 45 | "Immersive Space" 46 | } 47 | } 48 | } 49 | #endif 50 | 51 | @ViewBuilder 52 | func makeLiveView(settings: Settings, dynamicType: DynamicTypeSize) -> some View { 53 | #if os(tvOS) 54 | let view: AnyView = #LiveView( 55 | url, 56 | addons: [.liveForm, .avKit, .charts] 57 | ) { 58 | ConnectingView(url: url) 59 | } disconnected: { 60 | DisconnectedView() 61 | } reconnecting: { content, isReconnecting in 62 | ReconnectingView(isReconnecting: isReconnecting) { 63 | content 64 | } 65 | } error: { error in 66 | ErrorView(error: error) 67 | } 68 | #elseif os(visionOS) 69 | let view: AnyView = #LiveView( 70 | url, 71 | addons: [.liveForm, .avKit, .charts, .mapKit, .realityKit] 72 | ) { 73 | ConnectingView(url: url) 74 | } disconnected: { 75 | DisconnectedView() 76 | } reconnecting: { content, isReconnecting in 77 | ReconnectingView(isReconnecting: isReconnecting) { 78 | content 79 | } 80 | } error: { error in 81 | ErrorView(error: error) 82 | } 83 | #else 84 | let view: AnyView = #LiveView( 85 | url, 86 | addons: [.liveForm, .avKit, .charts, .mapKit] 87 | ) { 88 | ConnectingView(url: url) 89 | } disconnected: { 90 | DisconnectedView() 91 | } reconnecting: { content, isReconnecting in 92 | ReconnectingView(isReconnecting: isReconnecting) { 93 | content 94 | } 95 | } error: { error in 96 | ErrorView(error: error) 97 | } 98 | #endif 99 | 100 | view 101 | .preferredColorScheme(settings.colorScheme) 102 | .dynamicTypeSize(settings.dynamicTypeEnabled ? settings.dynamicType : dynamicType) 103 | .environment(settings) 104 | } 105 | 106 | func withUniqueID() -> Self { 107 | #if os(visionOS) 108 | Self(url: url, id: UUID(), launchStyle: launchStyle) 109 | #else 110 | Self(url: url, id: UUID()) 111 | #endif 112 | } 113 | } 114 | 115 | /// A tip on accessing quick actions. 116 | struct QuickActionsTip: Tip { 117 | var title: Text { 118 | Text("Quick Actions") 119 | } 120 | 121 | var message: Text? { 122 | Text("Shake your device to access quick actions.") 123 | } 124 | 125 | var image: Image? { 126 | Image(systemName: "iphone.gen2.radiowaves.left.and.right") 127 | } 128 | } 129 | 130 | /// The app scanning and rendering screen. 131 | struct AppsScreen: View { 132 | @State private var selection: SelectedApp? 133 | 134 | @State private var showCodeScanner: Bool = false 135 | 136 | @AppStorage("customURL") private var inputURL: String = "" 137 | 138 | @Environment(Settings.self) private var settings 139 | 140 | @Environment(\.dynamicTypeSize) private var dynamicType 141 | 142 | #if os(macOS) || os(visionOS) 143 | @Environment(\.openWindow) private var openWindow 144 | #endif 145 | #if os(visionOS) 146 | @Environment(\.openImmersiveSpace) private var openImmersiveSpace 147 | #endif 148 | 149 | var body: some View { 150 | #if os(iOS) 151 | List { 152 | Section { 153 | if settings.recentApps.isEmpty { 154 | Text("No recent apps connected.") 155 | } 156 | ForEach(settings.recentApps.reversed(), id: \.self) { app in 157 | Button { 158 | let app = app.withUniqueID() 159 | selection = app 160 | settings.recentApps += [app] 161 | } label: { 162 | Label { 163 | Text((app.url as NSURL).resourceSpecifier.flatMap({ String($0.dropFirst(2)) }) ?? app.url.absoluteString) 164 | } icon: { 165 | AsyncImage(url: app.url.replacing(path: "/apple-touch-icon.png")) { phase in 166 | switch phase { 167 | case .success(let image): 168 | image 169 | .resizable() 170 | case .failure: 171 | AsyncImage(url: app.url.replacing(path: "/favicon.ico")) { phase in 172 | switch phase { 173 | case .success(let image): 174 | image 175 | .resizable() 176 | default: 177 | Rectangle() 178 | .fill(.quaternary) 179 | } 180 | } 181 | default: 182 | Rectangle() 183 | .fill(.quaternary) 184 | } 185 | } 186 | .frame(width: 30, height: 30) 187 | .clipShape(.rect(cornerRadius: 8, style: .continuous)) 188 | } 189 | } 190 | } 191 | } header: { 192 | HStack { 193 | Text("Recents") 194 | Spacer() 195 | Button("Clear") { 196 | settings.recentApps = [] 197 | } 198 | .controlSize(.mini) 199 | } 200 | } 201 | } 202 | .safeAreaInset(edge: .bottom) { 203 | VStack { 204 | Divider() 205 | VStack { 206 | Button { 207 | showCodeScanner = true 208 | } label: { 209 | Label("Scan QR Code", systemImage: "qrcode") 210 | .frame(maxWidth: .infinity) 211 | } 212 | .buttonStyle(.borderedProminent) 213 | .controlSize(.extraLarge) 214 | .sheet(isPresented: $showCodeScanner) { 215 | NavigationStack { 216 | LiveViewCodeScanner { url in 217 | showCodeScanner = false 218 | let app = SelectedApp(url: url, id: UUID()) 219 | selection = app 220 | settings.recentApps += [app] 221 | } 222 | } 223 | } 224 | 225 | HStack { 226 | VStack { Divider() } 227 | Text("OR") 228 | .font(.caption) 229 | .foregroundStyle(.separator) 230 | VStack { Divider() } 231 | } 232 | .padding(.vertical) 233 | 234 | HStack { 235 | TextField("Enter URL", text: $inputURL) 236 | .autocorrectionDisabled() 237 | .textInputAutocapitalization(.never) 238 | .keyboardType(.URL) 239 | .textFieldStyle(.roundedBorder) 240 | Button { 241 | guard let url = URL(string: appendingScheme(to: inputURL)) 242 | else { return } 243 | let app = SelectedApp(url: url, id: UUID()) 244 | selection = app 245 | settings.recentApps += [app] 246 | } label: { 247 | Label("Launch", systemImage: "arrow.up.right.square.fill") 248 | } 249 | .tint(Color.accentColor) 250 | .disabled(inputURL.isEmpty) 251 | } 252 | } 253 | .padding() 254 | .buttonStyle(.bordered) 255 | } 256 | .background(ignoresSafeAreaEdges: .bottom) 257 | } 258 | .navigationTitle("LVN Go") 259 | .navigationBarTitleDisplayMode(.inline) 260 | // display the selected app 261 | .fullScreenCover(item: $selection) { app in 262 | app.makeLiveView(settings: settings, dynamicType: dynamicType) 263 | .modifier(QuickActionsModifier(app: app, selection: $selection)) 264 | } 265 | .onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { activity in 266 | guard selection == nil, 267 | let webpageURL = activity.webpageURL, 268 | let components = URLComponents(url: webpageURL, resolvingAgainstBaseURL: true), 269 | let liveViewURL = components.queryItems? 270 | .first(where: { $0.name == "liveview" }) 271 | .flatMap(\.value) 272 | .flatMap(URL.init) 273 | else { return } 274 | let app = SelectedApp(url: liveViewURL, id: .init()) 275 | selection = app 276 | settings.recentApps += [app] 277 | } 278 | #elseif os(macOS) 279 | VStack { 280 | VStack { 281 | TextField("URL", text: $inputURL) 282 | .autocorrectionDisabled() 283 | .textFieldStyle(.roundedBorder) 284 | Button { 285 | guard let url = URL(string: appendingScheme(to: inputURL)) 286 | else { return } 287 | let app = SelectedApp(url: url, id: .init()) 288 | openWindow(value: app) 289 | settings.recentApps += [app] 290 | } label: { 291 | Label("Launch", systemImage: "arrow.up.right.square.fill") 292 | .frame(maxWidth: .infinity) 293 | } 294 | } 295 | Divider() 296 | Button { 297 | let url = URL(string: "http://localhost:4000")! 298 | let app = SelectedApp(url: url, id: .init()) 299 | openWindow(value: app) 300 | settings.recentApps += [app] 301 | } label: { 302 | Label("Launch Local Host", systemImage: "network") 303 | .frame(maxWidth: .infinity) 304 | } 305 | .buttonStyle(.bordered) 306 | } 307 | .controlSize(.extraLarge) 308 | .buttonStyle(.borderedProminent) 309 | .padding() 310 | .navigationTitle("LiveView Native Go") 311 | #elseif os(visionOS) 312 | List { 313 | Section { 314 | if settings.recentApps.isEmpty { 315 | Text("No recent apps connected.") 316 | } 317 | ForEach(settings.recentApps.reversed(), id: \.self) { app in 318 | Button { 319 | let app = app.withUniqueID() 320 | if app.launchStyle == .immersiveSpace { 321 | Task { 322 | await openImmersiveSpace(id: app.launchStyle.rawValue, value: app) 323 | } 324 | } else { 325 | openWindow(id: app.launchStyle.rawValue, value: app) 326 | } 327 | settings.recentApps += [app] 328 | } label: { 329 | Label { 330 | HStack { 331 | Text((app.url as NSURL).resourceSpecifier.flatMap({ String($0.dropFirst(2)) }) ?? app.url.absoluteString) 332 | Spacer() 333 | if app.launchStyle != .plain { 334 | Text(app.launchStyle.description) 335 | .foregroundStyle(.secondary) 336 | } 337 | } 338 | } icon: { 339 | AsyncImage(url: app.url.replacing(path: "/apple-touch-icon.png")) { phase in 340 | switch phase { 341 | case .success(let image): 342 | image 343 | .resizable() 344 | case .failure: 345 | AsyncImage(url: app.url.replacing(path: "/favicon.ico")) { phase in 346 | switch phase { 347 | case .success(let image): 348 | image 349 | .resizable() 350 | default: 351 | Rectangle() 352 | .fill(.quaternary) 353 | } 354 | } 355 | default: 356 | Rectangle() 357 | .fill(.quaternary) 358 | } 359 | } 360 | .frame(width: 30, height: 30) 361 | .clipShape(.rect(cornerRadius: 8, style: .continuous)) 362 | } 363 | } 364 | } 365 | } header: { 366 | HStack { 367 | Text("Recents") 368 | Spacer() 369 | Button("Clear") { 370 | settings.recentApps = [] 371 | } 372 | .controlSize(.mini) 373 | } 374 | } 375 | } 376 | .ornament(attachmentAnchor: .scene(.bottom)) { 377 | HStack { 378 | TextField("URL", text: $inputURL) 379 | .autocorrectionDisabled() 380 | .textFieldStyle(.roundedBorder) 381 | .frame(minWidth: 300, maxWidth: .infinity) 382 | Menu { 383 | Section("Style") { 384 | ForEach([SelectedApp.LaunchStyle.plain, .volumetric, .immersiveSpace], id: \.self) { launchStyle in 385 | Button(launchStyle.description) { 386 | guard let url = URL(string: appendingScheme(to: inputURL)) 387 | else { return } 388 | let app = SelectedApp(url: url, id: .init(), launchStyle: launchStyle) 389 | if launchStyle == .immersiveSpace { 390 | Task { 391 | await openImmersiveSpace(id: launchStyle.rawValue, value: app) 392 | } 393 | } else { 394 | openWindow(id: launchStyle.rawValue, value: app) 395 | } 396 | settings.recentApps += [app] 397 | } 398 | } 399 | } 400 | } label: { 401 | Label("Launch", systemImage: "arrow.up.right.square.fill") 402 | .frame(maxWidth: .infinity) 403 | } primaryAction: { 404 | guard let url = URL(string: appendingScheme(to: inputURL)) 405 | else { return } 406 | let app = SelectedApp(url: url, id: .init(), launchStyle: .plain) 407 | openWindow(id: SelectedApp.LaunchStyle.plain.rawValue, value: app) 408 | settings.recentApps += [app] 409 | } 410 | .buttonBorderShape(.roundedRectangle(radius: 10)) 411 | } 412 | .padding(8) 413 | .glassBackgroundEffect(in: .rect(cornerRadius: 16, style: .continuous)) 414 | } 415 | .navigationTitle("LiveView Native Go") 416 | #else 417 | Group { 418 | if let app = selection { 419 | app.makeLiveView(settings: settings, dynamicType: dynamicType) 420 | .modifier(QuickActionsModifier(app: app, selection: $selection)) 421 | .onExitCommand { 422 | selection = nil 423 | } 424 | } else { 425 | VStack(alignment: .leading) { 426 | Text("") // this makes sure the URL field is not covered by the sidebar. 427 | List { 428 | Section { 429 | if settings.recentApps.isEmpty { 430 | Text("No recent apps connected.") 431 | } 432 | ForEach(settings.recentApps.reversed(), id: \.self) { app in 433 | Button { 434 | let app = app.withUniqueID() 435 | selection = app 436 | settings.recentApps += [app] 437 | } label: { 438 | Label { 439 | Text((app.url as NSURL).resourceSpecifier.flatMap({ String($0.dropFirst(2)) }) ?? app.url.absoluteString) 440 | } icon: { 441 | AsyncImage(url: app.url.replacing(path: "/apple-touch-icon.png")) { phase in 442 | switch phase { 443 | case .success(let image): 444 | image 445 | .resizable() 446 | case .failure: 447 | AsyncImage(url: app.url.replacing(path: "/favicon.ico")) { phase in 448 | switch phase { 449 | case .success(let image): 450 | image 451 | .resizable() 452 | default: 453 | Rectangle() 454 | .fill(.quaternary) 455 | } 456 | } 457 | default: 458 | Rectangle() 459 | .fill(.quaternary) 460 | } 461 | } 462 | .frame(width: 30, height: 30) 463 | .clipShape(.rect(cornerRadius: 8, style: .continuous)) 464 | } 465 | } 466 | } 467 | } header: { 468 | HStack { 469 | Text("Recents") 470 | Spacer() 471 | Button("Clear") { 472 | settings.recentApps = [] 473 | } 474 | } 475 | } 476 | } 477 | .searchable(text: $inputURL, prompt: "URL") 478 | .onSubmit(of: .search) { 479 | guard let url = URL(string: appendingScheme(to: inputURL)) 480 | else { return } 481 | let app = SelectedApp(url: url, id: .init()) 482 | selection = app 483 | settings.recentApps += [app] 484 | } 485 | } 486 | } 487 | } 488 | #endif 489 | } 490 | 491 | func appendingScheme(to inputURL: String) -> String { 492 | inputURL.starts(with: "http://") || inputURL.starts(with: "https://") ? inputURL : "http://\(inputURL)" 493 | } 494 | } 495 | 496 | #Preview { 497 | NavigationStack { 498 | AppsScreen() 499 | } 500 | .environment(Settings()) 501 | } 502 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Screens/LiveViewCodeScanner.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LiveViewCodeScanner.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 10/3/24. 6 | // 7 | 8 | #if os(iOS) 9 | import SwiftUI 10 | import VisionKit 11 | import TipKit 12 | 13 | /// A tip on scanning LiveBook QR codes. 14 | struct QRConnectTip: Tip { 15 | var title: Text { 16 | Text("Connect to LiveBook") 17 | } 18 | 19 | var message: Text? { 20 | Text("Scan the QR code in a LiveView smart cell to connect.") 21 | } 22 | 23 | var image: Image? { 24 | Image(systemName: "qrcode.viewfinder") 25 | } 26 | } 27 | 28 | struct LiveViewCodeScanner: View { 29 | @State private var items: [RecognizedItem] = [] 30 | let onScan: (URL) -> () 31 | 32 | @Environment(\.dismiss) private var dismiss 33 | 34 | var body: some View { 35 | DataScannerView( 36 | items: $items.animation(.default), 37 | recognizedDataTypes: [.barcode(symbologies: [.qr, .microQR])], 38 | isHighlightingEnabled: true 39 | ) { item in 40 | switch item { 41 | case let .barcode(code): 42 | guard let url = code.payloadStringValue.flatMap({ URL(string: $0) }) 43 | else { return } 44 | onScan(url) 45 | default: 46 | print(item) 47 | } 48 | } 49 | .ignoresSafeArea() 50 | .safeAreaInset(edge: .top) { 51 | TipView(QRConnectTip()) 52 | .tipBackground(.ultraThinMaterial) 53 | .shadow(radius: 16) 54 | .padding() 55 | } 56 | .overlay(alignment: .bottom) { 57 | currentScanOverlay 58 | .padding() 59 | } 60 | .toolbarBackground(.visible, for: .navigationBar) 61 | .toolbarColorScheme(.dark, for: .navigationBar) 62 | .navigationTitle("Scan") 63 | .navigationBarTitleDisplayMode(.inline) 64 | .toolbar { 65 | ToolbarItem(placement: .cancellationAction) { 66 | Button("Cancel") { 67 | dismiss() 68 | } 69 | } 70 | } 71 | } 72 | 73 | @ViewBuilder 74 | var currentScanOverlay: some View { 75 | if case let .barcode(code) = items.last, 76 | let payloadStringValue = code.payloadStringValue, 77 | let url = URL(string: payloadStringValue) 78 | { 79 | Button { 80 | onScan(url) 81 | } label: { 82 | Label { 83 | Text(url.host() ?? url.absoluteString) 84 | .font(.caption.monospaced()) 85 | } icon: { 86 | Image(systemName: "arrow.up.right.square.fill") 87 | } 88 | .foregroundStyle(.black) 89 | .padding(2) 90 | .fixedSize(horizontal: true, vertical: false) 91 | } 92 | .compositingGroup() 93 | .shadow(radius: 5) 94 | .buttonStyle(.borderedProminent) 95 | .buttonBorderShape(.capsule) 96 | .controlSize(.mini) 97 | .tint(.yellow) 98 | } 99 | } 100 | } 101 | #endif 102 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Screens/LogsScreen.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogsScreen.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 10/22/24. 6 | // 7 | 8 | import SwiftUI 9 | import OSLog 10 | 11 | struct LogsScreen: View { 12 | @State private var logs = Logs() 13 | @State private var selection: Int? 14 | 15 | let dateFormatter = { 16 | let formatter = DateFormatter() 17 | formatter.dateFormat = "HH:mm:ss.SSS" 18 | return formatter 19 | }() 20 | 21 | var body: some View { 22 | List(logs.logs, id: \.offset, selection: $selection) { entry in 23 | let (_, log) = entry 24 | VStack(alignment: .leading) { 25 | HStack { 26 | Text(log.subsystem) 27 | Spacer() 28 | Text(log.date, formatter: dateFormatter) 29 | } 30 | .foregroundStyle(.secondary) 31 | .font(.caption) 32 | Text(log.composedMessage) 33 | .font(.body.monospaced()) 34 | } 35 | #if os(tvOS) 36 | .focusable() 37 | #endif 38 | #if !os(tvOS) 39 | .contextMenu { 40 | Button("Copy") { 41 | #if os(macOS) 42 | let pasteboard = NSPasteboard.general 43 | pasteboard.declareTypes([.string], owner: nil) 44 | pasteboard.setString(log.composedMessage, forType: .string) 45 | #else 46 | UIPasteboard.general.string = log.composedMessage 47 | #endif 48 | } 49 | } 50 | #endif 51 | .listRowBackground(Group { 52 | switch log.level { 53 | case .error: 54 | Color.red.opacity(0.2) 55 | default: 56 | EmptyView() 57 | } 58 | }) 59 | } 60 | .defaultScrollAnchor(.bottom) 61 | #if os(iOS) 62 | .listStyle(.plain) 63 | #endif 64 | #if os(macOS) 65 | .onCopyCommand { 66 | guard let selection else { return [] } 67 | return [NSItemProvider(object: logs.logs[selection].element.composedMessage as NSString)] 68 | } 69 | #endif 70 | .toolbar { 71 | ToolbarItem(placement: .primaryAction) { 72 | Button { 73 | logs.startDate = .now 74 | logs.logs = [] 75 | } label: { 76 | Image(systemName: "trash") 77 | } 78 | } 79 | } 80 | } 81 | } 82 | 83 | #Preview { 84 | LogsScreen() 85 | } 86 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGo/Screens/SettingsScreen.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsScreen.swift 3 | // LiveViewNativeGo 4 | // 5 | // Created by Carson Katri on 3/26/24. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct SettingsScreen: View { 11 | @Environment(Settings.self) private var settings 12 | @Environment(\.dismiss) private var dismiss 13 | 14 | var body: some View { 15 | @Bindable var settings = settings 16 | NavigationStack { 17 | List { 18 | Section("Device Settings") { 19 | Picker("Appearance", selection: $settings.colorScheme) { 20 | Text("System").tag(ColorScheme?.none) 21 | Text("Light").tag(ColorScheme?.some(.light)) 22 | Text("Dark").tag(ColorScheme?.some(.dark)) 23 | } 24 | } 25 | Section { 26 | Toggle("Use Dynamic Type", isOn: $settings.dynamicTypeEnabled) 27 | #if os(tvOS) 28 | LabeledContent("Dynamic Type Size") { 29 | Picker(selection: $settings.dynamicType) { 30 | ForEach(DynamicTypeSize.allCases, id: \.self) { size in 31 | Text(String(describing: size)) 32 | .tag(size) 33 | } 34 | } label: { 35 | Text("Dynamic Type") 36 | } 37 | .pickerStyle(.menu) 38 | .disabled(!settings.dynamicTypeEnabled) 39 | } 40 | #else 41 | Slider( 42 | value: Binding { 43 | Double(DynamicTypeSize.allCases.firstIndex(of: settings.dynamicType)!) 44 | } set: { 45 | settings.dynamicType = DynamicTypeSize.allCases[Int($0)] 46 | }, 47 | in: Double(DynamicTypeSize.allCases.startIndex)...Double(DynamicTypeSize.allCases.index(before: DynamicTypeSize.allCases.endIndex)), 48 | step: 1 49 | ) { 50 | Text("Dynamic Type") 51 | } 52 | .disabled(!settings.dynamicTypeEnabled) 53 | #endif 54 | } header: { 55 | Text("Dynamic Type") 56 | } footer: { 57 | #if !os(tvOS) 58 | Text(String(describing: settings.dynamicType)) 59 | #endif 60 | } 61 | Section { 62 | Link("Live Form", destination: .liveForm) 63 | Link("AVKit", destination: .avKit) 64 | Link("Swift Charts", destination: .charts) 65 | Link("MapKit", destination: .mapKit) 66 | Link("RealityKit", destination: .realityKit) 67 | } header: { 68 | Text("Included Addons") 69 | } footer: { 70 | Text("Use Xcode to include additional addons") 71 | } 72 | 73 | Section("About") { 74 | LabeledContent("Client Version") { 75 | Text(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "") 76 | #if !os(tvOS) 77 | .textSelection(.enabled) 78 | #endif 79 | } 80 | LabeledContent("Build", value: Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "") 81 | Link("Release Notes", destination: URL(string: "https://github.com/liveview-native/liveview-client-swiftui/releases/tag/\(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "")")!) 82 | } 83 | } 84 | #if os(iOS) || os(visionOS) 85 | .navigationTitle("Settings") 86 | .navigationBarTitleDisplayMode(.inline) 87 | .toolbar { 88 | ToolbarItem(placement: .confirmationAction) { 89 | Button("Done") { 90 | dismiss() 91 | } 92 | } 93 | } 94 | #endif 95 | } 96 | } 97 | } 98 | 99 | #Preview { 100 | struct PreviewView: View { 101 | @State var settings = Settings() 102 | @Environment(\.dynamicTypeSize) private var dynamicType 103 | 104 | var body: some View { 105 | SettingsScreen() 106 | .environment(settings) 107 | .preferredColorScheme(settings.colorScheme) 108 | .dynamicTypeSize(settings.dynamicTypeEnabled ? settings.dynamicType : dynamicType) 109 | } 110 | } 111 | return PreviewView() 112 | } 113 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGoAppClip/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGoAppClip/Assets.xcassets/AppIcon.appiconset/AppIcon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liveview-native/liveview-native-app-go/f578762275d4ad7acdc85c68701464b274ab9148/swiftui/LiveViewNativeGoAppClip/Assets.xcassets/AppIcon.appiconset/AppIcon.jpg -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGoAppClip/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "AppIcon.jpg", 5 | "idiom" : "universal", 6 | "platform" : "ios", 7 | "size" : "1024x1024" 8 | } 9 | ], 10 | "info" : { 11 | "author" : "xcode", 12 | "version" : 1 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGoAppClip/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGoAppClip/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSCameraUsageDescription 6 | Scan a QR code to connect to a LiveView 7 | NSAppClip 8 | 9 | NSAppClipRequestEphemeralUserNotification 10 | 11 | NSAppClipRequestLocationConfirmation 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGoAppClip/LiveViewNativeGoAppClip.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.parent-application-identifiers 6 | 7 | $(AppIdentifierPrefix)com.dockyard.LiveViewNativeGo 8 | 9 | 10 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGoAppClip/LiveViewNativeGoAppClipApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LiveViewNativeGoAppClipApp.swift 3 | // LiveViewNativeGoAppClip 4 | // 5 | // Created by Carson Katri on 8/15/24. 6 | // 7 | 8 | import SwiftUI 9 | import TipKit 10 | 11 | @main 12 | struct LiveViewNativeGoAppClipApp: App { 13 | @State private var settings = Settings() 14 | 15 | init() { 16 | do { 17 | #if DEBUG 18 | try Tips.resetDatastore() 19 | #endif 20 | try Tips.configure() 21 | } catch { 22 | print("Error configuring tips: \(error)") 23 | } 24 | } 25 | 26 | var body: some Scene { 27 | WindowGroup { 28 | ContentView() 29 | } 30 | .environment(settings) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /swiftui/LiveViewNativeGoAppClip/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /swiftui/PRIVACY_POLICY.md: -------------------------------------------------------------------------------- 1 | **Privacy Policy** 2 | 3 | This privacy policy applies to the LVN Go app (hereby referred to as "Application") for mobile devices that was created by DockYard, Inc. (hereby referred to as "Service Provider") as a Free service. This service is intended for use "AS IS". 4 | 5 | **Information Collection and Use** 6 | 7 | The Application collects information when you download and use it. This information may include information such as 8 | 9 | * Your device's Internet Protocol address (e.g. IP address) 10 | * The pages of the Application that you visit, the time and date of your visit, the time spent on those pages 11 | * The time spent on the Application 12 | * The operating system you use on your mobile device 13 | 14 | The Application does not gather precise information about the location of your mobile device. 15 | 16 | The Application collects your device's location, which helps the Service Provider determine your approximate geographical location and make use of in below ways: 17 | 18 | * Geolocation Services: The Service Provider utilizes location data to provide features such as personalized content, relevant recommendations, and location-based services. 19 | * Analytics and Improvements: Aggregated and anonymized location data helps the Service Provider to analyze user behavior, identify trends, and improve the overall performance and functionality of the Application. 20 | * Third-Party Services: Periodically, the Service Provider may transmit anonymized location data to external services. These services assist them in enhancing the Application and optimizing their offerings. 21 | 22 | The Service Provider may use the information you provided to contact you from time to time to provide you with important information, required notices and marketing promotions. 23 | 24 | For a better experience, while using the Application, the Service Provider may require you to provide us with certain personally identifiable information. The information that the Service Provider request will be retained by them and used as described in this privacy policy. 25 | 26 | **Third Party Access** 27 | 28 | Only aggregated, anonymized data is periodically transmitted to external services to aid the Service Provider in improving the Application and their service. The Service Provider may share your information with third parties in the ways that are described in this privacy statement. 29 | 30 | Please note that the Application utilizes third-party services that have their own Privacy Policy about handling data. Below are the links to the Privacy Policy of the third-party service providers used by the Application: 31 | 32 | * [Google Play Services](https://www.google.com/policies/privacy/) 33 | 34 | The Service Provider may disclose User Provided and Automatically Collected Information: 35 | 36 | * as required by law, such as to comply with a subpoena, or similar legal process; 37 | * when they believe in good faith that disclosure is necessary to protect their rights, protect your safety or the safety of others, investigate fraud, or respond to a government request; 38 | * with their trusted services providers who work on their behalf, do not have an independent use of the information we disclose to them, and have agreed to adhere to the rules set forth in this privacy statement. 39 | 40 | **Opt-Out Rights** 41 | 42 | You can stop all collection of information by the Application easily by uninstalling it. You may use the standard uninstall processes as may be available as part of your mobile device or via the mobile application marketplace or network. 43 | 44 | **Data Retention Policy** 45 | 46 | The Service Provider will retain User Provided data for as long as you use the Application and for a reasonable time thereafter. If you'd like them to delete User Provided Data that you have provided via the Application, please contact them at contact@dockyard.com and they will respond in a reasonable time. 47 | 48 | **Children** 49 | 50 | The Service Provider does not use the Application to knowingly solicit data from or market to children under the age of 13. 51 | 52 | The Application does not address anyone under the age of 13\. The Service Provider does not knowingly collect personally identifiable information from children under 13 years of age. In the case the Service Provider discover that a child under 13 has provided personal information, the Service Provider will immediately delete this from their servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact the Service Provider (contact@dockyard.com) so that they will be able to take the necessary actions. 53 | 54 | **Security** 55 | 56 | The Service Provider is concerned about safeguarding the confidentiality of your information. The Service Provider provides physical, electronic, and procedural safeguards to protect information the Service Provider processes and maintains. 57 | 58 | **Changes** 59 | 60 | This Privacy Policy may be updated from time to time for any reason. The Service Provider will notify you of any changes to the Privacy Policy by updating this page with the new Privacy Policy. You are advised to consult this Privacy Policy regularly for any changes, as continued use is deemed approval of all changes. 61 | 62 | This privacy policy is effective as of 2024-08-21 63 | 64 | **Your Consent** 65 | 66 | By using the Application, you are consenting to the processing of your information as set forth in this Privacy Policy now and as amended by us. 67 | 68 | **Contact Us** 69 | 70 | If you have any questions regarding privacy while using the Application, or have questions about the practices, please contact the Service Provider via email at contact@dockyard.com. 71 | 72 | * * * 73 | 74 | This privacy policy page was generated by [App Privacy Policy Generator](https://app-privacy-policy-generator.nisrulz.com/) 75 | --------------------------------------------------------------------------------