├── FaceID mask
├── AppDelegate.swift
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── Info.plist
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
└── ViewController.swift
├── FaceID mask.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
├── xcuserdata
│ └── simonwesterlund.xcuserdatad
│ │ ├── xcschemes
│ │ └── xcschememanagement.plist
│ │ └── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
└── project.pbxproj
├── README.md
└── LICENSE
/FaceID mask/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 |
3 | @UIApplicationMain
4 | class AppDelegate: UIResponder, UIApplicationDelegate {
5 | var window: UIWindow?
6 | }
7 |
8 |
--------------------------------------------------------------------------------
/FaceID mask.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/FaceID mask.xcodeproj/xcuserdata/simonwesterlund.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | FaceID mask.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # faceid-to-stl
2 | Inspired by articles like
3 | ["Face ID beaten by mask, not an effective security measure"](http://www.bkav.com/d/top-news/-/view_content/content/103968/face-id-beaten-by-mask-not-an-effective-security-measure),
4 | this iOS app that uses the face scanning feature of the iPhone X to create a [STL file](https://en.wikipedia.org/wiki/STL_(file_format)) that can be printed with a 3D printer.
5 |
6 | 
7 |
8 | ## Usage
9 | - Build the app
10 | - Run it on your shiny iPhone X
11 | - Whenever you're satisfied with the image on screen, tap capture
12 | - A STL file will be created and presented in a share sheet, push it somewhere nice
13 | - Use something like [Free online STL viewer](https://www.viewstl.com/) to look at the result
14 |
15 |
16 | ## Credit
17 | - [@westerlund](https://github.com/westerlund)
18 | - [@heinrisch](https://github.com/heinrisch)
19 |
--------------------------------------------------------------------------------
/FaceID mask.xcodeproj/xcuserdata/simonwesterlund.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
8 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Simon Westerlund & Henrik Sandström
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/FaceID mask/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 |
--------------------------------------------------------------------------------
/FaceID mask/Base.lproj/Main.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 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/FaceID mask/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 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | NSCameraUsageDescription
24 | This application will use the camera for Augmented Reality.
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 | arkit
33 |
34 | UIStatusBarHidden
35 |
36 | UISupportedInterfaceOrientations
37 |
38 | UIInterfaceOrientationPortrait
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UISupportedInterfaceOrientations~ipad
43 |
44 | UIInterfaceOrientationPortrait
45 | UIInterfaceOrientationPortraitUpsideDown
46 | UIInterfaceOrientationLandscapeLeft
47 | UIInterfaceOrientationLandscapeRight
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/FaceID mask/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 | "info" : {
90 | "version" : 1,
91 | "author" : "xcode"
92 | }
93 | }
--------------------------------------------------------------------------------
/FaceID mask/ViewController.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import SceneKit
3 | import ARKit
4 |
5 | protocol VirtualFaceContent {
6 | func update(withFaceAnchor: ARFaceAnchor)
7 | }
8 |
9 | typealias VirtualFaceNode = VirtualFaceContent & SCNNode
10 |
11 | class Mask: SCNNode, VirtualFaceContent {
12 |
13 | init(geometry: ARSCNFaceGeometry) {
14 | let material = geometry.firstMaterial!
15 |
16 | material.diffuse.contents = UIColor.lightGray
17 | material.lightingModel = .physicallyBased
18 |
19 | super.init()
20 | self.geometry = geometry
21 | }
22 |
23 | required init?(coder aDecoder: NSCoder) {
24 | fatalError("\(#function) has not been implemented")
25 | }
26 |
27 | func update(withFaceAnchor anchor: ARFaceAnchor) {
28 | let faceGeometry = geometry as! ARSCNFaceGeometry
29 | faceGeometry.update(from: anchor.geometry)
30 | }
31 | }
32 |
33 | class ViewController: UIViewController, ARSCNViewDelegate {
34 |
35 | @IBOutlet var sceneView: ARSCNView!
36 | private var isPresentingShareSheet = false
37 | private var mask: Mask?
38 | private var lastFaceAnchor: ARFaceAnchor?
39 |
40 | override func viewDidLoad() {
41 | super.viewDidLoad()
42 |
43 | sceneView.delegate = self
44 | startSession()
45 |
46 | let button = UIButton(type: .custom)
47 | button.setTitle("Capture", for: .normal)
48 | button.tintColor = .black
49 | button.titleLabel?.textColor = .black
50 | button.backgroundColor = .lightGray
51 | button.addTarget(self, action: #selector(capture), for: .touchUpInside)
52 | button.layer.cornerRadius = 12
53 | view.addSubview(button)
54 |
55 | button.translatesAutoresizingMaskIntoConstraints = false
56 | let constraints: [NSLayoutConstraint] = [
57 | button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
58 | button.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40),
59 | button.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
60 | button.heightAnchor.constraint(equalToConstant: 55)
61 | ]
62 | view.addConstraints(constraints)
63 | }
64 |
65 | func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
66 | let device = sceneView.device!
67 | let maskGeometry = ARSCNFaceGeometry(device: device)!
68 | mask = Mask(geometry: maskGeometry)
69 |
70 | node.addChildNode(mask!)
71 |
72 | }
73 |
74 | func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
75 | guard let faceAnchor = anchor as? ARFaceAnchor else { return }
76 | mask?.update(withFaceAnchor: faceAnchor)
77 |
78 | if let faceAnchor = anchor as? ARFaceAnchor {
79 | lastFaceAnchor = faceAnchor
80 | }
81 | }
82 |
83 | private func startSession() {
84 | sceneView.scene.rootNode.childNodes.forEach {
85 | $0.removeFromParentNode()
86 | }
87 |
88 | let configuration = ARFaceTrackingConfiguration()
89 | configuration.isLightEstimationEnabled = true
90 | sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
91 | }
92 |
93 | @objc
94 | private func capture() {
95 | guard let faceAnchor = lastFaceAnchor else {
96 | return
97 | }
98 |
99 | let data = createSTL(from: faceAnchor)
100 | let url = generateURL(for: data)
101 | presentShareSheet(with: url)
102 | }
103 |
104 | private func createSTL(from faceAnchor: ARFaceAnchor) -> Data {
105 |
106 | let mapped = faceAnchor.geometry.triangleIndices.map { i in
107 | return faceAnchor.geometry.vertices[Int(i)]
108 | }
109 |
110 | var out: [String] = ["solid face"]
111 | mapped.enumerated().forEach { i, vertex in
112 | if i % 3 == 0 {
113 | out.append("facet normal 0 0 0")
114 | out.append("\touter loop")
115 | }
116 |
117 | out.append("\t\tvertex \(vertex.x) \(vertex.y) \(vertex.z)")
118 |
119 | if i % 3 == 2 {
120 | out.append("\tendloop")
121 | }
122 | }
123 |
124 | out.append("endsolid face")
125 |
126 | let file = out.joined(separator: "\n")
127 | let data = file.data(using: .ascii)!
128 | return data
129 | }
130 |
131 | private func generateURL(for data: Data) -> URL {
132 | let url = URL(fileURLWithPath: NSTemporaryDirectory() + "face.stl")
133 | try! data.write(to: url)
134 | return url
135 | }
136 |
137 | private func presentShareSheet(with url: URL) {
138 | self.isPresentingShareSheet = true
139 | DispatchQueue.main.async {
140 | let activityViewController = UIActivityViewController(activityItems: [url], applicationActivities: nil)
141 | activityViewController.completionWithItemsHandler = { _, _, _, _ in
142 | self.isPresentingShareSheet = false
143 | }
144 | self.present(activityViewController, animated: true, completion: nil)
145 | }
146 | }
147 | }
148 |
--------------------------------------------------------------------------------
/FaceID mask.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 48;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 80C92C111FBB9C0100BA93FE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80C92C101FBB9C0100BA93FE /* AppDelegate.swift */; };
11 | 80C92C151FBB9C0100BA93FE /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80C92C141FBB9C0100BA93FE /* ViewController.swift */; };
12 | 80C92C181FBB9C0100BA93FE /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 80C92C161FBB9C0100BA93FE /* Main.storyboard */; };
13 | 80C92C1A1FBB9C0100BA93FE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 80C92C191FBB9C0100BA93FE /* Assets.xcassets */; };
14 | 80C92C1D1FBB9C0100BA93FE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 80C92C1B1FBB9C0100BA93FE /* LaunchScreen.storyboard */; };
15 | /* End PBXBuildFile section */
16 |
17 | /* Begin PBXFileReference section */
18 | 80C92C0D1FBB9C0100BA93FE /* FaceID mask.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "FaceID mask.app"; sourceTree = BUILT_PRODUCTS_DIR; };
19 | 80C92C101FBB9C0100BA93FE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
20 | 80C92C141FBB9C0100BA93FE /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
21 | 80C92C171FBB9C0100BA93FE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
22 | 80C92C191FBB9C0100BA93FE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
23 | 80C92C1C1FBB9C0100BA93FE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
24 | 80C92C1E1FBB9C0100BA93FE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
25 | /* End PBXFileReference section */
26 |
27 | /* Begin PBXFrameworksBuildPhase section */
28 | 80C92C0A1FBB9C0100BA93FE /* Frameworks */ = {
29 | isa = PBXFrameworksBuildPhase;
30 | buildActionMask = 2147483647;
31 | files = (
32 | );
33 | runOnlyForDeploymentPostprocessing = 0;
34 | };
35 | /* End PBXFrameworksBuildPhase section */
36 |
37 | /* Begin PBXGroup section */
38 | 80C92C041FBB9C0100BA93FE = {
39 | isa = PBXGroup;
40 | children = (
41 | 80C92C0F1FBB9C0100BA93FE /* FaceID mask */,
42 | 80C92C0E1FBB9C0100BA93FE /* Products */,
43 | );
44 | sourceTree = "";
45 | };
46 | 80C92C0E1FBB9C0100BA93FE /* Products */ = {
47 | isa = PBXGroup;
48 | children = (
49 | 80C92C0D1FBB9C0100BA93FE /* FaceID mask.app */,
50 | );
51 | name = Products;
52 | sourceTree = "";
53 | };
54 | 80C92C0F1FBB9C0100BA93FE /* FaceID mask */ = {
55 | isa = PBXGroup;
56 | children = (
57 | 80C92C101FBB9C0100BA93FE /* AppDelegate.swift */,
58 | 80C92C141FBB9C0100BA93FE /* ViewController.swift */,
59 | 80C92C161FBB9C0100BA93FE /* Main.storyboard */,
60 | 80C92C191FBB9C0100BA93FE /* Assets.xcassets */,
61 | 80C92C1B1FBB9C0100BA93FE /* LaunchScreen.storyboard */,
62 | 80C92C1E1FBB9C0100BA93FE /* Info.plist */,
63 | );
64 | path = "FaceID mask";
65 | sourceTree = "";
66 | };
67 | /* End PBXGroup section */
68 |
69 | /* Begin PBXNativeTarget section */
70 | 80C92C0C1FBB9C0100BA93FE /* FaceID mask */ = {
71 | isa = PBXNativeTarget;
72 | buildConfigurationList = 80C92C211FBB9C0100BA93FE /* Build configuration list for PBXNativeTarget "FaceID mask" */;
73 | buildPhases = (
74 | 80C92C091FBB9C0100BA93FE /* Sources */,
75 | 80C92C0A1FBB9C0100BA93FE /* Frameworks */,
76 | 80C92C0B1FBB9C0100BA93FE /* Resources */,
77 | );
78 | buildRules = (
79 | );
80 | dependencies = (
81 | );
82 | name = "FaceID mask";
83 | productName = "FaceID mask";
84 | productReference = 80C92C0D1FBB9C0100BA93FE /* FaceID mask.app */;
85 | productType = "com.apple.product-type.application";
86 | };
87 | /* End PBXNativeTarget section */
88 |
89 | /* Begin PBXProject section */
90 | 80C92C051FBB9C0100BA93FE /* Project object */ = {
91 | isa = PBXProject;
92 | attributes = {
93 | LastSwiftUpdateCheck = 0910;
94 | LastUpgradeCheck = 0910;
95 | ORGANIZATIONNAME = "Simon Westerlund";
96 | TargetAttributes = {
97 | 80C92C0C1FBB9C0100BA93FE = {
98 | CreatedOnToolsVersion = 9.1;
99 | ProvisioningStyle = Automatic;
100 | };
101 | };
102 | };
103 | buildConfigurationList = 80C92C081FBB9C0100BA93FE /* Build configuration list for PBXProject "FaceID mask" */;
104 | compatibilityVersion = "Xcode 8.0";
105 | developmentRegion = en;
106 | hasScannedForEncodings = 0;
107 | knownRegions = (
108 | en,
109 | Base,
110 | );
111 | mainGroup = 80C92C041FBB9C0100BA93FE;
112 | productRefGroup = 80C92C0E1FBB9C0100BA93FE /* Products */;
113 | projectDirPath = "";
114 | projectRoot = "";
115 | targets = (
116 | 80C92C0C1FBB9C0100BA93FE /* FaceID mask */,
117 | );
118 | };
119 | /* End PBXProject section */
120 |
121 | /* Begin PBXResourcesBuildPhase section */
122 | 80C92C0B1FBB9C0100BA93FE /* Resources */ = {
123 | isa = PBXResourcesBuildPhase;
124 | buildActionMask = 2147483647;
125 | files = (
126 | 80C92C1D1FBB9C0100BA93FE /* LaunchScreen.storyboard in Resources */,
127 | 80C92C1A1FBB9C0100BA93FE /* Assets.xcassets in Resources */,
128 | 80C92C181FBB9C0100BA93FE /* Main.storyboard in Resources */,
129 | );
130 | runOnlyForDeploymentPostprocessing = 0;
131 | };
132 | /* End PBXResourcesBuildPhase section */
133 |
134 | /* Begin PBXSourcesBuildPhase section */
135 | 80C92C091FBB9C0100BA93FE /* Sources */ = {
136 | isa = PBXSourcesBuildPhase;
137 | buildActionMask = 2147483647;
138 | files = (
139 | 80C92C151FBB9C0100BA93FE /* ViewController.swift in Sources */,
140 | 80C92C111FBB9C0100BA93FE /* AppDelegate.swift in Sources */,
141 | );
142 | runOnlyForDeploymentPostprocessing = 0;
143 | };
144 | /* End PBXSourcesBuildPhase section */
145 |
146 | /* Begin PBXVariantGroup section */
147 | 80C92C161FBB9C0100BA93FE /* Main.storyboard */ = {
148 | isa = PBXVariantGroup;
149 | children = (
150 | 80C92C171FBB9C0100BA93FE /* Base */,
151 | );
152 | name = Main.storyboard;
153 | sourceTree = "";
154 | };
155 | 80C92C1B1FBB9C0100BA93FE /* LaunchScreen.storyboard */ = {
156 | isa = PBXVariantGroup;
157 | children = (
158 | 80C92C1C1FBB9C0100BA93FE /* Base */,
159 | );
160 | name = LaunchScreen.storyboard;
161 | sourceTree = "";
162 | };
163 | /* End PBXVariantGroup section */
164 |
165 | /* Begin XCBuildConfiguration section */
166 | 80C92C1F1FBB9C0100BA93FE /* Debug */ = {
167 | isa = XCBuildConfiguration;
168 | buildSettings = {
169 | ALWAYS_SEARCH_USER_PATHS = NO;
170 | CLANG_ANALYZER_NONNULL = YES;
171 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
172 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
173 | CLANG_CXX_LIBRARY = "libc++";
174 | CLANG_ENABLE_MODULES = YES;
175 | CLANG_ENABLE_OBJC_ARC = YES;
176 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
177 | CLANG_WARN_BOOL_CONVERSION = YES;
178 | CLANG_WARN_COMMA = YES;
179 | CLANG_WARN_CONSTANT_CONVERSION = YES;
180 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
181 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
182 | CLANG_WARN_EMPTY_BODY = YES;
183 | CLANG_WARN_ENUM_CONVERSION = YES;
184 | CLANG_WARN_INFINITE_RECURSION = YES;
185 | CLANG_WARN_INT_CONVERSION = YES;
186 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
187 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
188 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
189 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
190 | CLANG_WARN_STRICT_PROTOTYPES = YES;
191 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
192 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
193 | CLANG_WARN_UNREACHABLE_CODE = YES;
194 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
195 | CODE_SIGN_IDENTITY = "iPhone Developer";
196 | COPY_PHASE_STRIP = NO;
197 | DEBUG_INFORMATION_FORMAT = dwarf;
198 | ENABLE_STRICT_OBJC_MSGSEND = YES;
199 | ENABLE_TESTABILITY = YES;
200 | GCC_C_LANGUAGE_STANDARD = gnu11;
201 | GCC_DYNAMIC_NO_PIC = NO;
202 | GCC_NO_COMMON_BLOCKS = YES;
203 | GCC_OPTIMIZATION_LEVEL = 0;
204 | GCC_PREPROCESSOR_DEFINITIONS = (
205 | "DEBUG=1",
206 | "$(inherited)",
207 | );
208 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
209 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
210 | GCC_WARN_UNDECLARED_SELECTOR = YES;
211 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
212 | GCC_WARN_UNUSED_FUNCTION = YES;
213 | GCC_WARN_UNUSED_VARIABLE = YES;
214 | IPHONEOS_DEPLOYMENT_TARGET = 11.1;
215 | MTL_ENABLE_DEBUG_INFO = YES;
216 | ONLY_ACTIVE_ARCH = YES;
217 | SDKROOT = iphoneos;
218 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
219 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
220 | };
221 | name = Debug;
222 | };
223 | 80C92C201FBB9C0100BA93FE /* Release */ = {
224 | isa = XCBuildConfiguration;
225 | buildSettings = {
226 | ALWAYS_SEARCH_USER_PATHS = NO;
227 | CLANG_ANALYZER_NONNULL = YES;
228 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
229 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
230 | CLANG_CXX_LIBRARY = "libc++";
231 | CLANG_ENABLE_MODULES = YES;
232 | CLANG_ENABLE_OBJC_ARC = YES;
233 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
234 | CLANG_WARN_BOOL_CONVERSION = YES;
235 | CLANG_WARN_COMMA = YES;
236 | CLANG_WARN_CONSTANT_CONVERSION = YES;
237 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
238 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
239 | CLANG_WARN_EMPTY_BODY = YES;
240 | CLANG_WARN_ENUM_CONVERSION = YES;
241 | CLANG_WARN_INFINITE_RECURSION = YES;
242 | CLANG_WARN_INT_CONVERSION = YES;
243 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
244 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
245 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
246 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
247 | CLANG_WARN_STRICT_PROTOTYPES = YES;
248 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
249 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
250 | CLANG_WARN_UNREACHABLE_CODE = YES;
251 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
252 | CODE_SIGN_IDENTITY = "iPhone Developer";
253 | COPY_PHASE_STRIP = NO;
254 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
255 | ENABLE_NS_ASSERTIONS = NO;
256 | ENABLE_STRICT_OBJC_MSGSEND = YES;
257 | GCC_C_LANGUAGE_STANDARD = gnu11;
258 | GCC_NO_COMMON_BLOCKS = YES;
259 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
260 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
261 | GCC_WARN_UNDECLARED_SELECTOR = YES;
262 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
263 | GCC_WARN_UNUSED_FUNCTION = YES;
264 | GCC_WARN_UNUSED_VARIABLE = YES;
265 | IPHONEOS_DEPLOYMENT_TARGET = 11.1;
266 | MTL_ENABLE_DEBUG_INFO = NO;
267 | SDKROOT = iphoneos;
268 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
269 | VALIDATE_PRODUCT = YES;
270 | };
271 | name = Release;
272 | };
273 | 80C92C221FBB9C0100BA93FE /* Debug */ = {
274 | isa = XCBuildConfiguration;
275 | buildSettings = {
276 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
277 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
278 | CODE_SIGN_STYLE = Automatic;
279 | DEVELOPMENT_TEAM = 53P6LCFG2E;
280 | INFOPLIST_FILE = "FaceID mask/Info.plist";
281 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
282 | PRODUCT_BUNDLE_IDENTIFIER = "com.example.faceid-to-stl";
283 | PRODUCT_NAME = "$(TARGET_NAME)";
284 | PROVISIONING_PROFILE_SPECIFIER = "";
285 | SWIFT_VERSION = 4.0;
286 | TARGETED_DEVICE_FAMILY = "1,2";
287 | };
288 | name = Debug;
289 | };
290 | 80C92C231FBB9C0100BA93FE /* Release */ = {
291 | isa = XCBuildConfiguration;
292 | buildSettings = {
293 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
294 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
295 | CODE_SIGN_STYLE = Automatic;
296 | DEVELOPMENT_TEAM = 53P6LCFG2E;
297 | INFOPLIST_FILE = "FaceID mask/Info.plist";
298 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
299 | PRODUCT_BUNDLE_IDENTIFIER = "com.example.faceid-to-stl";
300 | PRODUCT_NAME = "$(TARGET_NAME)";
301 | PROVISIONING_PROFILE_SPECIFIER = "";
302 | SWIFT_VERSION = 4.0;
303 | TARGETED_DEVICE_FAMILY = "1,2";
304 | };
305 | name = Release;
306 | };
307 | /* End XCBuildConfiguration section */
308 |
309 | /* Begin XCConfigurationList section */
310 | 80C92C081FBB9C0100BA93FE /* Build configuration list for PBXProject "FaceID mask" */ = {
311 | isa = XCConfigurationList;
312 | buildConfigurations = (
313 | 80C92C1F1FBB9C0100BA93FE /* Debug */,
314 | 80C92C201FBB9C0100BA93FE /* Release */,
315 | );
316 | defaultConfigurationIsVisible = 0;
317 | defaultConfigurationName = Release;
318 | };
319 | 80C92C211FBB9C0100BA93FE /* Build configuration list for PBXNativeTarget "FaceID mask" */ = {
320 | isa = XCConfigurationList;
321 | buildConfigurations = (
322 | 80C92C221FBB9C0100BA93FE /* Debug */,
323 | 80C92C231FBB9C0100BA93FE /* Release */,
324 | );
325 | defaultConfigurationIsVisible = 0;
326 | defaultConfigurationName = Release;
327 | };
328 | /* End XCConfigurationList section */
329 | };
330 | rootObject = 80C92C051FBB9C0100BA93FE /* Project object */;
331 | }
332 |
--------------------------------------------------------------------------------