├── .gitignore ├── .swiftpm └── xcode │ └── package.xcworkspace │ └── contents.xcworkspacedata ├── GhostHand.podspec ├── GhostHand.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── GhostHand ├── GhostHand.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── GhostHandLib.xcscheme │ └── xcuserdata │ │ └── matt.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist ├── GhostHand │ ├── app │ │ └── AppDelegate.swift │ ├── config │ │ └── Info.plist │ └── supporting files │ │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── Contents.json │ │ └── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard ├── GhostHandLib │ ├── Built_Product │ │ └── GhostHand.app │ │ │ ├── Base.lproj │ │ │ ├── LaunchScreen.storyboardc │ │ │ │ ├── 01J-lp-oVM-view-Ze5-6b-2t3.nib │ │ │ │ │ ├── objects-13.0+.nib │ │ │ │ │ └── runtime.nib │ │ │ │ ├── Info.plist │ │ │ │ └── UIViewController-01J-lp-oVM.nib │ │ │ │ │ ├── objects-13.0+.nib │ │ │ │ │ └── runtime.nib │ │ │ └── Main.storyboardc │ │ │ │ ├── BYZ-38-t0r-view-8bC-Xf-vdC.nib │ │ │ │ ├── objects-13.0+.nib │ │ │ │ └── runtime.nib │ │ │ │ ├── Info.plist │ │ │ │ └── UIViewController-BYZ-38-t0r.nib │ │ │ │ ├── objects-13.0+.nib │ │ │ │ └── runtime.nib │ │ │ ├── Frameworks │ │ │ ├── libswiftCore.dylib │ │ │ ├── libswiftCoreFoundation.dylib │ │ │ ├── libswiftCoreGraphics.dylib │ │ │ ├── libswiftDarwin.dylib │ │ │ ├── libswiftDispatch.dylib │ │ │ ├── libswiftFoundation.dylib │ │ │ └── libswiftObjectiveC.dylib │ │ │ ├── GhostHand │ │ │ ├── Info.plist │ │ │ ├── PkgInfo │ │ │ └── _CodeSignature │ │ │ └── CodeResources │ ├── Classes │ │ ├── GhostHand.swift │ │ └── GhostHandLib.h │ └── Info.plist ├── GhostHandLibTests │ ├── GhostHandLibTests.swift │ └── Info.plist ├── GhostHandTests │ ├── GhostHandTests.swift │ └── Info.plist └── GhostHandUITests │ ├── GhostHandUITests.swift │ └── Info.plist ├── GhostHandSample ├── GhostHandSample.xcodeproj │ └── project.pbxproj ├── GhostHandSample │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── Contents.json │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ ├── ContentView.swift │ ├── Info.plist │ ├── Preview Content │ │ └── Preview Assets.xcassets │ │ │ └── Contents.json │ └── SceneDelegate.swift ├── GhostHandSampleTests │ ├── GhostHandSampleTests.swift │ └── Info.plist └── GhostHandSampleUITests │ ├── GhostHandSampleUITests.swift │ ├── GhostHandSampleUITests2.swift │ ├── GhostHandSampleUITests3.swift │ └── Info.plist ├── LICENSE ├── Package.swift ├── README.md └── ghosthand_install.sh /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/swift,xcode 3 | # Edit at https://www.gitignore.io/?templates=swift,xcode 4 | 5 | #Custom 6 | .DS_Store 7 | 8 | ### Swift ### 9 | # Xcode 10 | # 11 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 12 | 13 | ## Build generated 14 | build/ 15 | DerivedData/ 16 | 17 | ## Various settings 18 | *.pbxuser 19 | !default.pbxuser 20 | *.mode1v3 21 | !default.mode1v3 22 | *.mode2v3 23 | !default.mode2v3 24 | *.perspectivev3 25 | !default.perspectivev3 26 | xcuserdata/ 27 | 28 | ## Other 29 | *.moved-aside 30 | *.xccheckout 31 | *.xcscmblueprint 32 | 33 | ## Obj-C/Swift specific 34 | *.hmap 35 | *.ipa 36 | *.dSYM.zip 37 | *.dSYM 38 | 39 | ## Playgrounds 40 | timeline.xctimeline 41 | playground.xcworkspace 42 | 43 | # Swift Package Manager 44 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 45 | # Packages/ 46 | # Package.pins 47 | # Package.resolved 48 | .build/ 49 | # Add this line if you want to avoid checking in Xcode SPM integration. 50 | # .swiftpm/xcode 51 | 52 | # CocoaPods 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 | # Pods/ 57 | # Add this line if you want to avoid checking in source code from the Xcode workspace 58 | # *.xcworkspace 59 | 60 | # Carthage 61 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 62 | # Carthage/Checkouts 63 | 64 | Carthage/Build 65 | 66 | # Accio dependency management 67 | Dependencies/ 68 | .accio/ 69 | 70 | # fastlane 71 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 72 | # screenshots whenever they are needed. 73 | # For more information about the recommended setup visit: 74 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 75 | 76 | fastlane/report.xml 77 | fastlane/Preview.html 78 | fastlane/screenshots/**/*.png 79 | fastlane/test_output 80 | 81 | # Code Injection 82 | # After new code Injection tools there's a generated folder /iOSInjectionProject 83 | # https://github.com/johnno1962/injectionforxcode 84 | 85 | iOSInjectionProject/ 86 | 87 | ### Xcode ### 88 | # Xcode 89 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 90 | 91 | ## User settings 92 | 93 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 94 | 95 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 96 | 97 | ## Xcode Patch 98 | *.xcodeproj/* 99 | !*.xcodeproj/project.pbxproj 100 | !*.xcodeproj/xcshareddata/ 101 | !*.xcworkspace/contents.xcworkspacedata 102 | /*.gcno 103 | 104 | ### Xcode Patch ### 105 | **/xcshareddata/WorkspaceSettings.xcsettings 106 | 107 | # End of https://www.gitignore.io/api/swift,xcode 108 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /GhostHand.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint TestCocoaPod.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'GhostHand' 11 | s.version = '1.0.2' 12 | s.summary = 'XCUITest helper for testing custom schemes & universal links' 13 | s.swift_version = '5.0' 14 | 15 | # This description is used to generate tags and improve search results. 16 | # * Think: What does it do? Why did you write it? What is the focus? 17 | # * Try to keep it short, snappy and to the point. 18 | # * Write the description between the DESC delimiters below. 19 | # * Finally, don't worry about the indent, CocoaPods strips it! 20 | 21 | s.description = <<-DESC 22 | XCUITest helper for testing custom schemes & universal links. This app will install a very small test app on your simulator to assist you with testing univesal links & custom schemes. 23 | DESC 24 | 25 | s.homepage = 'https://github.com/mds6058/GhostHand' 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } 27 | s.author = { 'Matt Stanford' => 'matthew.d.stanford@gmail.com' } 28 | s.source = { :git => 'https://github.com/mds6058/GhostHand.git', :tag => s.version.to_s } 29 | s.social_media_url = 'https://twitter.com/MattStanford3' 30 | 31 | s.ios.deployment_target = '10.0' 32 | 33 | s.source_files = 'GhostHand/GhostHandLib/Classes/**/*' 34 | s.resources = 'GhostHand/GhostHandLib/Built_Product/*', 'ghosthand_install.sh' 35 | s.frameworks = 'XCTest' 36 | end 37 | -------------------------------------------------------------------------------- /GhostHand.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /GhostHand.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /GhostHand/GhostHand.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | C915CA89236F6FD100165B9C /* ghosthand_install.sh in Resources */ = {isa = PBXBuildFile; fileRef = C915CA88236F6FD100165B9C /* ghosthand_install.sh */; }; 11 | C985AA16236F8188005EF98B /* GhostHand.swift in Sources */ = {isa = PBXBuildFile; fileRef = C985AA15236F8188005EF98B /* GhostHand.swift */; }; 12 | C9D3024C235FE5B3008593A9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D3024B235FE5B3008593A9 /* AppDelegate.swift */; }; 13 | C9D30253235FE5B3008593A9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C9D30251235FE5B3008593A9 /* Main.storyboard */; }; 14 | C9D30255235FE5B3008593A9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9D30254235FE5B3008593A9 /* Assets.xcassets */; }; 15 | C9D30258235FE5B3008593A9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C9D30256235FE5B3008593A9 /* LaunchScreen.storyboard */; }; 16 | C9D30263235FE5B3008593A9 /* GhostHandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D30262235FE5B3008593A9 /* GhostHandTests.swift */; }; 17 | C9D3026E235FE5B4008593A9 /* GhostHandUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D3026D235FE5B4008593A9 /* GhostHandUITests.swift */; }; 18 | C9D3028A235FE94C008593A9 /* GhostHandLib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9D30281235FE94C008593A9 /* GhostHandLib.framework */; }; 19 | C9D30291235FE94C008593A9 /* GhostHandLibTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D30290235FE94C008593A9 /* GhostHandLibTests.swift */; }; 20 | C9D30293235FE94C008593A9 /* README.md in Headers */ = {isa = PBXBuildFile; fileRef = C9D30283235FE94C008593A9 /* README.md */; settings = {ATTRIBUTES = (Public, ); }; }; 21 | C9EF97312367F88700D21618 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = C9EF97302367F88700D21618 /* LICENSE */; }; 22 | C9EF976323694EFE00D21618 /* GhostHand.app in Resources */ = {isa = PBXBuildFile; fileRef = C9BBEB4A236503AC00DA8104 /* GhostHand.app */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXContainerItemProxy section */ 26 | C9D3025F235FE5B3008593A9 /* PBXContainerItemProxy */ = { 27 | isa = PBXContainerItemProxy; 28 | containerPortal = C9D30240235FE5B3008593A9 /* Project object */; 29 | proxyType = 1; 30 | remoteGlobalIDString = C9D30247235FE5B3008593A9; 31 | remoteInfo = GhostHand; 32 | }; 33 | C9D3026A235FE5B4008593A9 /* PBXContainerItemProxy */ = { 34 | isa = PBXContainerItemProxy; 35 | containerPortal = C9D30240235FE5B3008593A9 /* Project object */; 36 | proxyType = 1; 37 | remoteGlobalIDString = C9D30247235FE5B3008593A9; 38 | remoteInfo = GhostHand; 39 | }; 40 | C9D3028B235FE94C008593A9 /* PBXContainerItemProxy */ = { 41 | isa = PBXContainerItemProxy; 42 | containerPortal = C9D30240235FE5B3008593A9 /* Project object */; 43 | proxyType = 1; 44 | remoteGlobalIDString = C9D30280235FE94C008593A9; 45 | remoteInfo = GhostHandLib; 46 | }; 47 | C9D3028D235FE94C008593A9 /* PBXContainerItemProxy */ = { 48 | isa = PBXContainerItemProxy; 49 | containerPortal = C9D30240235FE5B3008593A9 /* Project object */; 50 | proxyType = 1; 51 | remoteGlobalIDString = C9D30247235FE5B3008593A9; 52 | remoteInfo = GhostHand; 53 | }; 54 | /* End PBXContainerItemProxy section */ 55 | 56 | /* Begin PBXFileReference section */ 57 | C915CA88236F6FD100165B9C /* ghosthand_install.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = ghosthand_install.sh; path = ../../ghosthand_install.sh; sourceTree = ""; }; 58 | C982812026F91E5900539A6A /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Package.swift; path = ../../../Package.swift; sourceTree = ""; }; 59 | C985AA15236F8188005EF98B /* GhostHand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = GhostHand.swift; path = Classes/GhostHand.swift; sourceTree = ""; }; 60 | C985AA18236F81F2005EF98B /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 61 | C985AA1C23711B4D005EF98B /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 62 | C9BBEB4A236503AC00DA8104 /* GhostHand.app */ = {isa = PBXFileReference; lastKnownFileType = wrapper.application; path = GhostHand.app; sourceTree = ""; }; 63 | C9D30248235FE5B3008593A9 /* GhostHand.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GhostHand.app; sourceTree = BUILT_PRODUCTS_DIR; }; 64 | C9D3024B235FE5B3008593A9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 65 | C9D30252235FE5B3008593A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 66 | C9D30254235FE5B3008593A9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 67 | C9D30257235FE5B3008593A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 68 | C9D30259235FE5B3008593A9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 69 | C9D3025E235FE5B3008593A9 /* GhostHandTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GhostHandTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 70 | C9D30262235FE5B3008593A9 /* GhostHandTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhostHandTests.swift; sourceTree = ""; }; 71 | C9D30264235FE5B4008593A9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 72 | C9D30269235FE5B4008593A9 /* GhostHandUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GhostHandUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 73 | C9D3026D235FE5B4008593A9 /* GhostHandUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhostHandUITests.swift; sourceTree = ""; }; 74 | C9D3026F235FE5B4008593A9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 75 | C9D30281235FE94C008593A9 /* GhostHandLib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GhostHandLib.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 76 | C9D30283235FE94C008593A9 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../../README.md; sourceTree = ""; }; 77 | C9D30284235FE94C008593A9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 78 | C9D30289235FE94C008593A9 /* GhostHandLibTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GhostHandLibTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 79 | C9D30290235FE94C008593A9 /* GhostHandLibTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhostHandLibTests.swift; sourceTree = ""; }; 80 | C9D30292235FE94C008593A9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 81 | C9D302AF235FF241008593A9 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; name = .gitignore; path = ../../../.gitignore; sourceTree = ""; }; 82 | C9EF97302367F88700D21618 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; name = LICENSE; path = ../../../LICENSE; sourceTree = ""; }; 83 | C9EF9732236948B000D21618 /* GhostHand.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; name = GhostHand.podspec; path = ../../../GhostHand.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 84 | /* End PBXFileReference section */ 85 | 86 | /* Begin PBXFrameworksBuildPhase section */ 87 | C9D30245235FE5B3008593A9 /* Frameworks */ = { 88 | isa = PBXFrameworksBuildPhase; 89 | buildActionMask = 2147483647; 90 | files = ( 91 | ); 92 | runOnlyForDeploymentPostprocessing = 0; 93 | }; 94 | C9D3025B235FE5B3008593A9 /* Frameworks */ = { 95 | isa = PBXFrameworksBuildPhase; 96 | buildActionMask = 2147483647; 97 | files = ( 98 | ); 99 | runOnlyForDeploymentPostprocessing = 0; 100 | }; 101 | C9D30266235FE5B4008593A9 /* Frameworks */ = { 102 | isa = PBXFrameworksBuildPhase; 103 | buildActionMask = 2147483647; 104 | files = ( 105 | ); 106 | runOnlyForDeploymentPostprocessing = 0; 107 | }; 108 | C9D3027E235FE94C008593A9 /* Frameworks */ = { 109 | isa = PBXFrameworksBuildPhase; 110 | buildActionMask = 2147483647; 111 | files = ( 112 | ); 113 | runOnlyForDeploymentPostprocessing = 0; 114 | }; 115 | C9D30286235FE94C008593A9 /* Frameworks */ = { 116 | isa = PBXFrameworksBuildPhase; 117 | buildActionMask = 2147483647; 118 | files = ( 119 | C9D3028A235FE94C008593A9 /* GhostHandLib.framework in Frameworks */, 120 | ); 121 | runOnlyForDeploymentPostprocessing = 0; 122 | }; 123 | /* End PBXFrameworksBuildPhase section */ 124 | 125 | /* Begin PBXGroup section */ 126 | C985AA17236F81F2005EF98B /* Frameworks */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | C985AA18236F81F2005EF98B /* XCTest.framework */, 130 | ); 131 | name = Frameworks; 132 | sourceTree = ""; 133 | }; 134 | C9BBEB492365030300DA8104 /* Built_Product */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | C9BBEB4A236503AC00DA8104 /* GhostHand.app */, 138 | ); 139 | path = Built_Product; 140 | sourceTree = ""; 141 | }; 142 | C9D3023F235FE5B3008593A9 = { 143 | isa = PBXGroup; 144 | children = ( 145 | C985AA1C23711B4D005EF98B /* README.md */, 146 | C9D3024A235FE5B3008593A9 /* GhostHand */, 147 | C9D30261235FE5B3008593A9 /* GhostHandTests */, 148 | C9D3026C235FE5B4008593A9 /* GhostHandUITests */, 149 | C9D30282235FE94C008593A9 /* GhostHandLib */, 150 | C9D3028F235FE94C008593A9 /* GhostHandLibTests */, 151 | C9D30249235FE5B3008593A9 /* Products */, 152 | C985AA17236F81F2005EF98B /* Frameworks */, 153 | ); 154 | sourceTree = ""; 155 | }; 156 | C9D30249235FE5B3008593A9 /* Products */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | C9D30248235FE5B3008593A9 /* GhostHand.app */, 160 | C9D3025E235FE5B3008593A9 /* GhostHandTests.xctest */, 161 | C9D30269235FE5B4008593A9 /* GhostHandUITests.xctest */, 162 | C9D30281235FE94C008593A9 /* GhostHandLib.framework */, 163 | C9D30289235FE94C008593A9 /* GhostHandLibTests.xctest */, 164 | ); 165 | name = Products; 166 | sourceTree = ""; 167 | }; 168 | C9D3024A235FE5B3008593A9 /* GhostHand */ = { 169 | isa = PBXGroup; 170 | children = ( 171 | C9D302AA235FED4A008593A9 /* app */, 172 | C9D302A9235FED26008593A9 /* config */, 173 | C9D302A8235FED0E008593A9 /* supporting files */, 174 | ); 175 | path = GhostHand; 176 | sourceTree = ""; 177 | }; 178 | C9D30261235FE5B3008593A9 /* GhostHandTests */ = { 179 | isa = PBXGroup; 180 | children = ( 181 | C9D30262235FE5B3008593A9 /* GhostHandTests.swift */, 182 | C9D30264235FE5B4008593A9 /* Info.plist */, 183 | ); 184 | path = GhostHandTests; 185 | sourceTree = ""; 186 | }; 187 | C9D3026C235FE5B4008593A9 /* GhostHandUITests */ = { 188 | isa = PBXGroup; 189 | children = ( 190 | C9D3026D235FE5B4008593A9 /* GhostHandUITests.swift */, 191 | C9D3026F235FE5B4008593A9 /* Info.plist */, 192 | ); 193 | path = GhostHandUITests; 194 | sourceTree = ""; 195 | }; 196 | C9D30282235FE94C008593A9 /* GhostHandLib */ = { 197 | isa = PBXGroup; 198 | children = ( 199 | C9D30283235FE94C008593A9 /* README.md */, 200 | C9D30284235FE94C008593A9 /* Info.plist */, 201 | C915CA88236F6FD100165B9C /* ghosthand_install.sh */, 202 | C985AA15236F8188005EF98B /* GhostHand.swift */, 203 | C9BBEB492365030300DA8104 /* Built_Product */, 204 | ); 205 | path = GhostHandLib; 206 | sourceTree = ""; 207 | }; 208 | C9D3028F235FE94C008593A9 /* GhostHandLibTests */ = { 209 | isa = PBXGroup; 210 | children = ( 211 | C9D30290235FE94C008593A9 /* GhostHandLibTests.swift */, 212 | C9D30292235FE94C008593A9 /* Info.plist */, 213 | ); 214 | path = GhostHandLibTests; 215 | sourceTree = ""; 216 | }; 217 | C9D302A8235FED0E008593A9 /* supporting files */ = { 218 | isa = PBXGroup; 219 | children = ( 220 | C982812026F91E5900539A6A /* Package.swift */, 221 | C9EF9732236948B000D21618 /* GhostHand.podspec */, 222 | C9D30251235FE5B3008593A9 /* Main.storyboard */, 223 | C9D30254235FE5B3008593A9 /* Assets.xcassets */, 224 | C9D30256235FE5B3008593A9 /* LaunchScreen.storyboard */, 225 | C9EF97302367F88700D21618 /* LICENSE */, 226 | ); 227 | path = "supporting files"; 228 | sourceTree = ""; 229 | }; 230 | C9D302A9235FED26008593A9 /* config */ = { 231 | isa = PBXGroup; 232 | children = ( 233 | C9D302AF235FF241008593A9 /* .gitignore */, 234 | C9D30259235FE5B3008593A9 /* Info.plist */, 235 | ); 236 | path = config; 237 | sourceTree = ""; 238 | }; 239 | C9D302AA235FED4A008593A9 /* app */ = { 240 | isa = PBXGroup; 241 | children = ( 242 | C9D3024B235FE5B3008593A9 /* AppDelegate.swift */, 243 | ); 244 | path = app; 245 | sourceTree = ""; 246 | }; 247 | /* End PBXGroup section */ 248 | 249 | /* Begin PBXHeadersBuildPhase section */ 250 | C9D3027C235FE94C008593A9 /* Headers */ = { 251 | isa = PBXHeadersBuildPhase; 252 | buildActionMask = 2147483647; 253 | files = ( 254 | C9D30293235FE94C008593A9 /* README.md in Headers */, 255 | ); 256 | runOnlyForDeploymentPostprocessing = 0; 257 | }; 258 | /* End PBXHeadersBuildPhase section */ 259 | 260 | /* Begin PBXNativeTarget section */ 261 | C9D30247235FE5B3008593A9 /* GhostHand */ = { 262 | isa = PBXNativeTarget; 263 | buildConfigurationList = C9D30272235FE5B4008593A9 /* Build configuration list for PBXNativeTarget "GhostHand" */; 264 | buildPhases = ( 265 | C9D30244235FE5B3008593A9 /* Sources */, 266 | C9D30245235FE5B3008593A9 /* Frameworks */, 267 | C9D30246235FE5B3008593A9 /* Resources */, 268 | ); 269 | buildRules = ( 270 | ); 271 | dependencies = ( 272 | ); 273 | name = GhostHand; 274 | productName = GhostHand; 275 | productReference = C9D30248235FE5B3008593A9 /* GhostHand.app */; 276 | productType = "com.apple.product-type.application"; 277 | }; 278 | C9D3025D235FE5B3008593A9 /* GhostHandTests */ = { 279 | isa = PBXNativeTarget; 280 | buildConfigurationList = C9D30275235FE5B4008593A9 /* Build configuration list for PBXNativeTarget "GhostHandTests" */; 281 | buildPhases = ( 282 | C9D3025A235FE5B3008593A9 /* Sources */, 283 | C9D3025B235FE5B3008593A9 /* Frameworks */, 284 | C9D3025C235FE5B3008593A9 /* Resources */, 285 | ); 286 | buildRules = ( 287 | ); 288 | dependencies = ( 289 | C9D30260235FE5B3008593A9 /* PBXTargetDependency */, 290 | ); 291 | name = GhostHandTests; 292 | productName = GhostHandTests; 293 | productReference = C9D3025E235FE5B3008593A9 /* GhostHandTests.xctest */; 294 | productType = "com.apple.product-type.bundle.unit-test"; 295 | }; 296 | C9D30268235FE5B4008593A9 /* GhostHandUITests */ = { 297 | isa = PBXNativeTarget; 298 | buildConfigurationList = C9D30278235FE5B4008593A9 /* Build configuration list for PBXNativeTarget "GhostHandUITests" */; 299 | buildPhases = ( 300 | C9D30265235FE5B4008593A9 /* Sources */, 301 | C9D30266235FE5B4008593A9 /* Frameworks */, 302 | C9D30267235FE5B4008593A9 /* Resources */, 303 | ); 304 | buildRules = ( 305 | ); 306 | dependencies = ( 307 | C9D3026B235FE5B4008593A9 /* PBXTargetDependency */, 308 | ); 309 | name = GhostHandUITests; 310 | productName = GhostHandUITests; 311 | productReference = C9D30269235FE5B4008593A9 /* GhostHandUITests.xctest */; 312 | productType = "com.apple.product-type.bundle.ui-testing"; 313 | }; 314 | C9D30280235FE94C008593A9 /* GhostHandLib */ = { 315 | isa = PBXNativeTarget; 316 | buildConfigurationList = C9D30298235FE94C008593A9 /* Build configuration list for PBXNativeTarget "GhostHandLib" */; 317 | buildPhases = ( 318 | C9D3027C235FE94C008593A9 /* Headers */, 319 | C9D3027D235FE94C008593A9 /* Sources */, 320 | C9D3027E235FE94C008593A9 /* Frameworks */, 321 | C9EF9722236504ED00D21618 /* Resources */, 322 | ); 323 | buildRules = ( 324 | ); 325 | dependencies = ( 326 | ); 327 | name = GhostHandLib; 328 | productName = GhostHandLib; 329 | productReference = C9D30281235FE94C008593A9 /* GhostHandLib.framework */; 330 | productType = "com.apple.product-type.framework"; 331 | }; 332 | C9D30288235FE94C008593A9 /* GhostHandLibTests */ = { 333 | isa = PBXNativeTarget; 334 | buildConfigurationList = C9D3029C235FE94C008593A9 /* Build configuration list for PBXNativeTarget "GhostHandLibTests" */; 335 | buildPhases = ( 336 | C9D30285235FE94C008593A9 /* Sources */, 337 | C9D30286235FE94C008593A9 /* Frameworks */, 338 | C9D30287235FE94C008593A9 /* Resources */, 339 | ); 340 | buildRules = ( 341 | ); 342 | dependencies = ( 343 | C9D3028C235FE94C008593A9 /* PBXTargetDependency */, 344 | C9D3028E235FE94C008593A9 /* PBXTargetDependency */, 345 | ); 346 | name = GhostHandLibTests; 347 | productName = GhostHandLibTests; 348 | productReference = C9D30289235FE94C008593A9 /* GhostHandLibTests.xctest */; 349 | productType = "com.apple.product-type.bundle.unit-test"; 350 | }; 351 | /* End PBXNativeTarget section */ 352 | 353 | /* Begin PBXProject section */ 354 | C9D30240235FE5B3008593A9 /* Project object */ = { 355 | isa = PBXProject; 356 | attributes = { 357 | LastSwiftUpdateCheck = 1110; 358 | LastUpgradeCheck = 1110; 359 | ORGANIZATIONNAME = "Matt Stanford"; 360 | TargetAttributes = { 361 | C9D30247235FE5B3008593A9 = { 362 | CreatedOnToolsVersion = 11.1; 363 | }; 364 | C9D3025D235FE5B3008593A9 = { 365 | CreatedOnToolsVersion = 11.1; 366 | TestTargetID = C9D30247235FE5B3008593A9; 367 | }; 368 | C9D30268235FE5B4008593A9 = { 369 | CreatedOnToolsVersion = 11.1; 370 | TestTargetID = C9D30247235FE5B3008593A9; 371 | }; 372 | C9D30280235FE94C008593A9 = { 373 | CreatedOnToolsVersion = 11.1; 374 | LastSwiftMigration = 1110; 375 | }; 376 | C9D30288235FE94C008593A9 = { 377 | CreatedOnToolsVersion = 11.1; 378 | TestTargetID = C9D30247235FE5B3008593A9; 379 | }; 380 | }; 381 | }; 382 | buildConfigurationList = C9D30243235FE5B3008593A9 /* Build configuration list for PBXProject "GhostHand" */; 383 | compatibilityVersion = "Xcode 9.3"; 384 | developmentRegion = en; 385 | hasScannedForEncodings = 0; 386 | knownRegions = ( 387 | en, 388 | Base, 389 | ); 390 | mainGroup = C9D3023F235FE5B3008593A9; 391 | productRefGroup = C9D30249235FE5B3008593A9 /* Products */; 392 | projectDirPath = ""; 393 | projectRoot = ""; 394 | targets = ( 395 | C9D30247235FE5B3008593A9 /* GhostHand */, 396 | C9D3025D235FE5B3008593A9 /* GhostHandTests */, 397 | C9D30268235FE5B4008593A9 /* GhostHandUITests */, 398 | C9D30280235FE94C008593A9 /* GhostHandLib */, 399 | C9D30288235FE94C008593A9 /* GhostHandLibTests */, 400 | ); 401 | }; 402 | /* End PBXProject section */ 403 | 404 | /* Begin PBXResourcesBuildPhase section */ 405 | C9D30246235FE5B3008593A9 /* Resources */ = { 406 | isa = PBXResourcesBuildPhase; 407 | buildActionMask = 2147483647; 408 | files = ( 409 | C9D30258235FE5B3008593A9 /* LaunchScreen.storyboard in Resources */, 410 | C9D30255235FE5B3008593A9 /* Assets.xcassets in Resources */, 411 | C9EF97312367F88700D21618 /* LICENSE in Resources */, 412 | C9D30253235FE5B3008593A9 /* Main.storyboard in Resources */, 413 | ); 414 | runOnlyForDeploymentPostprocessing = 0; 415 | }; 416 | C9D3025C235FE5B3008593A9 /* Resources */ = { 417 | isa = PBXResourcesBuildPhase; 418 | buildActionMask = 2147483647; 419 | files = ( 420 | ); 421 | runOnlyForDeploymentPostprocessing = 0; 422 | }; 423 | C9D30267235FE5B4008593A9 /* Resources */ = { 424 | isa = PBXResourcesBuildPhase; 425 | buildActionMask = 2147483647; 426 | files = ( 427 | ); 428 | runOnlyForDeploymentPostprocessing = 0; 429 | }; 430 | C9D30287235FE94C008593A9 /* Resources */ = { 431 | isa = PBXResourcesBuildPhase; 432 | buildActionMask = 2147483647; 433 | files = ( 434 | ); 435 | runOnlyForDeploymentPostprocessing = 0; 436 | }; 437 | C9EF9722236504ED00D21618 /* Resources */ = { 438 | isa = PBXResourcesBuildPhase; 439 | buildActionMask = 2147483647; 440 | files = ( 441 | C9EF976323694EFE00D21618 /* GhostHand.app in Resources */, 442 | C915CA89236F6FD100165B9C /* ghosthand_install.sh in Resources */, 443 | ); 444 | runOnlyForDeploymentPostprocessing = 0; 445 | }; 446 | /* End PBXResourcesBuildPhase section */ 447 | 448 | /* Begin PBXSourcesBuildPhase section */ 449 | C9D30244235FE5B3008593A9 /* Sources */ = { 450 | isa = PBXSourcesBuildPhase; 451 | buildActionMask = 2147483647; 452 | files = ( 453 | C9D3024C235FE5B3008593A9 /* AppDelegate.swift in Sources */, 454 | ); 455 | runOnlyForDeploymentPostprocessing = 0; 456 | }; 457 | C9D3025A235FE5B3008593A9 /* Sources */ = { 458 | isa = PBXSourcesBuildPhase; 459 | buildActionMask = 2147483647; 460 | files = ( 461 | C9D30263235FE5B3008593A9 /* GhostHandTests.swift in Sources */, 462 | ); 463 | runOnlyForDeploymentPostprocessing = 0; 464 | }; 465 | C9D30265235FE5B4008593A9 /* Sources */ = { 466 | isa = PBXSourcesBuildPhase; 467 | buildActionMask = 2147483647; 468 | files = ( 469 | C9D3026E235FE5B4008593A9 /* GhostHandUITests.swift in Sources */, 470 | ); 471 | runOnlyForDeploymentPostprocessing = 0; 472 | }; 473 | C9D3027D235FE94C008593A9 /* Sources */ = { 474 | isa = PBXSourcesBuildPhase; 475 | buildActionMask = 2147483647; 476 | files = ( 477 | C985AA16236F8188005EF98B /* GhostHand.swift in Sources */, 478 | ); 479 | runOnlyForDeploymentPostprocessing = 0; 480 | }; 481 | C9D30285235FE94C008593A9 /* Sources */ = { 482 | isa = PBXSourcesBuildPhase; 483 | buildActionMask = 2147483647; 484 | files = ( 485 | C9D30291235FE94C008593A9 /* GhostHandLibTests.swift in Sources */, 486 | ); 487 | runOnlyForDeploymentPostprocessing = 0; 488 | }; 489 | /* End PBXSourcesBuildPhase section */ 490 | 491 | /* Begin PBXTargetDependency section */ 492 | C9D30260235FE5B3008593A9 /* PBXTargetDependency */ = { 493 | isa = PBXTargetDependency; 494 | target = C9D30247235FE5B3008593A9 /* GhostHand */; 495 | targetProxy = C9D3025F235FE5B3008593A9 /* PBXContainerItemProxy */; 496 | }; 497 | C9D3026B235FE5B4008593A9 /* PBXTargetDependency */ = { 498 | isa = PBXTargetDependency; 499 | target = C9D30247235FE5B3008593A9 /* GhostHand */; 500 | targetProxy = C9D3026A235FE5B4008593A9 /* PBXContainerItemProxy */; 501 | }; 502 | C9D3028C235FE94C008593A9 /* PBXTargetDependency */ = { 503 | isa = PBXTargetDependency; 504 | target = C9D30280235FE94C008593A9 /* GhostHandLib */; 505 | targetProxy = C9D3028B235FE94C008593A9 /* PBXContainerItemProxy */; 506 | }; 507 | C9D3028E235FE94C008593A9 /* PBXTargetDependency */ = { 508 | isa = PBXTargetDependency; 509 | target = C9D30247235FE5B3008593A9 /* GhostHand */; 510 | targetProxy = C9D3028D235FE94C008593A9 /* PBXContainerItemProxy */; 511 | }; 512 | /* End PBXTargetDependency section */ 513 | 514 | /* Begin PBXVariantGroup section */ 515 | C9D30251235FE5B3008593A9 /* Main.storyboard */ = { 516 | isa = PBXVariantGroup; 517 | children = ( 518 | C9D30252235FE5B3008593A9 /* Base */, 519 | ); 520 | name = Main.storyboard; 521 | sourceTree = ""; 522 | }; 523 | C9D30256235FE5B3008593A9 /* LaunchScreen.storyboard */ = { 524 | isa = PBXVariantGroup; 525 | children = ( 526 | C9D30257235FE5B3008593A9 /* Base */, 527 | ); 528 | name = LaunchScreen.storyboard; 529 | sourceTree = ""; 530 | }; 531 | /* End PBXVariantGroup section */ 532 | 533 | /* Begin XCBuildConfiguration section */ 534 | C9D30270235FE5B4008593A9 /* Debug */ = { 535 | isa = XCBuildConfiguration; 536 | buildSettings = { 537 | ALWAYS_SEARCH_USER_PATHS = NO; 538 | CLANG_ANALYZER_NONNULL = YES; 539 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 540 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 541 | CLANG_CXX_LIBRARY = "libc++"; 542 | CLANG_ENABLE_MODULES = YES; 543 | CLANG_ENABLE_OBJC_ARC = YES; 544 | CLANG_ENABLE_OBJC_WEAK = YES; 545 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 546 | CLANG_WARN_BOOL_CONVERSION = YES; 547 | CLANG_WARN_COMMA = YES; 548 | CLANG_WARN_CONSTANT_CONVERSION = YES; 549 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 550 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 551 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 552 | CLANG_WARN_EMPTY_BODY = YES; 553 | CLANG_WARN_ENUM_CONVERSION = YES; 554 | CLANG_WARN_INFINITE_RECURSION = YES; 555 | CLANG_WARN_INT_CONVERSION = YES; 556 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 557 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 558 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 559 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 560 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 561 | CLANG_WARN_STRICT_PROTOTYPES = YES; 562 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 563 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 564 | CLANG_WARN_UNREACHABLE_CODE = YES; 565 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 566 | COPY_PHASE_STRIP = NO; 567 | DEBUG_INFORMATION_FORMAT = dwarf; 568 | ENABLE_STRICT_OBJC_MSGSEND = YES; 569 | ENABLE_TESTABILITY = YES; 570 | GCC_C_LANGUAGE_STANDARD = gnu11; 571 | GCC_DYNAMIC_NO_PIC = NO; 572 | GCC_NO_COMMON_BLOCKS = YES; 573 | GCC_OPTIMIZATION_LEVEL = 0; 574 | GCC_PREPROCESSOR_DEFINITIONS = ( 575 | "DEBUG=1", 576 | "$(inherited)", 577 | ); 578 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 579 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 580 | GCC_WARN_UNDECLARED_SELECTOR = YES; 581 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 582 | GCC_WARN_UNUSED_FUNCTION = YES; 583 | GCC_WARN_UNUSED_VARIABLE = YES; 584 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 585 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 586 | MTL_FAST_MATH = YES; 587 | ONLY_ACTIVE_ARCH = YES; 588 | SDKROOT = iphoneos; 589 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 590 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 591 | }; 592 | name = Debug; 593 | }; 594 | C9D30271235FE5B4008593A9 /* Release */ = { 595 | isa = XCBuildConfiguration; 596 | buildSettings = { 597 | ALWAYS_SEARCH_USER_PATHS = NO; 598 | CLANG_ANALYZER_NONNULL = YES; 599 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 600 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 601 | CLANG_CXX_LIBRARY = "libc++"; 602 | CLANG_ENABLE_MODULES = YES; 603 | CLANG_ENABLE_OBJC_ARC = YES; 604 | CLANG_ENABLE_OBJC_WEAK = YES; 605 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 606 | CLANG_WARN_BOOL_CONVERSION = YES; 607 | CLANG_WARN_COMMA = YES; 608 | CLANG_WARN_CONSTANT_CONVERSION = YES; 609 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 610 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 611 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 612 | CLANG_WARN_EMPTY_BODY = YES; 613 | CLANG_WARN_ENUM_CONVERSION = YES; 614 | CLANG_WARN_INFINITE_RECURSION = YES; 615 | CLANG_WARN_INT_CONVERSION = YES; 616 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 617 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 618 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 619 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 620 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 621 | CLANG_WARN_STRICT_PROTOTYPES = YES; 622 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 623 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 624 | CLANG_WARN_UNREACHABLE_CODE = YES; 625 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 626 | COPY_PHASE_STRIP = NO; 627 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 628 | ENABLE_NS_ASSERTIONS = NO; 629 | ENABLE_STRICT_OBJC_MSGSEND = YES; 630 | GCC_C_LANGUAGE_STANDARD = gnu11; 631 | GCC_NO_COMMON_BLOCKS = YES; 632 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 633 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 634 | GCC_WARN_UNDECLARED_SELECTOR = YES; 635 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 636 | GCC_WARN_UNUSED_FUNCTION = YES; 637 | GCC_WARN_UNUSED_VARIABLE = YES; 638 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 639 | MTL_ENABLE_DEBUG_INFO = NO; 640 | MTL_FAST_MATH = YES; 641 | SDKROOT = iphoneos; 642 | SWIFT_COMPILATION_MODE = wholemodule; 643 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 644 | VALIDATE_PRODUCT = YES; 645 | }; 646 | name = Release; 647 | }; 648 | C9D30273235FE5B4008593A9 /* Debug */ = { 649 | isa = XCBuildConfiguration; 650 | buildSettings = { 651 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 652 | CODE_SIGN_IDENTITY = "Apple Development"; 653 | CODE_SIGN_STYLE = Automatic; 654 | DEVELOPMENT_TEAM = 735H4JCR7N; 655 | INFOPLIST_FILE = GhostHand/config/Info.plist; 656 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 657 | LD_RUNPATH_SEARCH_PATHS = ( 658 | "$(inherited)", 659 | "@executable_path/Frameworks", 660 | ); 661 | ONLY_ACTIVE_ARCH = NO; 662 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHand; 663 | PRODUCT_NAME = "$(TARGET_NAME)"; 664 | PROVISIONING_PROFILE_SPECIFIER = ""; 665 | SWIFT_VERSION = 5.0; 666 | TARGETED_DEVICE_FAMILY = "1,2"; 667 | }; 668 | name = Debug; 669 | }; 670 | C9D30274235FE5B4008593A9 /* Release */ = { 671 | isa = XCBuildConfiguration; 672 | buildSettings = { 673 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 674 | CODE_SIGN_IDENTITY = "Apple Development"; 675 | CODE_SIGN_STYLE = Automatic; 676 | DEVELOPMENT_TEAM = 735H4JCR7N; 677 | INFOPLIST_FILE = GhostHand/config/Info.plist; 678 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 679 | LD_RUNPATH_SEARCH_PATHS = ( 680 | "$(inherited)", 681 | "@executable_path/Frameworks", 682 | ); 683 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHand; 684 | PRODUCT_NAME = "$(TARGET_NAME)"; 685 | PROVISIONING_PROFILE_SPECIFIER = ""; 686 | SWIFT_VERSION = 5.0; 687 | TARGETED_DEVICE_FAMILY = "1,2"; 688 | }; 689 | name = Release; 690 | }; 691 | C9D30276235FE5B4008593A9 /* Debug */ = { 692 | isa = XCBuildConfiguration; 693 | buildSettings = { 694 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 695 | BUNDLE_LOADER = "$(TEST_HOST)"; 696 | CODE_SIGN_STYLE = Automatic; 697 | DEVELOPMENT_TEAM = 735H4JCR7N; 698 | INFOPLIST_FILE = GhostHandTests/Info.plist; 699 | IPHONEOS_DEPLOYMENT_TARGET = 13.1; 700 | LD_RUNPATH_SEARCH_PATHS = ( 701 | "$(inherited)", 702 | "@executable_path/Frameworks", 703 | "@loader_path/Frameworks", 704 | ); 705 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandTests; 706 | PRODUCT_NAME = "$(TARGET_NAME)"; 707 | SWIFT_VERSION = 5.0; 708 | TARGETED_DEVICE_FAMILY = "1,2"; 709 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GhostHand.app/GhostHand"; 710 | }; 711 | name = Debug; 712 | }; 713 | C9D30277235FE5B4008593A9 /* Release */ = { 714 | isa = XCBuildConfiguration; 715 | buildSettings = { 716 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 717 | BUNDLE_LOADER = "$(TEST_HOST)"; 718 | CODE_SIGN_STYLE = Automatic; 719 | DEVELOPMENT_TEAM = 735H4JCR7N; 720 | INFOPLIST_FILE = GhostHandTests/Info.plist; 721 | IPHONEOS_DEPLOYMENT_TARGET = 13.1; 722 | LD_RUNPATH_SEARCH_PATHS = ( 723 | "$(inherited)", 724 | "@executable_path/Frameworks", 725 | "@loader_path/Frameworks", 726 | ); 727 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandTests; 728 | PRODUCT_NAME = "$(TARGET_NAME)"; 729 | SWIFT_VERSION = 5.0; 730 | TARGETED_DEVICE_FAMILY = "1,2"; 731 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GhostHand.app/GhostHand"; 732 | }; 733 | name = Release; 734 | }; 735 | C9D30279235FE5B4008593A9 /* Debug */ = { 736 | isa = XCBuildConfiguration; 737 | buildSettings = { 738 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 739 | CODE_SIGN_STYLE = Automatic; 740 | DEVELOPMENT_TEAM = 735H4JCR7N; 741 | INFOPLIST_FILE = GhostHandUITests/Info.plist; 742 | LD_RUNPATH_SEARCH_PATHS = ( 743 | "$(inherited)", 744 | "@executable_path/Frameworks", 745 | "@loader_path/Frameworks", 746 | ); 747 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandUITests; 748 | PRODUCT_NAME = "$(TARGET_NAME)"; 749 | SWIFT_VERSION = 5.0; 750 | TARGETED_DEVICE_FAMILY = "1,2"; 751 | TEST_TARGET_NAME = GhostHand; 752 | }; 753 | name = Debug; 754 | }; 755 | C9D3027A235FE5B4008593A9 /* Release */ = { 756 | isa = XCBuildConfiguration; 757 | buildSettings = { 758 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 759 | CODE_SIGN_STYLE = Automatic; 760 | DEVELOPMENT_TEAM = 735H4JCR7N; 761 | INFOPLIST_FILE = GhostHandUITests/Info.plist; 762 | LD_RUNPATH_SEARCH_PATHS = ( 763 | "$(inherited)", 764 | "@executable_path/Frameworks", 765 | "@loader_path/Frameworks", 766 | ); 767 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandUITests; 768 | PRODUCT_NAME = "$(TARGET_NAME)"; 769 | SWIFT_VERSION = 5.0; 770 | TARGETED_DEVICE_FAMILY = "1,2"; 771 | TEST_TARGET_NAME = GhostHand; 772 | }; 773 | name = Release; 774 | }; 775 | C9D30299235FE94C008593A9 /* Debug */ = { 776 | isa = XCBuildConfiguration; 777 | buildSettings = { 778 | CLANG_ENABLE_MODULES = YES; 779 | CODE_SIGN_IDENTITY = "Apple Development"; 780 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; 781 | CODE_SIGN_STYLE = Manual; 782 | CURRENT_PROJECT_VERSION = 1; 783 | DEFINES_MODULE = YES; 784 | DEVELOPMENT_TEAM = ""; 785 | DYLIB_COMPATIBILITY_VERSION = 1; 786 | DYLIB_CURRENT_VERSION = 1; 787 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 788 | ENABLE_BITCODE = NO; 789 | FRAMEWORK_SEARCH_PATHS = ( 790 | "$(PLATFORM_DIR)/Developer/Library/Frameworks\n$(PLATFORM_DIR)/Developer/Library/Framework", 791 | ); 792 | INFOPLIST_FILE = GhostHandLib/Info.plist; 793 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 794 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 795 | LD_RUNPATH_SEARCH_PATHS = ( 796 | "$(inherited)", 797 | "@executable_path/Frameworks", 798 | "@loader_path/Frameworks", 799 | ); 800 | MARKETING_VERSION = 1.0.1; 801 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandLib; 802 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 803 | PROVISIONING_PROFILE_SPECIFIER = ""; 804 | "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; 805 | SKIP_INSTALL = YES; 806 | SUPPORTS_MACCATALYST = NO; 807 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 808 | SWIFT_VERSION = 5.0; 809 | TARGETED_DEVICE_FAMILY = "1,2"; 810 | VERSIONING_SYSTEM = "apple-generic"; 811 | VERSION_INFO_PREFIX = ""; 812 | }; 813 | name = Debug; 814 | }; 815 | C9D3029A235FE94C008593A9 /* Release */ = { 816 | isa = XCBuildConfiguration; 817 | buildSettings = { 818 | CLANG_ENABLE_MODULES = YES; 819 | CODE_SIGN_IDENTITY = "Apple Development"; 820 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; 821 | CODE_SIGN_STYLE = Manual; 822 | CURRENT_PROJECT_VERSION = 1; 823 | DEFINES_MODULE = YES; 824 | DEVELOPMENT_TEAM = ""; 825 | DYLIB_COMPATIBILITY_VERSION = 1; 826 | DYLIB_CURRENT_VERSION = 1; 827 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 828 | ENABLE_BITCODE = NO; 829 | FRAMEWORK_SEARCH_PATHS = ( 830 | "$(PLATFORM_DIR)/Developer/Library/Frameworks\n$(PLATFORM_DIR)/Developer/Library/Framework", 831 | ); 832 | INFOPLIST_FILE = GhostHandLib/Info.plist; 833 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 834 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 835 | LD_RUNPATH_SEARCH_PATHS = ( 836 | "$(inherited)", 837 | "@executable_path/Frameworks", 838 | "@loader_path/Frameworks", 839 | ); 840 | MARKETING_VERSION = 1.0.1; 841 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandLib; 842 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 843 | PROVISIONING_PROFILE_SPECIFIER = ""; 844 | "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; 845 | SKIP_INSTALL = YES; 846 | SUPPORTS_MACCATALYST = NO; 847 | SWIFT_VERSION = 5.0; 848 | TARGETED_DEVICE_FAMILY = "1,2"; 849 | VERSIONING_SYSTEM = "apple-generic"; 850 | VERSION_INFO_PREFIX = ""; 851 | }; 852 | name = Release; 853 | }; 854 | C9D3029D235FE94C008593A9 /* Debug */ = { 855 | isa = XCBuildConfiguration; 856 | buildSettings = { 857 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 858 | CODE_SIGN_STYLE = Automatic; 859 | DEVELOPMENT_TEAM = 735H4JCR7N; 860 | INFOPLIST_FILE = GhostHandLibTests/Info.plist; 861 | LD_RUNPATH_SEARCH_PATHS = ( 862 | "$(inherited)", 863 | "@executable_path/Frameworks", 864 | "@loader_path/Frameworks", 865 | ); 866 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandLibTests; 867 | PRODUCT_NAME = "$(TARGET_NAME)"; 868 | SWIFT_VERSION = 5.0; 869 | TARGETED_DEVICE_FAMILY = "1,2"; 870 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GhostHand.app/GhostHand"; 871 | }; 872 | name = Debug; 873 | }; 874 | C9D3029E235FE94C008593A9 /* Release */ = { 875 | isa = XCBuildConfiguration; 876 | buildSettings = { 877 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 878 | CODE_SIGN_STYLE = Automatic; 879 | DEVELOPMENT_TEAM = 735H4JCR7N; 880 | INFOPLIST_FILE = GhostHandLibTests/Info.plist; 881 | LD_RUNPATH_SEARCH_PATHS = ( 882 | "$(inherited)", 883 | "@executable_path/Frameworks", 884 | "@loader_path/Frameworks", 885 | ); 886 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandLibTests; 887 | PRODUCT_NAME = "$(TARGET_NAME)"; 888 | SWIFT_VERSION = 5.0; 889 | TARGETED_DEVICE_FAMILY = "1,2"; 890 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GhostHand.app/GhostHand"; 891 | }; 892 | name = Release; 893 | }; 894 | /* End XCBuildConfiguration section */ 895 | 896 | /* Begin XCConfigurationList section */ 897 | C9D30243235FE5B3008593A9 /* Build configuration list for PBXProject "GhostHand" */ = { 898 | isa = XCConfigurationList; 899 | buildConfigurations = ( 900 | C9D30270235FE5B4008593A9 /* Debug */, 901 | C9D30271235FE5B4008593A9 /* Release */, 902 | ); 903 | defaultConfigurationIsVisible = 0; 904 | defaultConfigurationName = Release; 905 | }; 906 | C9D30272235FE5B4008593A9 /* Build configuration list for PBXNativeTarget "GhostHand" */ = { 907 | isa = XCConfigurationList; 908 | buildConfigurations = ( 909 | C9D30273235FE5B4008593A9 /* Debug */, 910 | C9D30274235FE5B4008593A9 /* Release */, 911 | ); 912 | defaultConfigurationIsVisible = 0; 913 | defaultConfigurationName = Release; 914 | }; 915 | C9D30275235FE5B4008593A9 /* Build configuration list for PBXNativeTarget "GhostHandTests" */ = { 916 | isa = XCConfigurationList; 917 | buildConfigurations = ( 918 | C9D30276235FE5B4008593A9 /* Debug */, 919 | C9D30277235FE5B4008593A9 /* Release */, 920 | ); 921 | defaultConfigurationIsVisible = 0; 922 | defaultConfigurationName = Release; 923 | }; 924 | C9D30278235FE5B4008593A9 /* Build configuration list for PBXNativeTarget "GhostHandUITests" */ = { 925 | isa = XCConfigurationList; 926 | buildConfigurations = ( 927 | C9D30279235FE5B4008593A9 /* Debug */, 928 | C9D3027A235FE5B4008593A9 /* Release */, 929 | ); 930 | defaultConfigurationIsVisible = 0; 931 | defaultConfigurationName = Release; 932 | }; 933 | C9D30298235FE94C008593A9 /* Build configuration list for PBXNativeTarget "GhostHandLib" */ = { 934 | isa = XCConfigurationList; 935 | buildConfigurations = ( 936 | C9D30299235FE94C008593A9 /* Debug */, 937 | C9D3029A235FE94C008593A9 /* Release */, 938 | ); 939 | defaultConfigurationIsVisible = 0; 940 | defaultConfigurationName = Release; 941 | }; 942 | C9D3029C235FE94C008593A9 /* Build configuration list for PBXNativeTarget "GhostHandLibTests" */ = { 943 | isa = XCConfigurationList; 944 | buildConfigurations = ( 945 | C9D3029D235FE94C008593A9 /* Debug */, 946 | C9D3029E235FE94C008593A9 /* Release */, 947 | ); 948 | defaultConfigurationIsVisible = 0; 949 | defaultConfigurationName = Release; 950 | }; 951 | /* End XCConfigurationList section */ 952 | }; 953 | rootObject = C9D30240235FE5B3008593A9 /* Project object */; 954 | } 955 | -------------------------------------------------------------------------------- /GhostHand/GhostHand.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /GhostHand/GhostHand.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /GhostHand/GhostHand.xcodeproj/xcshareddata/xcschemes/GhostHandLib.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 57 | 58 | 59 | 60 | 62 | 63 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /GhostHand/GhostHand.xcodeproj/xcuserdata/matt.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | GhostHand.xcscheme 8 | 9 | isShown 10 | 11 | orderHint 12 | 0 13 | 14 | GhostHandLib.xcscheme_^#shared#^_ 15 | 16 | orderHint 17 | 1 18 | 19 | 20 | SuppressBuildableAutocreation 21 | 22 | C9D30247235FE5B3008593A9 23 | 24 | primary 25 | 26 | 27 | C9D3025D235FE5B3008593A9 28 | 29 | primary 30 | 31 | 32 | C9D30268235FE5B4008593A9 33 | 34 | primary 35 | 36 | 37 | C9D30280235FE94C008593A9 38 | 39 | primary 40 | 41 | 42 | C9D30288235FE94C008593A9 43 | 44 | primary 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /GhostHand/GhostHand/app/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // GhostHand 4 | // 5 | // Created by Matt Stanford on 10/22/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 15 | launchToPassedInUrl() 16 | return true 17 | } 18 | 19 | private func launchToPassedInUrl() { 20 | guard let urlString = ProcessInfo.processInfo.environment["launchUrl"], 21 | let url = URL(string: urlString) else { 22 | return 23 | } 24 | UIApplication.shared.open(url, options: [:], completionHandler: nil) 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /GhostHand/GhostHand/config/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | UISceneConfigurations 28 | 29 | UIWindowSceneSessionRoleApplication 30 | 31 | 32 | UISceneConfigurationName 33 | Default Configuration 34 | UISceneDelegateClassName 35 | $(PRODUCT_MODULE_NAME).SceneDelegate 36 | UISceneStoryboardFile 37 | Main 38 | 39 | 40 | 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UIMainStoryboardFile 45 | Main 46 | UIRequiredDeviceCapabilities 47 | 48 | armv7 49 | 50 | UISupportedInterfaceOrientations 51 | 52 | UIInterfaceOrientationPortrait 53 | UIInterfaceOrientationLandscapeLeft 54 | UIInterfaceOrientationLandscapeRight 55 | 56 | UISupportedInterfaceOrientations~ipad 57 | 58 | UIInterfaceOrientationPortrait 59 | UIInterfaceOrientationPortraitUpsideDown 60 | UIInterfaceOrientationLandscapeLeft 61 | UIInterfaceOrientationLandscapeRight 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /GhostHand/GhostHand/supporting files/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /GhostHand/GhostHand/supporting files/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /GhostHand/GhostHand/supporting files/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /GhostHand/GhostHand/supporting files/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib/objects-13.0+.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib/objects-13.0+.nib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib/runtime.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib/runtime.nib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/LaunchScreen.storyboardc/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/LaunchScreen.storyboardc/Info.plist -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib/objects-13.0+.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib/objects-13.0+.nib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib/runtime.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib/runtime.nib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib/objects-13.0+.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib/objects-13.0+.nib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib/runtime.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib/runtime.nib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/Main.storyboardc/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/Main.storyboardc/Info.plist -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib/objects-13.0+.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib/objects-13.0+.nib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib/runtime.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib/runtime.nib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftCore.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftCore.dylib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftCoreFoundation.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftCoreFoundation.dylib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftCoreGraphics.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftCoreGraphics.dylib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftDarwin.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftDarwin.dylib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftDispatch.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftDispatch.dylib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftFoundation.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftFoundation.dylib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftObjectiveC.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Frameworks/libswiftObjectiveC.dylib -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/GhostHand: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/GhostHand -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattstanford/GhostHand/742fe42afdf5da5d2fbee14bbc8e5033286cd504/GhostHand/GhostHandLib/Built_Product/GhostHand.app/Info.plist -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/PkgInfo: -------------------------------------------------------------------------------- 1 | APPL???? -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Built_Product/GhostHand.app/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib/objects-13.0+.nib 8 | 9 | 8jbt5qzLwrUwjGdQPljAurEWb/A= 10 | 11 | Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib/runtime.nib 12 | 13 | ImUcHFYvIgfEBMKUy/QxHSo3sX8= 14 | 15 | Base.lproj/LaunchScreen.storyboardc/Info.plist 16 | 17 | n2t8gsDpfE6XkhG31p7IQJRxTxU= 18 | 19 | Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib/objects-13.0+.nib 20 | 21 | 2kCCDC7ZxyWeIlmIk8h53Z4neyI= 22 | 23 | Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib/runtime.nib 24 | 25 | oYl/ZDA36lSH/lPOfl6EjRJM89c= 26 | 27 | Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib/objects-13.0+.nib 28 | 29 | GUbVbbg1ZzuQV6lujvniFLKQOdU= 30 | 31 | Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib/runtime.nib 32 | 33 | i9ID4EJH1rKBgPwICw6mkOCSjAg= 34 | 35 | Base.lproj/Main.storyboardc/Info.plist 36 | 37 | MDrKFvFWroTb0+KEbQShBcoBvo4= 38 | 39 | Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib/objects-13.0+.nib 40 | 41 | BiaNIUbeUgh/3F/t7yi/ALtt86Y= 42 | 43 | Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib/runtime.nib 44 | 45 | 0HhkOlqKwC5EVBGdiKZl7DhS+5w= 46 | 47 | Frameworks/libswiftCore.dylib 48 | 49 | rrAp64iPhUL40XQR7JlGMDIZaMA= 50 | 51 | Frameworks/libswiftCoreFoundation.dylib 52 | 53 | P4IT9OqWCWZ8FyecMxQHhM6h4G8= 54 | 55 | Frameworks/libswiftCoreGraphics.dylib 56 | 57 | l7cOuKnVMm1hG9tuAE36M0hgwY4= 58 | 59 | Frameworks/libswiftDarwin.dylib 60 | 61 | XJGVexKAsC220QzBQHwL6VS/whc= 62 | 63 | Frameworks/libswiftDispatch.dylib 64 | 65 | xYRhwsR1eeXatGDr8WNyVj93krw= 66 | 67 | Frameworks/libswiftFoundation.dylib 68 | 69 | WclOTQyDfPDOGEjZboBz+yfxGVQ= 70 | 71 | Frameworks/libswiftObjectiveC.dylib 72 | 73 | W4v+YlroD8+v27M4zKa/3r9eqdA= 74 | 75 | Info.plist 76 | 77 | jDaN6HsHxfgnC/RsqJUmM4+T3eg= 78 | 79 | PkgInfo 80 | 81 | n57qDP4tZfLD1rCS43W0B4LQjzE= 82 | 83 | 84 | files2 85 | 86 | Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib/objects-13.0+.nib 87 | 88 | hash 89 | 90 | 8jbt5qzLwrUwjGdQPljAurEWb/A= 91 | 92 | hash2 93 | 94 | OiJBps7Ec9oEYtQBrBkpFjcpjqwX3k+oK22rVtNyZ0s= 95 | 96 | 97 | Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib/runtime.nib 98 | 99 | hash 100 | 101 | ImUcHFYvIgfEBMKUy/QxHSo3sX8= 102 | 103 | hash2 104 | 105 | CZImEdnwom0V9iQ95YGWcwQ5B+5Xu7TzycgcjaLwltk= 106 | 107 | 108 | Base.lproj/LaunchScreen.storyboardc/Info.plist 109 | 110 | hash 111 | 112 | n2t8gsDpfE6XkhG31p7IQJRxTxU= 113 | 114 | hash2 115 | 116 | HyVdXMU7Ux4/KalAao30mpWOK/lEPT4gvYN09wf31cg= 117 | 118 | 119 | Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib/objects-13.0+.nib 120 | 121 | hash 122 | 123 | 2kCCDC7ZxyWeIlmIk8h53Z4neyI= 124 | 125 | hash2 126 | 127 | hCtLDMk8xlGEzpCnNCDKCmj2Ruzq77ckeJcte0IuCpg= 128 | 129 | 130 | Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib/runtime.nib 131 | 132 | hash 133 | 134 | oYl/ZDA36lSH/lPOfl6EjRJM89c= 135 | 136 | hash2 137 | 138 | VTE88b02dov0XE0FlFWhBjnxB/E+QB2zJP6LELXC6FU= 139 | 140 | 141 | Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib/objects-13.0+.nib 142 | 143 | hash 144 | 145 | GUbVbbg1ZzuQV6lujvniFLKQOdU= 146 | 147 | hash2 148 | 149 | GXsCu3xxT0TkEfj8VmtY/+sT96LCHpzTSVxR37dsWvA= 150 | 151 | 152 | Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib/runtime.nib 153 | 154 | hash 155 | 156 | i9ID4EJH1rKBgPwICw6mkOCSjAg= 157 | 158 | hash2 159 | 160 | jg0DqdSW8c7+YD+X223xBC9q0N0WvqpxarrtsFkRYKE= 161 | 162 | 163 | Base.lproj/Main.storyboardc/Info.plist 164 | 165 | hash 166 | 167 | MDrKFvFWroTb0+KEbQShBcoBvo4= 168 | 169 | hash2 170 | 171 | PpvapAjR62rl6Ym4E6hkTgpKmBICxTaQXeUqcpHmmqQ= 172 | 173 | 174 | Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib/objects-13.0+.nib 175 | 176 | hash 177 | 178 | BiaNIUbeUgh/3F/t7yi/ALtt86Y= 179 | 180 | hash2 181 | 182 | mT+CyqE9yBA1sY5j+y9SZGGA85+330iAqTAASSaRRpQ= 183 | 184 | 185 | Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib/runtime.nib 186 | 187 | hash 188 | 189 | 0HhkOlqKwC5EVBGdiKZl7DhS+5w= 190 | 191 | hash2 192 | 193 | yk6ZyANKJr5Qw4CezttQFIxb6y4/mD5STjuEarHD4Io= 194 | 195 | 196 | Frameworks/libswiftCore.dylib 197 | 198 | hash 199 | 200 | rrAp64iPhUL40XQR7JlGMDIZaMA= 201 | 202 | hash2 203 | 204 | SVCZK2UG9ihtWggcfIn/i94g//jyC4cI73gURFdHavA= 205 | 206 | 207 | Frameworks/libswiftCoreFoundation.dylib 208 | 209 | hash 210 | 211 | P4IT9OqWCWZ8FyecMxQHhM6h4G8= 212 | 213 | hash2 214 | 215 | /wz85l+DKAaQ7/BS+77vK5X998iA4Lwz+DGJ95g4kZw= 216 | 217 | 218 | Frameworks/libswiftCoreGraphics.dylib 219 | 220 | hash 221 | 222 | l7cOuKnVMm1hG9tuAE36M0hgwY4= 223 | 224 | hash2 225 | 226 | 2g2ULh1dF2q53hPG3PIdHtRNobjaoh8CmjkUk9GLjTs= 227 | 228 | 229 | Frameworks/libswiftDarwin.dylib 230 | 231 | hash 232 | 233 | XJGVexKAsC220QzBQHwL6VS/whc= 234 | 235 | hash2 236 | 237 | Fy3X7nPk7IgG+lCSWKHuMHgGz6Yi56UOKe6XajzinhU= 238 | 239 | 240 | Frameworks/libswiftDispatch.dylib 241 | 242 | hash 243 | 244 | xYRhwsR1eeXatGDr8WNyVj93krw= 245 | 246 | hash2 247 | 248 | ZSH1H7EN5E4TGGB63N2+7rR7N+rDR1LBmkhABOf9RVQ= 249 | 250 | 251 | Frameworks/libswiftFoundation.dylib 252 | 253 | hash 254 | 255 | WclOTQyDfPDOGEjZboBz+yfxGVQ= 256 | 257 | hash2 258 | 259 | 6SyHvvl3dAOzLH6bFEeF41TPcUHS3iYOdFK7I0FEU6M= 260 | 261 | 262 | Frameworks/libswiftObjectiveC.dylib 263 | 264 | hash 265 | 266 | W4v+YlroD8+v27M4zKa/3r9eqdA= 267 | 268 | hash2 269 | 270 | zLWBGbdbTQk6chVChX0c8CFwhq8ogd9K00QEU5AufEY= 271 | 272 | 273 | 274 | rules 275 | 276 | ^.* 277 | 278 | ^.*\.lproj/ 279 | 280 | optional 281 | 282 | weight 283 | 1000 284 | 285 | ^.*\.lproj/locversion.plist$ 286 | 287 | omit 288 | 289 | weight 290 | 1100 291 | 292 | ^Base\.lproj/ 293 | 294 | weight 295 | 1010 296 | 297 | ^version.plist$ 298 | 299 | 300 | rules2 301 | 302 | .*\.dSYM($|/) 303 | 304 | weight 305 | 11 306 | 307 | ^(.*/)?\.DS_Store$ 308 | 309 | omit 310 | 311 | weight 312 | 2000 313 | 314 | ^.* 315 | 316 | ^.*\.lproj/ 317 | 318 | optional 319 | 320 | weight 321 | 1000 322 | 323 | ^.*\.lproj/locversion.plist$ 324 | 325 | omit 326 | 327 | weight 328 | 1100 329 | 330 | ^Base\.lproj/ 331 | 332 | weight 333 | 1010 334 | 335 | ^Info\.plist$ 336 | 337 | omit 338 | 339 | weight 340 | 20 341 | 342 | ^PkgInfo$ 343 | 344 | omit 345 | 346 | weight 347 | 20 348 | 349 | ^embedded\.provisionprofile$ 350 | 351 | weight 352 | 20 353 | 354 | ^version\.plist$ 355 | 356 | weight 357 | 20 358 | 359 | 360 | 361 | 362 | -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Classes/GhostHand.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GhostHand.swift 3 | // GhostHandLib 4 | // 5 | // Created by Matt Stanford on 11/3/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import XCTest 11 | 12 | public class GhostHand { 13 | 14 | static public func launch(url: String) { 15 | let linkerApp = XCUIApplication(bundleIdentifier: "com.mattstanford.GhostHand") 16 | linkerApp.launchEnvironment["launchUrl"] = url 17 | linkerApp.launch() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Classes/GhostHandLib.h: -------------------------------------------------------------------------------- 1 | // 2 | // GhostHandLib.h 3 | // GhostHandLib 4 | // 5 | // Created by Matt Stanford on 10/22/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for GhostHandLib. 12 | FOUNDATION_EXPORT double GhostHandLibVersionNumber; 13 | 14 | //! Project version string for GhostHandLib. 15 | FOUNDATION_EXPORT const unsigned char GhostHandLibVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /GhostHand/GhostHandLib/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /GhostHand/GhostHandLibTests/GhostHandLibTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GhostHandLibTests.swift 3 | // GhostHandLibTests 4 | // 5 | // Created by Matt Stanford on 10/22/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import GhostHandLib 11 | 12 | class GhostHandLibTests: XCTestCase { 13 | 14 | override func setUp() { 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | } 17 | 18 | override func tearDown() { 19 | // Put teardown code here. This method is called after the invocation of each test method in the class. 20 | } 21 | 22 | func testExample() { 23 | // This is an example of a functional test case. 24 | // Use XCTAssert and related functions to verify your tests produce the correct results. 25 | } 26 | 27 | func testPerformanceExample() { 28 | // This is an example of a performance test case. 29 | self.measure { 30 | // Put the code you want to measure the time of here. 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /GhostHand/GhostHandLibTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /GhostHand/GhostHandTests/GhostHandTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GhostHandTests.swift 3 | // GhostHandTests 4 | // 5 | // Created by Matt Stanford on 10/22/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import GhostHand 11 | 12 | class GhostHandTests: XCTestCase { 13 | 14 | override func setUp() { 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | } 17 | 18 | override func tearDown() { 19 | // Put teardown code here. This method is called after the invocation of each test method in the class. 20 | } 21 | 22 | func testExample() { 23 | // This is an example of a functional test case. 24 | // Use XCTAssert and related functions to verify your tests produce the correct results. 25 | } 26 | 27 | func testPerformanceExample() { 28 | // This is an example of a performance test case. 29 | self.measure { 30 | // Put the code you want to measure the time of here. 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /GhostHand/GhostHandTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /GhostHand/GhostHandUITests/GhostHandUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GhostHandUITests.swift 3 | // GhostHandUITests 4 | // 5 | // Created by Matt Stanford on 10/22/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class GhostHandUITests: XCTestCase { 12 | 13 | override func setUp() { 14 | // Put setup code here. This method is called before the invocation of each test method in the class. 15 | 16 | // In UI tests it is usually best to stop immediately when a failure occurs. 17 | continueAfterFailure = false 18 | 19 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 20 | } 21 | 22 | override func tearDown() { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | } 25 | 26 | func testExample() { 27 | // UI tests must launch the application that they test. 28 | let app = XCUIApplication() 29 | app.launch() 30 | 31 | // Use recording to get started writing UI tests. 32 | // Use XCTAssert and related functions to verify your tests produce the correct results. 33 | } 34 | 35 | func testLaunchPerformance() { 36 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) { 37 | // This measures how long it takes to launch your application. 38 | measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) { 39 | XCUIApplication().launch() 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /GhostHand/GhostHandUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | C915CA8B236F712000165B9C /* GhostHandLib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C915CA8A236F712000165B9C /* GhostHandLib.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 11 | C985AA202373528B005EF98B /* GhostHandSampleUITests2.swift in Sources */ = {isa = PBXBuildFile; fileRef = C985AA1F2373528B005EF98B /* GhostHandSampleUITests2.swift */; }; 12 | C985AA2223735296005EF98B /* GhostHandSampleUITests3.swift in Sources */ = {isa = PBXBuildFile; fileRef = C985AA2123735296005EF98B /* GhostHandSampleUITests3.swift */; }; 13 | C9D30341235FF57F008593A9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D30340235FF57F008593A9 /* AppDelegate.swift */; }; 14 | C9D30343235FF57F008593A9 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D30342235FF57F008593A9 /* SceneDelegate.swift */; }; 15 | C9D30345235FF57F008593A9 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D30344235FF57F008593A9 /* ContentView.swift */; }; 16 | C9D30347235FF580008593A9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9D30346235FF580008593A9 /* Assets.xcassets */; }; 17 | C9D3034A235FF580008593A9 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9D30349235FF580008593A9 /* Preview Assets.xcassets */; }; 18 | C9D3034D235FF580008593A9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C9D3034B235FF580008593A9 /* LaunchScreen.storyboard */; }; 19 | C9D30358235FF580008593A9 /* GhostHandSampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D30357235FF580008593A9 /* GhostHandSampleTests.swift */; }; 20 | C9D30363235FF580008593A9 /* GhostHandSampleUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D30362235FF580008593A9 /* GhostHandSampleUITests.swift */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXContainerItemProxy section */ 24 | C9D30354235FF580008593A9 /* PBXContainerItemProxy */ = { 25 | isa = PBXContainerItemProxy; 26 | containerPortal = C9D30335235FF57F008593A9 /* Project object */; 27 | proxyType = 1; 28 | remoteGlobalIDString = C9D3033C235FF57F008593A9; 29 | remoteInfo = GhostHandSample; 30 | }; 31 | C9D3035F235FF580008593A9 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = C9D30335235FF57F008593A9 /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = C9D3033C235FF57F008593A9; 36 | remoteInfo = GhostHandSample; 37 | }; 38 | /* End PBXContainerItemProxy section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | C915CA8A236F712000165B9C /* GhostHandLib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = GhostHandLib.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | C985AA1F2373528B005EF98B /* GhostHandSampleUITests2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhostHandSampleUITests2.swift; sourceTree = ""; }; 43 | C985AA2123735296005EF98B /* GhostHandSampleUITests3.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhostHandSampleUITests3.swift; sourceTree = ""; }; 44 | C9D3033D235FF57F008593A9 /* GhostHandSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GhostHandSample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | C9D30340235FF57F008593A9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 46 | C9D30342235FF57F008593A9 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 47 | C9D30344235FF57F008593A9 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 48 | C9D30346235FF580008593A9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 49 | C9D30349235FF580008593A9 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 50 | C9D3034C235FF580008593A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 51 | C9D3034E235FF580008593A9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 52 | C9D30353235FF580008593A9 /* GhostHandSampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GhostHandSampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | C9D30357235FF580008593A9 /* GhostHandSampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhostHandSampleTests.swift; sourceTree = ""; }; 54 | C9D30359235FF580008593A9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 55 | C9D3035E235FF580008593A9 /* GhostHandSampleUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GhostHandSampleUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | C9D30362235FF580008593A9 /* GhostHandSampleUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhostHandSampleUITests.swift; sourceTree = ""; }; 57 | C9D30364235FF580008593A9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58 | C9D30371235FFCAF008593A9 /* GhostHandLib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = GhostHandLib.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | C9EF972C2365101800D21618 /* GhostHandLib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = GhostHandLib.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 60 | /* End PBXFileReference section */ 61 | 62 | /* Begin PBXFrameworksBuildPhase section */ 63 | C9D3033A235FF57F008593A9 /* Frameworks */ = { 64 | isa = PBXFrameworksBuildPhase; 65 | buildActionMask = 2147483647; 66 | files = ( 67 | ); 68 | runOnlyForDeploymentPostprocessing = 0; 69 | }; 70 | C9D30350235FF580008593A9 /* Frameworks */ = { 71 | isa = PBXFrameworksBuildPhase; 72 | buildActionMask = 2147483647; 73 | files = ( 74 | ); 75 | runOnlyForDeploymentPostprocessing = 0; 76 | }; 77 | C9D3035B235FF580008593A9 /* Frameworks */ = { 78 | isa = PBXFrameworksBuildPhase; 79 | buildActionMask = 2147483647; 80 | files = ( 81 | C915CA8B236F712000165B9C /* GhostHandLib.framework in Frameworks */, 82 | ); 83 | runOnlyForDeploymentPostprocessing = 0; 84 | }; 85 | /* End PBXFrameworksBuildPhase section */ 86 | 87 | /* Begin PBXGroup section */ 88 | C9D30334235FF57F008593A9 = { 89 | isa = PBXGroup; 90 | children = ( 91 | C9D3033F235FF57F008593A9 /* GhostHandSample */, 92 | C9D30356235FF580008593A9 /* GhostHandSampleTests */, 93 | C9D30361235FF580008593A9 /* GhostHandSampleUITests */, 94 | C9D3033E235FF57F008593A9 /* Products */, 95 | C9D30370235FFCAF008593A9 /* Frameworks */, 96 | ); 97 | sourceTree = ""; 98 | }; 99 | C9D3033E235FF57F008593A9 /* Products */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | C9D3033D235FF57F008593A9 /* GhostHandSample.app */, 103 | C9D30353235FF580008593A9 /* GhostHandSampleTests.xctest */, 104 | C9D3035E235FF580008593A9 /* GhostHandSampleUITests.xctest */, 105 | ); 106 | name = Products; 107 | sourceTree = ""; 108 | }; 109 | C9D3033F235FF57F008593A9 /* GhostHandSample */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | C9D30340235FF57F008593A9 /* AppDelegate.swift */, 113 | C9D30342235FF57F008593A9 /* SceneDelegate.swift */, 114 | C9D30344235FF57F008593A9 /* ContentView.swift */, 115 | C9D30346235FF580008593A9 /* Assets.xcassets */, 116 | C9D3034B235FF580008593A9 /* LaunchScreen.storyboard */, 117 | C9D3034E235FF580008593A9 /* Info.plist */, 118 | C9D30348235FF580008593A9 /* Preview Content */, 119 | ); 120 | path = GhostHandSample; 121 | sourceTree = ""; 122 | }; 123 | C9D30348235FF580008593A9 /* Preview Content */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | C9D30349235FF580008593A9 /* Preview Assets.xcassets */, 127 | ); 128 | path = "Preview Content"; 129 | sourceTree = ""; 130 | }; 131 | C9D30356235FF580008593A9 /* GhostHandSampleTests */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | C9D30357235FF580008593A9 /* GhostHandSampleTests.swift */, 135 | C9D30359235FF580008593A9 /* Info.plist */, 136 | ); 137 | path = GhostHandSampleTests; 138 | sourceTree = ""; 139 | }; 140 | C9D30361235FF580008593A9 /* GhostHandSampleUITests */ = { 141 | isa = PBXGroup; 142 | children = ( 143 | C9D30364235FF580008593A9 /* Info.plist */, 144 | C9D30362235FF580008593A9 /* GhostHandSampleUITests.swift */, 145 | C985AA1F2373528B005EF98B /* GhostHandSampleUITests2.swift */, 146 | C985AA2123735296005EF98B /* GhostHandSampleUITests3.swift */, 147 | ); 148 | path = GhostHandSampleUITests; 149 | sourceTree = ""; 150 | }; 151 | C9D30370235FFCAF008593A9 /* Frameworks */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | C915CA8A236F712000165B9C /* GhostHandLib.framework */, 155 | C9EF972C2365101800D21618 /* GhostHandLib.framework */, 156 | C9D30371235FFCAF008593A9 /* GhostHandLib.framework */, 157 | ); 158 | name = Frameworks; 159 | sourceTree = ""; 160 | }; 161 | /* End PBXGroup section */ 162 | 163 | /* Begin PBXNativeTarget section */ 164 | C9D3033C235FF57F008593A9 /* GhostHandSample */ = { 165 | isa = PBXNativeTarget; 166 | buildConfigurationList = C9D30367235FF580008593A9 /* Build configuration list for PBXNativeTarget "GhostHandSample" */; 167 | buildPhases = ( 168 | C9D30339235FF57F008593A9 /* Sources */, 169 | C9D3033A235FF57F008593A9 /* Frameworks */, 170 | C9D3033B235FF57F008593A9 /* Resources */, 171 | ); 172 | buildRules = ( 173 | ); 174 | dependencies = ( 175 | ); 176 | name = GhostHandSample; 177 | productName = GhostHandSample; 178 | productReference = C9D3033D235FF57F008593A9 /* GhostHandSample.app */; 179 | productType = "com.apple.product-type.application"; 180 | }; 181 | C9D30352235FF580008593A9 /* GhostHandSampleTests */ = { 182 | isa = PBXNativeTarget; 183 | buildConfigurationList = C9D3036A235FF580008593A9 /* Build configuration list for PBXNativeTarget "GhostHandSampleTests" */; 184 | buildPhases = ( 185 | C9D3034F235FF580008593A9 /* Sources */, 186 | C9D30350235FF580008593A9 /* Frameworks */, 187 | C9D30351235FF580008593A9 /* Resources */, 188 | ); 189 | buildRules = ( 190 | ); 191 | dependencies = ( 192 | C9D30355235FF580008593A9 /* PBXTargetDependency */, 193 | ); 194 | name = GhostHandSampleTests; 195 | productName = GhostHandSampleTests; 196 | productReference = C9D30353235FF580008593A9 /* GhostHandSampleTests.xctest */; 197 | productType = "com.apple.product-type.bundle.unit-test"; 198 | }; 199 | C9D3035D235FF580008593A9 /* GhostHandSampleUITests */ = { 200 | isa = PBXNativeTarget; 201 | buildConfigurationList = C9D3036D235FF580008593A9 /* Build configuration list for PBXNativeTarget "GhostHandSampleUITests" */; 202 | buildPhases = ( 203 | C9D3035A235FF580008593A9 /* Sources */, 204 | C9D3035B235FF580008593A9 /* Frameworks */, 205 | C9D3035C235FF580008593A9 /* Resources */, 206 | C9EF972E2365103700D21618 /* Install app run script */, 207 | ); 208 | buildRules = ( 209 | ); 210 | dependencies = ( 211 | C9D30360235FF580008593A9 /* PBXTargetDependency */, 212 | ); 213 | name = GhostHandSampleUITests; 214 | productName = GhostHandSampleUITests; 215 | productReference = C9D3035E235FF580008593A9 /* GhostHandSampleUITests.xctest */; 216 | productType = "com.apple.product-type.bundle.ui-testing"; 217 | }; 218 | /* End PBXNativeTarget section */ 219 | 220 | /* Begin PBXProject section */ 221 | C9D30335235FF57F008593A9 /* Project object */ = { 222 | isa = PBXProject; 223 | attributes = { 224 | LastSwiftUpdateCheck = 1110; 225 | LastUpgradeCheck = 1110; 226 | ORGANIZATIONNAME = "Matt Stanford"; 227 | TargetAttributes = { 228 | C9D3033C235FF57F008593A9 = { 229 | CreatedOnToolsVersion = 11.1; 230 | }; 231 | C9D30352235FF580008593A9 = { 232 | CreatedOnToolsVersion = 11.1; 233 | TestTargetID = C9D3033C235FF57F008593A9; 234 | }; 235 | C9D3035D235FF580008593A9 = { 236 | CreatedOnToolsVersion = 11.1; 237 | TestTargetID = C9D3033C235FF57F008593A9; 238 | }; 239 | }; 240 | }; 241 | buildConfigurationList = C9D30338235FF57F008593A9 /* Build configuration list for PBXProject "GhostHandSample" */; 242 | compatibilityVersion = "Xcode 9.3"; 243 | developmentRegion = en; 244 | hasScannedForEncodings = 0; 245 | knownRegions = ( 246 | en, 247 | Base, 248 | ); 249 | mainGroup = C9D30334235FF57F008593A9; 250 | productRefGroup = C9D3033E235FF57F008593A9 /* Products */; 251 | projectDirPath = ""; 252 | projectRoot = ""; 253 | targets = ( 254 | C9D3033C235FF57F008593A9 /* GhostHandSample */, 255 | C9D30352235FF580008593A9 /* GhostHandSampleTests */, 256 | C9D3035D235FF580008593A9 /* GhostHandSampleUITests */, 257 | ); 258 | }; 259 | /* End PBXProject section */ 260 | 261 | /* Begin PBXResourcesBuildPhase section */ 262 | C9D3033B235FF57F008593A9 /* Resources */ = { 263 | isa = PBXResourcesBuildPhase; 264 | buildActionMask = 2147483647; 265 | files = ( 266 | C9D3034D235FF580008593A9 /* LaunchScreen.storyboard in Resources */, 267 | C9D3034A235FF580008593A9 /* Preview Assets.xcassets in Resources */, 268 | C9D30347235FF580008593A9 /* Assets.xcassets in Resources */, 269 | ); 270 | runOnlyForDeploymentPostprocessing = 0; 271 | }; 272 | C9D30351235FF580008593A9 /* Resources */ = { 273 | isa = PBXResourcesBuildPhase; 274 | buildActionMask = 2147483647; 275 | files = ( 276 | ); 277 | runOnlyForDeploymentPostprocessing = 0; 278 | }; 279 | C9D3035C235FF580008593A9 /* Resources */ = { 280 | isa = PBXResourcesBuildPhase; 281 | buildActionMask = 2147483647; 282 | files = ( 283 | ); 284 | runOnlyForDeploymentPostprocessing = 0; 285 | }; 286 | /* End PBXResourcesBuildPhase section */ 287 | 288 | /* Begin PBXShellScriptBuildPhase section */ 289 | C9EF972E2365103700D21618 /* Install app run script */ = { 290 | isa = PBXShellScriptBuildPhase; 291 | buildActionMask = 2147483647; 292 | files = ( 293 | ); 294 | inputFileListPaths = ( 295 | ); 296 | inputPaths = ( 297 | ); 298 | name = "Install app run script"; 299 | outputFileListPaths = ( 300 | ); 301 | outputPaths = ( 302 | ); 303 | runOnlyForDeploymentPostprocessing = 0; 304 | shellPath = /bin/sh; 305 | shellScript = "echo \"${SOURCE_ROOT}/../ghosthand_install.sh\"\n\"${SOURCE_ROOT}/../ghosthand_install.sh\"\n"; 306 | }; 307 | /* End PBXShellScriptBuildPhase section */ 308 | 309 | /* Begin PBXSourcesBuildPhase section */ 310 | C9D30339235FF57F008593A9 /* Sources */ = { 311 | isa = PBXSourcesBuildPhase; 312 | buildActionMask = 2147483647; 313 | files = ( 314 | C9D30341235FF57F008593A9 /* AppDelegate.swift in Sources */, 315 | C9D30343235FF57F008593A9 /* SceneDelegate.swift in Sources */, 316 | C9D30345235FF57F008593A9 /* ContentView.swift in Sources */, 317 | ); 318 | runOnlyForDeploymentPostprocessing = 0; 319 | }; 320 | C9D3034F235FF580008593A9 /* Sources */ = { 321 | isa = PBXSourcesBuildPhase; 322 | buildActionMask = 2147483647; 323 | files = ( 324 | C9D30358235FF580008593A9 /* GhostHandSampleTests.swift in Sources */, 325 | ); 326 | runOnlyForDeploymentPostprocessing = 0; 327 | }; 328 | C9D3035A235FF580008593A9 /* Sources */ = { 329 | isa = PBXSourcesBuildPhase; 330 | buildActionMask = 2147483647; 331 | files = ( 332 | C9D30363235FF580008593A9 /* GhostHandSampleUITests.swift in Sources */, 333 | C985AA2223735296005EF98B /* GhostHandSampleUITests3.swift in Sources */, 334 | C985AA202373528B005EF98B /* GhostHandSampleUITests2.swift in Sources */, 335 | ); 336 | runOnlyForDeploymentPostprocessing = 0; 337 | }; 338 | /* End PBXSourcesBuildPhase section */ 339 | 340 | /* Begin PBXTargetDependency section */ 341 | C9D30355235FF580008593A9 /* PBXTargetDependency */ = { 342 | isa = PBXTargetDependency; 343 | target = C9D3033C235FF57F008593A9 /* GhostHandSample */; 344 | targetProxy = C9D30354235FF580008593A9 /* PBXContainerItemProxy */; 345 | }; 346 | C9D30360235FF580008593A9 /* PBXTargetDependency */ = { 347 | isa = PBXTargetDependency; 348 | target = C9D3033C235FF57F008593A9 /* GhostHandSample */; 349 | targetProxy = C9D3035F235FF580008593A9 /* PBXContainerItemProxy */; 350 | }; 351 | /* End PBXTargetDependency section */ 352 | 353 | /* Begin PBXVariantGroup section */ 354 | C9D3034B235FF580008593A9 /* LaunchScreen.storyboard */ = { 355 | isa = PBXVariantGroup; 356 | children = ( 357 | C9D3034C235FF580008593A9 /* Base */, 358 | ); 359 | name = LaunchScreen.storyboard; 360 | sourceTree = ""; 361 | }; 362 | /* End PBXVariantGroup section */ 363 | 364 | /* Begin XCBuildConfiguration section */ 365 | C9D30365235FF580008593A9 /* Debug */ = { 366 | isa = XCBuildConfiguration; 367 | buildSettings = { 368 | ALWAYS_SEARCH_USER_PATHS = NO; 369 | CLANG_ANALYZER_NONNULL = YES; 370 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 371 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 372 | CLANG_CXX_LIBRARY = "libc++"; 373 | CLANG_ENABLE_MODULES = YES; 374 | CLANG_ENABLE_OBJC_ARC = YES; 375 | CLANG_ENABLE_OBJC_WEAK = YES; 376 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 377 | CLANG_WARN_BOOL_CONVERSION = YES; 378 | CLANG_WARN_COMMA = YES; 379 | CLANG_WARN_CONSTANT_CONVERSION = YES; 380 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 381 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 382 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 383 | CLANG_WARN_EMPTY_BODY = YES; 384 | CLANG_WARN_ENUM_CONVERSION = YES; 385 | CLANG_WARN_INFINITE_RECURSION = YES; 386 | CLANG_WARN_INT_CONVERSION = YES; 387 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 388 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 389 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 390 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 391 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 392 | CLANG_WARN_STRICT_PROTOTYPES = YES; 393 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 394 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 395 | CLANG_WARN_UNREACHABLE_CODE = YES; 396 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 397 | COPY_PHASE_STRIP = NO; 398 | DEBUG_INFORMATION_FORMAT = dwarf; 399 | ENABLE_STRICT_OBJC_MSGSEND = YES; 400 | ENABLE_TESTABILITY = YES; 401 | GCC_C_LANGUAGE_STANDARD = gnu11; 402 | GCC_DYNAMIC_NO_PIC = NO; 403 | GCC_NO_COMMON_BLOCKS = YES; 404 | GCC_OPTIMIZATION_LEVEL = 0; 405 | GCC_PREPROCESSOR_DEFINITIONS = ( 406 | "DEBUG=1", 407 | "$(inherited)", 408 | ); 409 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 410 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 411 | GCC_WARN_UNDECLARED_SELECTOR = YES; 412 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 413 | GCC_WARN_UNUSED_FUNCTION = YES; 414 | GCC_WARN_UNUSED_VARIABLE = YES; 415 | IPHONEOS_DEPLOYMENT_TARGET = 13.1; 416 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 417 | MTL_FAST_MATH = YES; 418 | ONLY_ACTIVE_ARCH = YES; 419 | SDKROOT = iphoneos; 420 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 421 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 422 | }; 423 | name = Debug; 424 | }; 425 | C9D30366235FF580008593A9 /* Release */ = { 426 | isa = XCBuildConfiguration; 427 | buildSettings = { 428 | ALWAYS_SEARCH_USER_PATHS = NO; 429 | CLANG_ANALYZER_NONNULL = YES; 430 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 431 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 432 | CLANG_CXX_LIBRARY = "libc++"; 433 | CLANG_ENABLE_MODULES = YES; 434 | CLANG_ENABLE_OBJC_ARC = YES; 435 | CLANG_ENABLE_OBJC_WEAK = YES; 436 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 437 | CLANG_WARN_BOOL_CONVERSION = YES; 438 | CLANG_WARN_COMMA = YES; 439 | CLANG_WARN_CONSTANT_CONVERSION = YES; 440 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 441 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 442 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 443 | CLANG_WARN_EMPTY_BODY = YES; 444 | CLANG_WARN_ENUM_CONVERSION = YES; 445 | CLANG_WARN_INFINITE_RECURSION = YES; 446 | CLANG_WARN_INT_CONVERSION = YES; 447 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 448 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 449 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 450 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 451 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 452 | CLANG_WARN_STRICT_PROTOTYPES = YES; 453 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 454 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 455 | CLANG_WARN_UNREACHABLE_CODE = YES; 456 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 457 | COPY_PHASE_STRIP = NO; 458 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 459 | ENABLE_NS_ASSERTIONS = NO; 460 | ENABLE_STRICT_OBJC_MSGSEND = YES; 461 | GCC_C_LANGUAGE_STANDARD = gnu11; 462 | GCC_NO_COMMON_BLOCKS = YES; 463 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 464 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 465 | GCC_WARN_UNDECLARED_SELECTOR = YES; 466 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 467 | GCC_WARN_UNUSED_FUNCTION = YES; 468 | GCC_WARN_UNUSED_VARIABLE = YES; 469 | IPHONEOS_DEPLOYMENT_TARGET = 13.1; 470 | MTL_ENABLE_DEBUG_INFO = NO; 471 | MTL_FAST_MATH = YES; 472 | SDKROOT = iphoneos; 473 | SWIFT_COMPILATION_MODE = wholemodule; 474 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 475 | VALIDATE_PRODUCT = YES; 476 | }; 477 | name = Release; 478 | }; 479 | C9D30368235FF580008593A9 /* Debug */ = { 480 | isa = XCBuildConfiguration; 481 | buildSettings = { 482 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 483 | CODE_SIGN_STYLE = Automatic; 484 | DEVELOPMENT_ASSET_PATHS = "\"GhostHandSample/Preview Content\""; 485 | DEVELOPMENT_TEAM = 735H4JCR7N; 486 | ENABLE_PREVIEWS = YES; 487 | INFOPLIST_FILE = GhostHandSample/Info.plist; 488 | LD_RUNPATH_SEARCH_PATHS = ( 489 | "$(inherited)", 490 | "@executable_path/Frameworks", 491 | ); 492 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandSample; 493 | PRODUCT_NAME = "$(TARGET_NAME)"; 494 | SWIFT_VERSION = 5.0; 495 | TARGETED_DEVICE_FAMILY = "1,2"; 496 | }; 497 | name = Debug; 498 | }; 499 | C9D30369235FF580008593A9 /* Release */ = { 500 | isa = XCBuildConfiguration; 501 | buildSettings = { 502 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 503 | CODE_SIGN_STYLE = Automatic; 504 | DEVELOPMENT_ASSET_PATHS = "\"GhostHandSample/Preview Content\""; 505 | DEVELOPMENT_TEAM = 735H4JCR7N; 506 | ENABLE_PREVIEWS = YES; 507 | INFOPLIST_FILE = GhostHandSample/Info.plist; 508 | LD_RUNPATH_SEARCH_PATHS = ( 509 | "$(inherited)", 510 | "@executable_path/Frameworks", 511 | ); 512 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandSample; 513 | PRODUCT_NAME = "$(TARGET_NAME)"; 514 | SWIFT_VERSION = 5.0; 515 | TARGETED_DEVICE_FAMILY = "1,2"; 516 | }; 517 | name = Release; 518 | }; 519 | C9D3036B235FF580008593A9 /* Debug */ = { 520 | isa = XCBuildConfiguration; 521 | buildSettings = { 522 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 523 | BUNDLE_LOADER = "$(TEST_HOST)"; 524 | CODE_SIGN_STYLE = Automatic; 525 | DEVELOPMENT_TEAM = 735H4JCR7N; 526 | INFOPLIST_FILE = GhostHandSampleTests/Info.plist; 527 | IPHONEOS_DEPLOYMENT_TARGET = 13.1; 528 | LD_RUNPATH_SEARCH_PATHS = ( 529 | "$(inherited)", 530 | "@executable_path/Frameworks", 531 | "@loader_path/Frameworks", 532 | ); 533 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandSampleTests; 534 | PRODUCT_NAME = "$(TARGET_NAME)"; 535 | SWIFT_VERSION = 5.0; 536 | TARGETED_DEVICE_FAMILY = "1,2"; 537 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GhostHandSample.app/GhostHandSample"; 538 | }; 539 | name = Debug; 540 | }; 541 | C9D3036C235FF580008593A9 /* Release */ = { 542 | isa = XCBuildConfiguration; 543 | buildSettings = { 544 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 545 | BUNDLE_LOADER = "$(TEST_HOST)"; 546 | CODE_SIGN_STYLE = Automatic; 547 | DEVELOPMENT_TEAM = 735H4JCR7N; 548 | INFOPLIST_FILE = GhostHandSampleTests/Info.plist; 549 | IPHONEOS_DEPLOYMENT_TARGET = 13.1; 550 | LD_RUNPATH_SEARCH_PATHS = ( 551 | "$(inherited)", 552 | "@executable_path/Frameworks", 553 | "@loader_path/Frameworks", 554 | ); 555 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandSampleTests; 556 | PRODUCT_NAME = "$(TARGET_NAME)"; 557 | SWIFT_VERSION = 5.0; 558 | TARGETED_DEVICE_FAMILY = "1,2"; 559 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GhostHandSample.app/GhostHandSample"; 560 | }; 561 | name = Release; 562 | }; 563 | C9D3036E235FF580008593A9 /* Debug */ = { 564 | isa = XCBuildConfiguration; 565 | buildSettings = { 566 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 567 | CODE_SIGN_STYLE = Automatic; 568 | DEVELOPMENT_TEAM = 735H4JCR7N; 569 | INFOPLIST_FILE = GhostHandSampleUITests/Info.plist; 570 | LD_RUNPATH_SEARCH_PATHS = ( 571 | "$(inherited)", 572 | "@executable_path/Frameworks", 573 | "@loader_path/Frameworks", 574 | ); 575 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandSampleUITests; 576 | PRODUCT_NAME = "$(TARGET_NAME)"; 577 | SWIFT_VERSION = 5.0; 578 | TARGETED_DEVICE_FAMILY = "1,2"; 579 | TEST_TARGET_NAME = GhostHandSample; 580 | }; 581 | name = Debug; 582 | }; 583 | C9D3036F235FF580008593A9 /* Release */ = { 584 | isa = XCBuildConfiguration; 585 | buildSettings = { 586 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 587 | CODE_SIGN_STYLE = Automatic; 588 | DEVELOPMENT_TEAM = 735H4JCR7N; 589 | INFOPLIST_FILE = GhostHandSampleUITests/Info.plist; 590 | LD_RUNPATH_SEARCH_PATHS = ( 591 | "$(inherited)", 592 | "@executable_path/Frameworks", 593 | "@loader_path/Frameworks", 594 | ); 595 | PRODUCT_BUNDLE_IDENTIFIER = com.mattstanford.GhostHandSampleUITests; 596 | PRODUCT_NAME = "$(TARGET_NAME)"; 597 | SWIFT_VERSION = 5.0; 598 | TARGETED_DEVICE_FAMILY = "1,2"; 599 | TEST_TARGET_NAME = GhostHandSample; 600 | }; 601 | name = Release; 602 | }; 603 | /* End XCBuildConfiguration section */ 604 | 605 | /* Begin XCConfigurationList section */ 606 | C9D30338235FF57F008593A9 /* Build configuration list for PBXProject "GhostHandSample" */ = { 607 | isa = XCConfigurationList; 608 | buildConfigurations = ( 609 | C9D30365235FF580008593A9 /* Debug */, 610 | C9D30366235FF580008593A9 /* Release */, 611 | ); 612 | defaultConfigurationIsVisible = 0; 613 | defaultConfigurationName = Release; 614 | }; 615 | C9D30367235FF580008593A9 /* Build configuration list for PBXNativeTarget "GhostHandSample" */ = { 616 | isa = XCConfigurationList; 617 | buildConfigurations = ( 618 | C9D30368235FF580008593A9 /* Debug */, 619 | C9D30369235FF580008593A9 /* Release */, 620 | ); 621 | defaultConfigurationIsVisible = 0; 622 | defaultConfigurationName = Release; 623 | }; 624 | C9D3036A235FF580008593A9 /* Build configuration list for PBXNativeTarget "GhostHandSampleTests" */ = { 625 | isa = XCConfigurationList; 626 | buildConfigurations = ( 627 | C9D3036B235FF580008593A9 /* Debug */, 628 | C9D3036C235FF580008593A9 /* Release */, 629 | ); 630 | defaultConfigurationIsVisible = 0; 631 | defaultConfigurationName = Release; 632 | }; 633 | C9D3036D235FF580008593A9 /* Build configuration list for PBXNativeTarget "GhostHandSampleUITests" */ = { 634 | isa = XCConfigurationList; 635 | buildConfigurations = ( 636 | C9D3036E235FF580008593A9 /* Debug */, 637 | C9D3036F235FF580008593A9 /* Release */, 638 | ); 639 | defaultConfigurationIsVisible = 0; 640 | defaultConfigurationName = Release; 641 | }; 642 | /* End XCConfigurationList section */ 643 | }; 644 | rootObject = C9D30335235FF57F008593A9 /* Project object */; 645 | } 646 | -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSample/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // GhostHandSample 4 | // 5 | // Created by Matt Stanford on 10/22/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | // MARK: UISceneSession Lifecycle 22 | 23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 24 | // Called when a new scene session is being created. 25 | // Use this method to select a configuration to create the new scene with. 26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 27 | } 28 | 29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { 30 | // Called when the user discards a scene session. 31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 33 | } 34 | 35 | 36 | } 37 | 38 | -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSample/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSample/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSample/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSample/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // GhostHandSample 4 | // 5 | // Created by Matt Stanford on 10/22/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ContentView: View { 12 | var body: some View { 13 | Text("Sample App for 👻") 14 | } 15 | } 16 | 17 | struct ContentView_Previews: PreviewProvider { 18 | static var previews: some View { 19 | ContentView() 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleURLTypes 20 | 21 | 22 | CFBundleTypeRole 23 | Editor 24 | CFBundleURLName 25 | testScheme 26 | CFBundleURLSchemes 27 | 28 | ghostHandSampleApp 29 | 30 | 31 | 32 | CFBundleVersion 33 | 1 34 | LSRequiresIPhoneOS 35 | 36 | UIApplicationSceneManifest 37 | 38 | UIApplicationSupportsMultipleScenes 39 | 40 | UISceneConfigurations 41 | 42 | UIWindowSceneSessionRoleApplication 43 | 44 | 45 | UISceneConfigurationName 46 | Default Configuration 47 | UISceneDelegateClassName 48 | $(PRODUCT_MODULE_NAME).SceneDelegate 49 | 50 | 51 | 52 | 53 | UILaunchStoryboardName 54 | LaunchScreen 55 | UIRequiredDeviceCapabilities 56 | 57 | armv7 58 | 59 | UISupportedInterfaceOrientations 60 | 61 | UIInterfaceOrientationPortrait 62 | UIInterfaceOrientationLandscapeLeft 63 | UIInterfaceOrientationLandscapeRight 64 | 65 | UISupportedInterfaceOrientations~ipad 66 | 67 | UIInterfaceOrientationPortrait 68 | UIInterfaceOrientationPortraitUpsideDown 69 | UIInterfaceOrientationLandscapeLeft 70 | UIInterfaceOrientationLandscapeRight 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSample/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSample/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // GhostHandSample 4 | // 5 | // Created by Matt Stanford on 10/22/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SwiftUI 11 | 12 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 18 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 19 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 20 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 21 | 22 | // Create the SwiftUI view that provides the window contents. 23 | let contentView = ContentView() 24 | 25 | // Use a UIHostingController as window root view controller. 26 | if let windowScene = scene as? UIWindowScene { 27 | let window = UIWindow(windowScene: windowScene) 28 | window.rootViewController = UIHostingController(rootView: contentView) 29 | self.window = window 30 | window.makeKeyAndVisible() 31 | } 32 | } 33 | 34 | func sceneDidDisconnect(_ scene: UIScene) { 35 | // Called as the scene is being released by the system. 36 | // This occurs shortly after the scene enters the background, or when its session is discarded. 37 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 38 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). 39 | } 40 | 41 | func sceneDidBecomeActive(_ scene: UIScene) { 42 | // Called when the scene has moved from an inactive state to an active state. 43 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 44 | } 45 | 46 | func sceneWillResignActive(_ scene: UIScene) { 47 | // Called when the scene will move from an active state to an inactive state. 48 | // This may occur due to temporary interruptions (ex. an incoming phone call). 49 | } 50 | 51 | func sceneWillEnterForeground(_ scene: UIScene) { 52 | // Called as the scene transitions from the background to the foreground. 53 | // Use this method to undo the changes made on entering the background. 54 | } 55 | 56 | func sceneDidEnterBackground(_ scene: UIScene) { 57 | // Called as the scene transitions from the foreground to the background. 58 | // Use this method to save data, release shared resources, and store enough scene-specific state information 59 | // to restore the scene back to its current state. 60 | } 61 | 62 | 63 | } 64 | 65 | -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSampleTests/GhostHandSampleTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GhostHandSampleTests.swift 3 | // GhostHandSampleTests 4 | // 5 | // Created by Matt Stanford on 10/22/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import GhostHandSample 11 | 12 | class GhostHandSampleTests: XCTestCase { 13 | 14 | override func setUp() { 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | } 17 | 18 | override func tearDown() { 19 | // Put teardown code here. This method is called after the invocation of each test method in the class. 20 | } 21 | 22 | func testExample() { 23 | // This is an example of a functional test case. 24 | // Use XCTAssert and related functions to verify your tests produce the correct results. 25 | } 26 | 27 | func testPerformanceExample() { 28 | // This is an example of a performance test case. 29 | self.measure { 30 | // Put the code you want to measure the time of here. 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSampleTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSampleUITests/GhostHandSampleUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GhostHandSampleUITests.swift 3 | // GhostHandSampleUITests 4 | // 5 | // Created by Matt Stanford on 10/22/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import GhostHandLib 11 | 12 | class GhostHandSampleUITests: XCTestCase { 13 | 14 | let app = XCUIApplication() 15 | 16 | 17 | func testSample() { 18 | app.launch() 19 | let appBooted = app.staticTexts["Sample App for 👻"].waitForExistence(timeout: 5) 20 | XCTAssert(appBooted) 21 | 22 | //Tap the home button to put the app under test in the background 23 | XCUIDevice.shared.press(XCUIDevice.Button.home) 24 | 25 | //Use the GhostHand companion app to launch the custom scheme 26 | GhostHand.launch(url: "ghostHandSampleApp://TEST") 27 | 28 | //The app should be called by the GhostHand companion app 29 | let appShowedAgain = app.staticTexts["Sample App for 👻"].waitForExistence(timeout: 5) 30 | XCTAssert(appShowedAgain) 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSampleUITests/GhostHandSampleUITests2.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GhostHandSampleUITests2.swift 3 | // GhostHandSampleUITests 4 | // 5 | // Created by Matt Stanford on 11/6/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import GhostHandLib 11 | 12 | class GhostHandSampleUITests2: XCTestCase { 13 | 14 | let app = XCUIApplication() 15 | 16 | 17 | func testSample() { 18 | app.launch() 19 | let appBooted = app.staticTexts["Sample App for 👻"].waitForExistence(timeout: 5) 20 | XCTAssert(appBooted) 21 | 22 | //Tap the home button to put the app under test in the background 23 | XCUIDevice.shared.press(XCUIDevice.Button.home) 24 | 25 | //Use the GhostHand companion app to launch the custom scheme 26 | GhostHand.launch(url: "ghostHandSampleApp://TEST") 27 | 28 | //The app should be called by the GhostHand companion app 29 | let appShowedAgain = app.staticTexts["Sample App for 👻"].waitForExistence(timeout: 5) 30 | XCTAssert(appShowedAgain) 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSampleUITests/GhostHandSampleUITests3.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GhostHandSampleUITests3.swift 3 | // GhostHandSampleUITests 4 | // 5 | // Created by Matt Stanford on 11/6/19. 6 | // Copyright © 2019 Matt Stanford. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import GhostHandLib 11 | 12 | /* 13 | Duplicate of other UI test class so we can test multiple cloned simulators 14 | */ 15 | 16 | class GhostHandSampleUITests3: XCTestCase { 17 | 18 | let app = XCUIApplication() 19 | 20 | 21 | func testSample() { 22 | app.launch() 23 | let appBooted = app.staticTexts["Sample App for 👻"].waitForExistence(timeout: 5) 24 | XCTAssert(appBooted) 25 | 26 | //Tap the home button to put the app under test in the background 27 | XCUIDevice.shared.press(XCUIDevice.Button.home) 28 | 29 | //Use the GhostHand companion app to launch the custom scheme 30 | GhostHand.launch(url: "ghostHandSampleApp://TEST") 31 | 32 | //The app should be called by the GhostHand companion app 33 | let appShowedAgain = app.staticTexts["Sample App for 👻"].waitForExistence(timeout: 5) 34 | XCTAssert(appShowedAgain) 35 | 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /GhostHandSample/GhostHandSampleUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2020 Matt Stanford 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.3 2 | import PackageDescription 3 | 4 | let package = Package( 5 | name: "GhostHand", 6 | platforms: [ 7 | .iOS(.v10) 8 | ], 9 | products: [ 10 | // Products define the executables and libraries a package produces, and make them visible to other packages. 11 | .library( 12 | name: "GhostHandLib", 13 | targets: ["GhostHandLib"]) 14 | ], 15 | dependencies: [ 16 | // Dependencies declare other packages that this package depends on. 17 | ], 18 | targets: [ 19 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 20 | // Targets can depend on other targets in this package, and on products in packages this package depends on. 21 | .target( 22 | name: "GhostHandLib", 23 | path: "GhostHand/GhostHandLib/Classes/", 24 | resources: [ 25 | .copy("GhostHand/GhostHandLib/Built_Product/GhostHand.app"), 26 | .copy("ghosthand_install.sh") 27 | ] 28 | ) 29 | ] 30 | ) 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # GhostHand 👻 3 | 4 | Have you ever tried to test custom schemes or universal links with XCUITest? You may have tried to use one of the simulator's built in apps (like Messages of Safari), but encountered frustration. With Apple changing up these apps on the simulator all the time, it's like trying to hit a moving target. 5 | 6 | But what if there was an easy, reliable and FAST way to test custom schemes/universal links? That's where GhostHand comes in! The GhostHand library contains a pre-built app that will install itself on your simulator. Just call the GhostHandLib's static function, and it will open the companion app with your supplied URL, and will call `UIApplication.shared.open(url`:)` on open. This should work for both custom schemes and universal links. 7 | 8 | ## Installation 9 | 10 | Currently GhostHand supports Swift Package Manager, CocoaPods, Carthage, and manual installs 11 | 12 | ### Swift Package Manager 13 | 14 | Click File->Swift Packages->Add Package Dependency..., and add this Github URL as your source URL. Make sure to add it to your **UI Test Target**. 15 | 16 | Then go to your **UI Test Target** in Xcode, click `Build Phases`, and add a new run script with the following code: 17 | 18 | ``` 19 | "${BUILD_DIR%Build/*}/SourcePackages/checkouts/GhostHand/ghosthand_install.sh" 20 | ``` 21 | ### Cocoapods 22 | 23 | First add the GhostHand pod to your project's **UI Test Target** in your `Podfile`: 24 | 25 | ``` 26 | target 'MyProjectUITests' do 27 | # Other UI Test pods.... 28 | pod 'GhostHand' 29 | end 30 | ``` 31 | 32 | Then go to your **UI Test Target** in Xcode, click `Build Phases`, and add a new run script with the following code: 33 | 34 | ``` 35 | "${PODS_ROOT}/GhostHand/ghosthand_install.sh" 36 | ``` 37 | 38 | ### Carthage 39 | 40 | Add the GhostHand library to your Cartfile: 41 | 42 | ``` 43 | github "mattstanford/GhostHand" 44 | ``` 45 | 46 | After you've linked the library properly to your **UI Test Target**, click on the project in Xcode, select the UI Test Target, click `Build Phases`, and add a new run script with the following code: 47 | 48 | ``` 49 | "${PROJECT_DIR}/Carthage/Build/iOS/GhostHandLib.framework/ghosthand_install.sh" 50 | ``` 51 | 52 | ### Manual Install 53 | 54 | Link the `GhostHandLib` framework to your **UI Test Target** appropriately, click on the project in Xcode, select the UI Test Target, click `Build Phases`, and add a new run script with the following code: 55 | 56 | ``` 57 | "/ghosthand_install.sh" 58 | ``` 59 | 60 | 61 | ## Usage 62 | 63 | Once GhostHand is setup on your UI Test Target appropriately, it's time to put it into action! 64 | 65 | Here's a simple UI Test that exercises GhostHand. Note that we are assuming the app being tested here has the custom scheme `myApp://` registered in the info.plist properly: 66 | 67 | ```swift 68 | 69 | func testSample() { 70 | let app = XCUIApplication() 71 | 72 | app.launch() 73 | let appBooted = app.staticTexts["Sample App for 👻"].waitForExistence(timeout: 5) 74 | XCTAssert(appBooted) 75 | 76 | //Tap the home button to put the app under test in the background 77 | XCUIDevice.shared.press(XCUIDevice.Button.home) 78 | 79 | //Use the GhostHand companion app to launch the custom scheme 80 | GhostHand.launch(url: "myApp://TEST") 81 | 82 | //The app should be called by the GhostHand companion app 83 | let appShowedAgain = app.staticTexts["Sample App for 👻"].waitForExistence(timeout: 5) 84 | XCTAssert(appShowedAgain) 85 | } 86 | ``` 87 | -------------------------------------------------------------------------------- /ghosthand_install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | #First find the app in the wrapper framework 4 | scriptLocation=`dirName $0` 5 | appLocation=`find $scriptLocation -name "GhostHand.app" | head -n 1` 6 | 7 | #First boot the simulator we are running against 8 | xcrun simctl boot "${TARGET_DEVICE_IDENTIFIER}" 9 | 10 | #Install the app 11 | echo xcrun simctl install ${TARGET_DEVICE_IDENTIFIER} $appLocation 12 | xcrun simctl install ${TARGET_DEVICE_IDENTIFIER} $appLocation 13 | 14 | #Install on any running clones managed by Xcode (if running test in parallel) 15 | xcrun simctl --set testing list devices | \ 16 | grep "(Booted)" | \ 17 | grep -E -o -i "([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})" | \ 18 | while read deviceUuid ; do xcrun simctl --set testing install $deviceUuid $appLocation ; done 19 | 20 | 21 | 22 | exit 0 23 | 24 | --------------------------------------------------------------------------------