├── .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 |
--------------------------------------------------------------------------------