├── README.md ├── SwiftTouchIDExample.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── kramer.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── xcuserdata │ └── kramer.xcuserdatad │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── SwiftTouchIDExample.xcscheme └── project.pbxproj └── SwiftTouchIDExample ├── Images.xcassets ├── AppIcon.appiconset │ └── Contents.json └── LaunchImage.launchimage │ └── Contents.json ├── Info.plist ├── AppDelegate.swift ├── MainStoryboard.storyboard └── MainViewController.swift /README.md: -------------------------------------------------------------------------------- 1 | Swift-Touch-ID 2 | ============== 3 | 4 | Example Local Authentication usage with Touch ID Authentication written in Swift 5 | -------------------------------------------------------------------------------- /SwiftTouchIDExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SwiftTouchIDExample.xcodeproj/project.xcworkspace/xcuserdata/kramer.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shmoopi/Swift-Touch-ID/HEAD/SwiftTouchIDExample.xcodeproj/project.xcworkspace/xcuserdata/kramer.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /SwiftTouchIDExample/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "40x40", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "60x60", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SwiftTouchIDExample/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SwiftTouchIDExample.xcodeproj/xcuserdata/kramer.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | SwiftTouchIDExample.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 4C21395C194205FB0048DD91 16 | 17 | primary 18 | 19 | 20 | 4C213969194205FB0048DD91 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /SwiftTouchIDExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | net.shmoopi.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UIMainStoryboardFile 26 | MainStoryboard 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /SwiftTouchIDExample/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // SwiftTouchIDExample 4 | // Test the LocalAuthentication Framework in Swift 5 | // 6 | // Created by Shmoopi on 6/6/14. 7 | // Copyright (c) 2014 Shmoopi LLC. All rights reserved. 8 | // 9 | 10 | import UIKit 11 | 12 | @UIApplicationMain 13 | class AppDelegate: UIResponder, UIApplicationDelegate { 14 | 15 | var window: UIWindow? 16 | 17 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { 18 | // Override point 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(application: UIApplication) { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /SwiftTouchIDExample/MainStoryboard.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /SwiftTouchIDExample.xcodeproj/xcuserdata/kramer.xcuserdatad/xcschemes/SwiftTouchIDExample.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 61 | 62 | 68 | 69 | 70 | 71 | 72 | 73 | 79 | 80 | 86 | 87 | 88 | 89 | 91 | 92 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /SwiftTouchIDExample/MainViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainViewController.swift 3 | // SwiftTouchIDExample 4 | // Test the LocalAuthentication Framework in Swift 5 | // 6 | // Created by Shmoopi on 6/6/14. 7 | // Copyright (c) 2014 Shmoopi LLC. All rights reserved. 8 | // 9 | 10 | import UIKit 11 | import LocalAuthentication 12 | 13 | class MainViewController: UIViewController { 14 | 15 | init(coder aDecoder: NSCoder!) { 16 | super.init(coder: aDecoder) 17 | // Custom initialization 18 | } 19 | 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | 23 | // Do any additional setup after loading the view. 24 | } 25 | 26 | // Test the local authentication framework 27 | @IBAction func testTouchID(sender : AnyObject) { 28 | 29 | // Create an alert 30 | var alert = UIAlertController(title: "", message: "", preferredStyle: UIAlertControllerStyle.Alert) 31 | // Add the cancel button to the alert 32 | alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil)) 33 | 34 | // Create the Local Authentication Context 35 | var touchIDContext = LAContext() 36 | var touchIDError : NSError? 37 | var reasonString = "Local Authentication Testing" 38 | 39 | // Check if we can access local device authentication 40 | if touchIDContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error:&touchIDError) { 41 | // Check what the authentication response was 42 | touchIDContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: reasonString, reply: { 43 | (success: Bool, error: NSError?) -> Void in 44 | // Check if we passed or failed 45 | if success { 46 | // User authenticated using Local Device Authentication Successfully! 47 | 48 | // Show a success alert 49 | alert.title = "Success!" 50 | alert.message = "You have authenticated!" 51 | self.presentViewController(alert, animated: true, completion: nil) 52 | 53 | } else { 54 | // Unsuccessful 55 | 56 | // Set the title of the unsuccessful alert 57 | alert.title = "Unsuccessful!" 58 | 59 | // Set the message of the alert 60 | switch error!.code { 61 | case LAError.UserCancel.toRaw(): 62 | alert.message = "User Cancelled" 63 | case LAError.AuthenticationFailed.toRaw(): 64 | alert.message = "Authentication Failed" 65 | case LAError.PasscodeNotSet.toRaw(): 66 | alert.message = "Passcode Not Set" 67 | case LAError.SystemCancel.toRaw(): 68 | alert.message = "System Cancelled" 69 | case LAError.UserFallback.toRaw(): 70 | alert.message = "User chose to try a password" 71 | default: 72 | alert.message = "Unable to Authenticate!" 73 | } 74 | 75 | // Show the alert 76 | self.presentViewController(alert, animated: true, completion: nil) 77 | } 78 | }) 79 | } else { 80 | // Unable to access local device authentication 81 | 82 | // Set the error title 83 | alert.title = "Error" 84 | 85 | // Set the error alert message with more information 86 | switch touchIDError!.code { 87 | case LAError.TouchIDNotEnrolled.toRaw(): 88 | alert.message = "Touch ID is not enrolled" 89 | case LAError.TouchIDNotAvailable.toRaw(): 90 | alert.message = "Touch ID not available" 91 | case LAError.PasscodeNotSet.toRaw(): 92 | alert.message = "Passcode has not been set" 93 | default: 94 | alert.message = "Local Authentication not available" 95 | } 96 | 97 | // Show the alert 98 | self.presentViewController(alert, animated: true, completion: nil) 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /SwiftTouchIDExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4C213963194205FB0048DD91 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C213962194205FB0048DD91 /* AppDelegate.swift */; }; 11 | 4C213965194205FB0048DD91 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C213964194205FB0048DD91 /* Images.xcassets */; }; 12 | 4C21397C194242440048DD91 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C21397B194242440048DD91 /* MainStoryboard.storyboard */; }; 13 | 4C21397E194242AB0048DD91 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C21397D194242AB0048DD91 /* MainViewController.swift */; }; 14 | /* End PBXBuildFile section */ 15 | 16 | /* Begin PBXFileReference section */ 17 | 4C21395D194205FB0048DD91 /* SwiftTouchIDExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftTouchIDExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 18 | 4C213961194205FB0048DD91 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 19 | 4C213962194205FB0048DD91 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 20 | 4C213964194205FB0048DD91 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 21 | 4C21397B194242440048DD91 /* MainStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = MainStoryboard.storyboard; sourceTree = ""; }; 22 | 4C21397D194242AB0048DD91 /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; 23 | /* End PBXFileReference section */ 24 | 25 | /* Begin PBXFrameworksBuildPhase section */ 26 | 4C21395A194205FB0048DD91 /* Frameworks */ = { 27 | isa = PBXFrameworksBuildPhase; 28 | buildActionMask = 2147483647; 29 | files = ( 30 | ); 31 | runOnlyForDeploymentPostprocessing = 0; 32 | }; 33 | /* End PBXFrameworksBuildPhase section */ 34 | 35 | /* Begin PBXGroup section */ 36 | 4C213954194205FB0048DD91 = { 37 | isa = PBXGroup; 38 | children = ( 39 | 4C21395F194205FB0048DD91 /* SwiftTouchIDExample */, 40 | 4C21395E194205FB0048DD91 /* Products */, 41 | ); 42 | sourceTree = ""; 43 | }; 44 | 4C21395E194205FB0048DD91 /* Products */ = { 45 | isa = PBXGroup; 46 | children = ( 47 | 4C21395D194205FB0048DD91 /* SwiftTouchIDExample.app */, 48 | ); 49 | name = Products; 50 | sourceTree = ""; 51 | }; 52 | 4C21395F194205FB0048DD91 /* SwiftTouchIDExample */ = { 53 | isa = PBXGroup; 54 | children = ( 55 | 4C213962194205FB0048DD91 /* AppDelegate.swift */, 56 | 4C21397D194242AB0048DD91 /* MainViewController.swift */, 57 | 4C21397B194242440048DD91 /* MainStoryboard.storyboard */, 58 | 4C213964194205FB0048DD91 /* Images.xcassets */, 59 | 4C213960194205FB0048DD91 /* Supporting Files */, 60 | ); 61 | path = SwiftTouchIDExample; 62 | sourceTree = ""; 63 | }; 64 | 4C213960194205FB0048DD91 /* Supporting Files */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | 4C213961194205FB0048DD91 /* Info.plist */, 68 | ); 69 | name = "Supporting Files"; 70 | sourceTree = ""; 71 | }; 72 | /* End PBXGroup section */ 73 | 74 | /* Begin PBXNativeTarget section */ 75 | 4C21395C194205FB0048DD91 /* SwiftTouchIDExample */ = { 76 | isa = PBXNativeTarget; 77 | buildConfigurationList = 4C213974194205FB0048DD91 /* Build configuration list for PBXNativeTarget "SwiftTouchIDExample" */; 78 | buildPhases = ( 79 | 4C213959194205FB0048DD91 /* Sources */, 80 | 4C21395A194205FB0048DD91 /* Frameworks */, 81 | 4C21395B194205FB0048DD91 /* Resources */, 82 | ); 83 | buildRules = ( 84 | ); 85 | dependencies = ( 86 | ); 87 | name = SwiftTouchIDExample; 88 | productName = SwiftTouchIDExample; 89 | productReference = 4C21395D194205FB0048DD91 /* SwiftTouchIDExample.app */; 90 | productType = "com.apple.product-type.application"; 91 | }; 92 | /* End PBXNativeTarget section */ 93 | 94 | /* Begin PBXProject section */ 95 | 4C213955194205FB0048DD91 /* Project object */ = { 96 | isa = PBXProject; 97 | attributes = { 98 | LastUpgradeCheck = 0600; 99 | ORGANIZATIONNAME = "Shmoopi LLC"; 100 | TargetAttributes = { 101 | 4C21395C194205FB0048DD91 = { 102 | CreatedOnToolsVersion = 6.0; 103 | }; 104 | }; 105 | }; 106 | buildConfigurationList = 4C213958194205FB0048DD91 /* Build configuration list for PBXProject "SwiftTouchIDExample" */; 107 | compatibilityVersion = "Xcode 3.2"; 108 | developmentRegion = English; 109 | hasScannedForEncodings = 0; 110 | knownRegions = ( 111 | en, 112 | ); 113 | mainGroup = 4C213954194205FB0048DD91; 114 | productRefGroup = 4C21395E194205FB0048DD91 /* Products */; 115 | projectDirPath = ""; 116 | projectRoot = ""; 117 | targets = ( 118 | 4C21395C194205FB0048DD91 /* SwiftTouchIDExample */, 119 | ); 120 | }; 121 | /* End PBXProject section */ 122 | 123 | /* Begin PBXResourcesBuildPhase section */ 124 | 4C21395B194205FB0048DD91 /* Resources */ = { 125 | isa = PBXResourcesBuildPhase; 126 | buildActionMask = 2147483647; 127 | files = ( 128 | 4C21397C194242440048DD91 /* MainStoryboard.storyboard in Resources */, 129 | 4C213965194205FB0048DD91 /* Images.xcassets in Resources */, 130 | ); 131 | runOnlyForDeploymentPostprocessing = 0; 132 | }; 133 | /* End PBXResourcesBuildPhase section */ 134 | 135 | /* Begin PBXSourcesBuildPhase section */ 136 | 4C213959194205FB0048DD91 /* Sources */ = { 137 | isa = PBXSourcesBuildPhase; 138 | buildActionMask = 2147483647; 139 | files = ( 140 | 4C213963194205FB0048DD91 /* AppDelegate.swift in Sources */, 141 | 4C21397E194242AB0048DD91 /* MainViewController.swift in Sources */, 142 | ); 143 | runOnlyForDeploymentPostprocessing = 0; 144 | }; 145 | /* End PBXSourcesBuildPhase section */ 146 | 147 | /* Begin XCBuildConfiguration section */ 148 | 4C213972194205FB0048DD91 /* Debug */ = { 149 | isa = XCBuildConfiguration; 150 | buildSettings = { 151 | ALWAYS_SEARCH_USER_PATHS = NO; 152 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 153 | CLANG_CXX_LIBRARY = "libc++"; 154 | CLANG_ENABLE_MODULES = YES; 155 | CLANG_ENABLE_OBJC_ARC = YES; 156 | CLANG_WARN_BOOL_CONVERSION = YES; 157 | CLANG_WARN_CONSTANT_CONVERSION = YES; 158 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 159 | CLANG_WARN_EMPTY_BODY = YES; 160 | CLANG_WARN_ENUM_CONVERSION = YES; 161 | CLANG_WARN_INT_CONVERSION = YES; 162 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 163 | CLANG_WARN_UNREACHABLE_CODE = YES; 164 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 165 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 166 | COPY_PHASE_STRIP = NO; 167 | ENABLE_STRICT_OBJC_MSGSEND = YES; 168 | GCC_C_LANGUAGE_STANDARD = gnu99; 169 | GCC_DYNAMIC_NO_PIC = NO; 170 | GCC_OPTIMIZATION_LEVEL = 0; 171 | GCC_PREPROCESSOR_DEFINITIONS = ( 172 | "DEBUG=1", 173 | "$(inherited)", 174 | ); 175 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 176 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 177 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 178 | GCC_WARN_UNDECLARED_SELECTOR = YES; 179 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 180 | GCC_WARN_UNUSED_FUNCTION = YES; 181 | GCC_WARN_UNUSED_VARIABLE = YES; 182 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 183 | METAL_ENABLE_DEBUG_INFO = YES; 184 | ONLY_ACTIVE_ARCH = YES; 185 | SDKROOT = iphoneos; 186 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 187 | }; 188 | name = Debug; 189 | }; 190 | 4C213973194205FB0048DD91 /* Release */ = { 191 | isa = XCBuildConfiguration; 192 | buildSettings = { 193 | ALWAYS_SEARCH_USER_PATHS = NO; 194 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 195 | CLANG_CXX_LIBRARY = "libc++"; 196 | CLANG_ENABLE_MODULES = YES; 197 | CLANG_ENABLE_OBJC_ARC = YES; 198 | CLANG_WARN_BOOL_CONVERSION = YES; 199 | CLANG_WARN_CONSTANT_CONVERSION = YES; 200 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 201 | CLANG_WARN_EMPTY_BODY = YES; 202 | CLANG_WARN_ENUM_CONVERSION = YES; 203 | CLANG_WARN_INT_CONVERSION = YES; 204 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 205 | CLANG_WARN_UNREACHABLE_CODE = YES; 206 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 207 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 208 | COPY_PHASE_STRIP = YES; 209 | ENABLE_NS_ASSERTIONS = NO; 210 | ENABLE_STRICT_OBJC_MSGSEND = YES; 211 | GCC_C_LANGUAGE_STANDARD = gnu99; 212 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 213 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 214 | GCC_WARN_UNDECLARED_SELECTOR = YES; 215 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 216 | GCC_WARN_UNUSED_FUNCTION = YES; 217 | GCC_WARN_UNUSED_VARIABLE = YES; 218 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 219 | METAL_ENABLE_DEBUG_INFO = NO; 220 | SDKROOT = iphoneos; 221 | VALIDATE_PRODUCT = YES; 222 | }; 223 | name = Release; 224 | }; 225 | 4C213975194205FB0048DD91 /* Debug */ = { 226 | isa = XCBuildConfiguration; 227 | buildSettings = { 228 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 229 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 230 | INFOPLIST_FILE = SwiftTouchIDExample/Info.plist; 231 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 232 | PRODUCT_NAME = "$(TARGET_NAME)"; 233 | }; 234 | name = Debug; 235 | }; 236 | 4C213976194205FB0048DD91 /* Release */ = { 237 | isa = XCBuildConfiguration; 238 | buildSettings = { 239 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 240 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 241 | INFOPLIST_FILE = SwiftTouchIDExample/Info.plist; 242 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 243 | PRODUCT_NAME = "$(TARGET_NAME)"; 244 | }; 245 | name = Release; 246 | }; 247 | /* End XCBuildConfiguration section */ 248 | 249 | /* Begin XCConfigurationList section */ 250 | 4C213958194205FB0048DD91 /* Build configuration list for PBXProject "SwiftTouchIDExample" */ = { 251 | isa = XCConfigurationList; 252 | buildConfigurations = ( 253 | 4C213972194205FB0048DD91 /* Debug */, 254 | 4C213973194205FB0048DD91 /* Release */, 255 | ); 256 | defaultConfigurationIsVisible = 0; 257 | defaultConfigurationName = Release; 258 | }; 259 | 4C213974194205FB0048DD91 /* Build configuration list for PBXNativeTarget "SwiftTouchIDExample" */ = { 260 | isa = XCConfigurationList; 261 | buildConfigurations = ( 262 | 4C213975194205FB0048DD91 /* Debug */, 263 | 4C213976194205FB0048DD91 /* Release */, 264 | ); 265 | defaultConfigurationIsVisible = 0; 266 | defaultConfigurationName = Release; 267 | }; 268 | /* End XCConfigurationList section */ 269 | }; 270 | rootObject = 4C213955194205FB0048DD91 /* Project object */; 271 | } 272 | --------------------------------------------------------------------------------