├── .DS_Store ├── .gitignore ├── FaceAISDKDemo.PNG ├── FaceAISDK_iOS.xcodeproj ├── project.pbxproj └── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ ├── IDEWorkspaceChecks.plist │ └── swiftpm │ └── Package.resolved ├── FaceAISDK_iOS.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ ├── IDEWorkspaceChecks.plist │ └── swiftpm │ └── Package.resolved ├── FaceAISDK_iOS ├── .DS_Store ├── AddFaceView.swift ├── Assets.xcassets │ ├── .DS_Store │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ └── face_logo.png │ └── Contents.json ├── FaceAINaviView.swift ├── FaceAISDK_iOSApp.swift ├── ImageDetailView.swift ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json └── VerifyFaceView.swift ├── LICENSE ├── Localizable.xcstrings ├── Podfile ├── Podfile.lock └── README.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AnyLifeZLB/FaceAI_Android/44b0e6bca2b8b40f5544e4b8c4db6abe55536a85/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## Obj-C/Swift specific 9 | *.hmap 10 | 11 | ## App packaging 12 | *.ipa 13 | *.dSYM.zip 14 | *.dSYM 15 | 16 | ## Playgrounds 17 | timeline.xctimeline 18 | playground.xcworkspace 19 | 20 | # Swift Package Manager 21 | # 22 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 23 | # Packages/ 24 | # Package.pins 25 | # Package.resolved 26 | # *.xcodeproj 27 | # 28 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 29 | # hence it is not needed unless you have added a package configuration file to your project 30 | # .swiftpm 31 | 32 | .build/ 33 | 34 | # CocoaPods 35 | # 36 | # We recommend against adding the Pods directory to your .gitignore. However 37 | # you should judge for yourself, the pros and cons are mentioned at: 38 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 39 | # 40 | 41 | Pods/ 42 | .Pods/ 43 | /Pods/ 44 | 45 | # 46 | # Add this line if you want to avoid checking in source code from the Xcode workspace 47 | # *.xcworkspace 48 | 49 | # Carthage 50 | # 51 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 52 | # Carthage/Checkouts 53 | 54 | Carthage/Build/ 55 | 56 | # fastlane 57 | # 58 | # It is recommended to not store the screenshots in the git repo. 59 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 60 | # For more information about the recommended setup visit: 61 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 62 | 63 | fastlane/report.xml 64 | fastlane/Preview.html 65 | fastlane/screenshots/**/*.png 66 | fastlane/test_output 67 | -------------------------------------------------------------------------------- /FaceAISDKDemo.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AnyLifeZLB/FaceAI_Android/44b0e6bca2b8b40f5544e4b8c4db6abe55536a85/FaceAISDKDemo.PNG -------------------------------------------------------------------------------- /FaceAISDK_iOS.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 60; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4D708862B1B0AFB51DECBC96 /* Pods_FaceAISDK_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A36172847F7F620FA9A1EB0A /* Pods_FaceAISDK_iOS.framework */; }; 11 | 7C73FE4E2DEFE199005437F4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7C73FE4D2DEFE199005437F4 /* Assets.xcassets */; }; 12 | 7C73FE512DEFE199005437F4 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7C73FE502DEFE199005437F4 /* Preview Assets.xcassets */; }; 13 | 7C73FE612DEFEA6F005437F4 /* VerifyFaceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C73FE5B2DEFEA6F005437F4 /* VerifyFaceView.swift */; }; 14 | 7C73FE622DEFEA6F005437F4 /* FaceAISDK_iOSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C73FE5C2DEFEA6F005437F4 /* FaceAISDK_iOSApp.swift */; }; 15 | 7C73FE632DEFEA6F005437F4 /* FaceAINaviView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C73FE5D2DEFEA6F005437F4 /* FaceAINaviView.swift */; }; 16 | 7C73FE642DEFEA6F005437F4 /* AddFaceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C73FE5E2DEFEA6F005437F4 /* AddFaceView.swift */; }; 17 | 7C73FE652DEFEA6F005437F4 /* ImageDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C73FE5F2DEFEA6F005437F4 /* ImageDetailView.swift */; }; 18 | 7CE8BB9F2DF175D000A48545 /* ToastUI in Frameworks */ = {isa = PBXBuildFile; productRef = 7CE8BB9E2DF175D000A48545 /* ToastUI */; }; 19 | CFE241522DF53512004D91FA /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = CFE241512DF53512004D91FA /* Localizable.xcstrings */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXFileReference section */ 23 | 7C73FE462DEFE193005437F4 /* FaceAISDK_iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FaceAISDK_iOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; 24 | 7C73FE4D2DEFE199005437F4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 25 | 7C73FE502DEFE199005437F4 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 26 | 7C73FE5B2DEFEA6F005437F4 /* VerifyFaceView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerifyFaceView.swift; sourceTree = ""; }; 27 | 7C73FE5C2DEFEA6F005437F4 /* FaceAISDK_iOSApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FaceAISDK_iOSApp.swift; sourceTree = ""; }; 28 | 7C73FE5D2DEFEA6F005437F4 /* FaceAINaviView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FaceAINaviView.swift; sourceTree = ""; }; 29 | 7C73FE5E2DEFEA6F005437F4 /* AddFaceView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddFaceView.swift; sourceTree = ""; }; 30 | 7C73FE5F2DEFEA6F005437F4 /* ImageDetailView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageDetailView.swift; sourceTree = ""; }; 31 | 7DF1A82A5EBABC164C97572F /* Pods-FaceAISDK_iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FaceAISDK_iOS.debug.xcconfig"; path = "Target Support Files/Pods-FaceAISDK_iOS/Pods-FaceAISDK_iOS.debug.xcconfig"; sourceTree = ""; }; 32 | A36172847F7F620FA9A1EB0A /* Pods_FaceAISDK_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FaceAISDK_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | C259A2CEEE9096A1DEDAF78B /* Pods-FaceAISDK_iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FaceAISDK_iOS.release.xcconfig"; path = "Target Support Files/Pods-FaceAISDK_iOS/Pods-FaceAISDK_iOS.release.xcconfig"; sourceTree = ""; }; 34 | CFE241512DF53512004D91FA /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; 35 | /* End PBXFileReference section */ 36 | 37 | /* Begin PBXFrameworksBuildPhase section */ 38 | 7C73FE432DEFE193005437F4 /* Frameworks */ = { 39 | isa = PBXFrameworksBuildPhase; 40 | buildActionMask = 2147483647; 41 | files = ( 42 | 7CE8BB9F2DF175D000A48545 /* ToastUI in Frameworks */, 43 | 4D708862B1B0AFB51DECBC96 /* Pods_FaceAISDK_iOS.framework in Frameworks */, 44 | ); 45 | runOnlyForDeploymentPostprocessing = 0; 46 | }; 47 | /* End PBXFrameworksBuildPhase section */ 48 | 49 | /* Begin PBXGroup section */ 50 | 7C73FE3D2DEFE193005437F4 = { 51 | isa = PBXGroup; 52 | children = ( 53 | CFE241512DF53512004D91FA /* Localizable.xcstrings */, 54 | 7C73FE482DEFE193005437F4 /* FaceAISDK_iOS */, 55 | 7C73FE472DEFE193005437F4 /* Products */, 56 | 940CF5AE87F342FFA215C006 /* Pods */, 57 | C0538CD4C7429928376B5708 /* Frameworks */, 58 | ); 59 | sourceTree = ""; 60 | }; 61 | 7C73FE472DEFE193005437F4 /* Products */ = { 62 | isa = PBXGroup; 63 | children = ( 64 | 7C73FE462DEFE193005437F4 /* FaceAISDK_iOS.app */, 65 | ); 66 | name = Products; 67 | sourceTree = ""; 68 | }; 69 | 7C73FE482DEFE193005437F4 /* FaceAISDK_iOS */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | 7C73FE5E2DEFEA6F005437F4 /* AddFaceView.swift */, 73 | 7C73FE5D2DEFEA6F005437F4 /* FaceAINaviView.swift */, 74 | 7C73FE5C2DEFEA6F005437F4 /* FaceAISDK_iOSApp.swift */, 75 | 7C73FE5F2DEFEA6F005437F4 /* ImageDetailView.swift */, 76 | 7C73FE5B2DEFEA6F005437F4 /* VerifyFaceView.swift */, 77 | 7C73FE4D2DEFE199005437F4 /* Assets.xcassets */, 78 | 7C73FE4F2DEFE199005437F4 /* Preview Content */, 79 | ); 80 | path = FaceAISDK_iOS; 81 | sourceTree = ""; 82 | }; 83 | 7C73FE4F2DEFE199005437F4 /* Preview Content */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | 7C73FE502DEFE199005437F4 /* Preview Assets.xcassets */, 87 | ); 88 | path = "Preview Content"; 89 | sourceTree = ""; 90 | }; 91 | 940CF5AE87F342FFA215C006 /* Pods */ = { 92 | isa = PBXGroup; 93 | children = ( 94 | 7DF1A82A5EBABC164C97572F /* Pods-FaceAISDK_iOS.debug.xcconfig */, 95 | C259A2CEEE9096A1DEDAF78B /* Pods-FaceAISDK_iOS.release.xcconfig */, 96 | ); 97 | path = Pods; 98 | sourceTree = ""; 99 | }; 100 | C0538CD4C7429928376B5708 /* Frameworks */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | A36172847F7F620FA9A1EB0A /* Pods_FaceAISDK_iOS.framework */, 104 | ); 105 | name = Frameworks; 106 | sourceTree = ""; 107 | }; 108 | /* End PBXGroup section */ 109 | 110 | /* Begin PBXNativeTarget section */ 111 | 7C73FE452DEFE193005437F4 /* FaceAISDK_iOS */ = { 112 | isa = PBXNativeTarget; 113 | buildConfigurationList = 7C73FE542DEFE199005437F4 /* Build configuration list for PBXNativeTarget "FaceAISDK_iOS" */; 114 | buildPhases = ( 115 | 92D87D66D624FDB1F85EA7F7 /* [CP] Check Pods Manifest.lock */, 116 | 7C73FE422DEFE193005437F4 /* Sources */, 117 | 7C73FE432DEFE193005437F4 /* Frameworks */, 118 | 7C73FE442DEFE193005437F4 /* Resources */, 119 | DFB4312803164A9B1E554BFC /* [CP] Embed Pods Frameworks */, 120 | D46AAB3B59A51A4C14B9CB8F /* [CP] Copy Pods Resources */, 121 | ); 122 | buildRules = ( 123 | ); 124 | dependencies = ( 125 | ); 126 | name = FaceAISDK_iOS; 127 | packageProductDependencies = ( 128 | 7CE8BB9E2DF175D000A48545 /* ToastUI */, 129 | ); 130 | productName = FaceAISDK_iOS; 131 | productReference = 7C73FE462DEFE193005437F4 /* FaceAISDK_iOS.app */; 132 | productType = "com.apple.product-type.application"; 133 | }; 134 | /* End PBXNativeTarget section */ 135 | 136 | /* Begin PBXProject section */ 137 | 7C73FE3E2DEFE193005437F4 /* Project object */ = { 138 | isa = PBXProject; 139 | attributes = { 140 | BuildIndependentTargetsInParallel = 1; 141 | LastSwiftUpdateCheck = 1520; 142 | LastUpgradeCheck = 1520; 143 | TargetAttributes = { 144 | 7C73FE452DEFE193005437F4 = { 145 | CreatedOnToolsVersion = 15.2; 146 | }; 147 | }; 148 | }; 149 | buildConfigurationList = 7C73FE412DEFE193005437F4 /* Build configuration list for PBXProject "FaceAISDK_iOS" */; 150 | compatibilityVersion = "Xcode 15.0"; 151 | developmentRegion = en; 152 | hasScannedForEncodings = 0; 153 | knownRegions = ( 154 | en, 155 | Base, 156 | "zh-Hans", 157 | ); 158 | mainGroup = 7C73FE3D2DEFE193005437F4; 159 | packageReferences = ( 160 | 7CE8BB9D2DF175D000A48545 /* XCRemoteSwiftPackageReference "ToastUI" */, 161 | ); 162 | productRefGroup = 7C73FE472DEFE193005437F4 /* Products */; 163 | projectDirPath = ""; 164 | projectRoot = ""; 165 | targets = ( 166 | 7C73FE452DEFE193005437F4 /* FaceAISDK_iOS */, 167 | ); 168 | }; 169 | /* End PBXProject section */ 170 | 171 | /* Begin PBXResourcesBuildPhase section */ 172 | 7C73FE442DEFE193005437F4 /* Resources */ = { 173 | isa = PBXResourcesBuildPhase; 174 | buildActionMask = 2147483647; 175 | files = ( 176 | 7C73FE512DEFE199005437F4 /* Preview Assets.xcassets in Resources */, 177 | 7C73FE4E2DEFE199005437F4 /* Assets.xcassets in Resources */, 178 | CFE241522DF53512004D91FA /* Localizable.xcstrings in Resources */, 179 | ); 180 | runOnlyForDeploymentPostprocessing = 0; 181 | }; 182 | /* End PBXResourcesBuildPhase section */ 183 | 184 | /* Begin PBXShellScriptBuildPhase section */ 185 | 92D87D66D624FDB1F85EA7F7 /* [CP] Check Pods Manifest.lock */ = { 186 | isa = PBXShellScriptBuildPhase; 187 | buildActionMask = 2147483647; 188 | files = ( 189 | ); 190 | inputFileListPaths = ( 191 | ); 192 | inputPaths = ( 193 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 194 | "${PODS_ROOT}/Manifest.lock", 195 | ); 196 | name = "[CP] Check Pods Manifest.lock"; 197 | outputFileListPaths = ( 198 | ); 199 | outputPaths = ( 200 | "$(DERIVED_FILE_DIR)/Pods-FaceAISDK_iOS-checkManifestLockResult.txt", 201 | ); 202 | runOnlyForDeploymentPostprocessing = 0; 203 | shellPath = /bin/sh; 204 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 205 | showEnvVarsInLog = 0; 206 | }; 207 | D46AAB3B59A51A4C14B9CB8F /* [CP] Copy Pods Resources */ = { 208 | isa = PBXShellScriptBuildPhase; 209 | buildActionMask = 2147483647; 210 | files = ( 211 | ); 212 | inputFileListPaths = ( 213 | "${PODS_ROOT}/Target Support Files/Pods-FaceAISDK_iOS/Pods-FaceAISDK_iOS-resources-${CONFIGURATION}-input-files.xcfilelist", 214 | ); 215 | inputPaths = ( 216 | ); 217 | name = "[CP] Copy Pods Resources"; 218 | outputFileListPaths = ( 219 | "${PODS_ROOT}/Target Support Files/Pods-FaceAISDK_iOS/Pods-FaceAISDK_iOS-resources-${CONFIGURATION}-output-files.xcfilelist", 220 | ); 221 | outputPaths = ( 222 | ); 223 | runOnlyForDeploymentPostprocessing = 0; 224 | shellPath = /bin/sh; 225 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FaceAISDK_iOS/Pods-FaceAISDK_iOS-resources.sh\"\n"; 226 | showEnvVarsInLog = 0; 227 | }; 228 | DFB4312803164A9B1E554BFC /* [CP] Embed Pods Frameworks */ = { 229 | isa = PBXShellScriptBuildPhase; 230 | buildActionMask = 2147483647; 231 | files = ( 232 | ); 233 | inputFileListPaths = ( 234 | "${PODS_ROOT}/Target Support Files/Pods-FaceAISDK_iOS/Pods-FaceAISDK_iOS-frameworks-${CONFIGURATION}-input-files.xcfilelist", 235 | ); 236 | inputPaths = ( 237 | ); 238 | name = "[CP] Embed Pods Frameworks"; 239 | outputFileListPaths = ( 240 | "${PODS_ROOT}/Target Support Files/Pods-FaceAISDK_iOS/Pods-FaceAISDK_iOS-frameworks-${CONFIGURATION}-output-files.xcfilelist", 241 | ); 242 | outputPaths = ( 243 | ); 244 | runOnlyForDeploymentPostprocessing = 0; 245 | shellPath = /bin/sh; 246 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FaceAISDK_iOS/Pods-FaceAISDK_iOS-frameworks.sh\"\n"; 247 | showEnvVarsInLog = 0; 248 | }; 249 | /* End PBXShellScriptBuildPhase section */ 250 | 251 | /* Begin PBXSourcesBuildPhase section */ 252 | 7C73FE422DEFE193005437F4 /* Sources */ = { 253 | isa = PBXSourcesBuildPhase; 254 | buildActionMask = 2147483647; 255 | files = ( 256 | 7C73FE652DEFEA6F005437F4 /* ImageDetailView.swift in Sources */, 257 | 7C73FE632DEFEA6F005437F4 /* FaceAINaviView.swift in Sources */, 258 | 7C73FE612DEFEA6F005437F4 /* VerifyFaceView.swift in Sources */, 259 | 7C73FE622DEFEA6F005437F4 /* FaceAISDK_iOSApp.swift in Sources */, 260 | 7C73FE642DEFEA6F005437F4 /* AddFaceView.swift in Sources */, 261 | ); 262 | runOnlyForDeploymentPostprocessing = 0; 263 | }; 264 | /* End PBXSourcesBuildPhase section */ 265 | 266 | /* Begin XCBuildConfiguration section */ 267 | 7C73FE522DEFE199005437F4 /* Debug */ = { 268 | isa = XCBuildConfiguration; 269 | buildSettings = { 270 | ALWAYS_SEARCH_USER_PATHS = NO; 271 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 272 | CLANG_ANALYZER_NONNULL = YES; 273 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 274 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 275 | CLANG_ENABLE_MODULES = YES; 276 | CLANG_ENABLE_OBJC_ARC = YES; 277 | CLANG_ENABLE_OBJC_WEAK = YES; 278 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 279 | CLANG_WARN_BOOL_CONVERSION = YES; 280 | CLANG_WARN_COMMA = YES; 281 | CLANG_WARN_CONSTANT_CONVERSION = YES; 282 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 283 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 284 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 285 | CLANG_WARN_EMPTY_BODY = YES; 286 | CLANG_WARN_ENUM_CONVERSION = YES; 287 | CLANG_WARN_INFINITE_RECURSION = YES; 288 | CLANG_WARN_INT_CONVERSION = YES; 289 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 290 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 291 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 292 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 293 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 294 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 295 | CLANG_WARN_STRICT_PROTOTYPES = YES; 296 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 297 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 298 | CLANG_WARN_UNREACHABLE_CODE = YES; 299 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 300 | COPY_PHASE_STRIP = NO; 301 | DEBUG_INFORMATION_FORMAT = dwarf; 302 | ENABLE_STRICT_OBJC_MSGSEND = YES; 303 | ENABLE_TESTABILITY = YES; 304 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 305 | GCC_C_LANGUAGE_STANDARD = gnu17; 306 | GCC_DYNAMIC_NO_PIC = NO; 307 | GCC_NO_COMMON_BLOCKS = YES; 308 | GCC_OPTIMIZATION_LEVEL = 0; 309 | GCC_PREPROCESSOR_DEFINITIONS = ( 310 | "DEBUG=1", 311 | "$(inherited)", 312 | ); 313 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 314 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 315 | GCC_WARN_UNDECLARED_SELECTOR = YES; 316 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 317 | GCC_WARN_UNUSED_FUNCTION = YES; 318 | GCC_WARN_UNUSED_VARIABLE = YES; 319 | IPHONEOS_DEPLOYMENT_TARGET = 17.2; 320 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 321 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 322 | MTL_FAST_MATH = YES; 323 | ONLY_ACTIVE_ARCH = YES; 324 | SDKROOT = iphoneos; 325 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; 326 | SWIFT_EMIT_LOC_STRINGS = YES; 327 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 328 | }; 329 | name = Debug; 330 | }; 331 | 7C73FE532DEFE199005437F4 /* Release */ = { 332 | isa = XCBuildConfiguration; 333 | buildSettings = { 334 | ALWAYS_SEARCH_USER_PATHS = NO; 335 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 336 | CLANG_ANALYZER_NONNULL = YES; 337 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 338 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 339 | CLANG_ENABLE_MODULES = YES; 340 | CLANG_ENABLE_OBJC_ARC = YES; 341 | CLANG_ENABLE_OBJC_WEAK = YES; 342 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 343 | CLANG_WARN_BOOL_CONVERSION = YES; 344 | CLANG_WARN_COMMA = YES; 345 | CLANG_WARN_CONSTANT_CONVERSION = YES; 346 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 347 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 348 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 349 | CLANG_WARN_EMPTY_BODY = YES; 350 | CLANG_WARN_ENUM_CONVERSION = YES; 351 | CLANG_WARN_INFINITE_RECURSION = YES; 352 | CLANG_WARN_INT_CONVERSION = YES; 353 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 354 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 355 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 356 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 357 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 358 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 359 | CLANG_WARN_STRICT_PROTOTYPES = YES; 360 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 361 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 362 | CLANG_WARN_UNREACHABLE_CODE = YES; 363 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 364 | COPY_PHASE_STRIP = NO; 365 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 366 | ENABLE_NS_ASSERTIONS = NO; 367 | ENABLE_STRICT_OBJC_MSGSEND = YES; 368 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 369 | GCC_C_LANGUAGE_STANDARD = gnu17; 370 | GCC_NO_COMMON_BLOCKS = YES; 371 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 372 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 373 | GCC_WARN_UNDECLARED_SELECTOR = YES; 374 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 375 | GCC_WARN_UNUSED_FUNCTION = YES; 376 | GCC_WARN_UNUSED_VARIABLE = YES; 377 | IPHONEOS_DEPLOYMENT_TARGET = 17.2; 378 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 379 | MTL_ENABLE_DEBUG_INFO = NO; 380 | MTL_FAST_MATH = YES; 381 | SDKROOT = iphoneos; 382 | SWIFT_COMPILATION_MODE = wholemodule; 383 | SWIFT_EMIT_LOC_STRINGS = YES; 384 | VALIDATE_PRODUCT = YES; 385 | }; 386 | name = Release; 387 | }; 388 | 7C73FE552DEFE199005437F4 /* Debug */ = { 389 | isa = XCBuildConfiguration; 390 | baseConfigurationReference = 7DF1A82A5EBABC164C97572F /* Pods-FaceAISDK_iOS.debug.xcconfig */; 391 | buildSettings = { 392 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 393 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 394 | CODE_SIGN_STYLE = Automatic; 395 | CURRENT_PROJECT_VERSION = 1; 396 | DEVELOPMENT_ASSET_PATHS = "\"FaceAISDK_iOS/Preview Content\""; 397 | DEVELOPMENT_TEAM = G35M5X479Y; 398 | ENABLE_PREVIEWS = YES; 399 | ENABLE_USER_SCRIPT_SANDBOXING = NO; 400 | GENERATE_INFOPLIST_FILE = YES; 401 | INFOPLIST_KEY_NSCameraUsageDescription = "演示需要相机权限"; 402 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 403 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 404 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 405 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 406 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 407 | IPHONEOS_DEPLOYMENT_TARGET = 16.6; 408 | LD_RUNPATH_SEARCH_PATHS = ( 409 | "$(inherited)", 410 | "@executable_path/Frameworks", 411 | ); 412 | MARKETING_VERSION = 1.0; 413 | PRODUCT_BUNDLE_IDENTIFIER = "com.faceaisdk.FaceAISDK-iOS"; 414 | PRODUCT_NAME = "$(TARGET_NAME)"; 415 | SWIFT_EMIT_LOC_STRINGS = YES; 416 | SWIFT_VERSION = 5.0; 417 | TARGETED_DEVICE_FAMILY = "1,2"; 418 | }; 419 | name = Debug; 420 | }; 421 | 7C73FE562DEFE199005437F4 /* Release */ = { 422 | isa = XCBuildConfiguration; 423 | baseConfigurationReference = C259A2CEEE9096A1DEDAF78B /* Pods-FaceAISDK_iOS.release.xcconfig */; 424 | buildSettings = { 425 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 426 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 427 | CODE_SIGN_STYLE = Automatic; 428 | CURRENT_PROJECT_VERSION = 1; 429 | DEVELOPMENT_ASSET_PATHS = "\"FaceAISDK_iOS/Preview Content\""; 430 | DEVELOPMENT_TEAM = G35M5X479Y; 431 | ENABLE_PREVIEWS = YES; 432 | ENABLE_USER_SCRIPT_SANDBOXING = NO; 433 | GENERATE_INFOPLIST_FILE = YES; 434 | INFOPLIST_KEY_NSCameraUsageDescription = "演示需要相机权限"; 435 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 436 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 437 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 438 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 439 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 440 | IPHONEOS_DEPLOYMENT_TARGET = 16.6; 441 | LD_RUNPATH_SEARCH_PATHS = ( 442 | "$(inherited)", 443 | "@executable_path/Frameworks", 444 | ); 445 | MARKETING_VERSION = 1.0; 446 | PRODUCT_BUNDLE_IDENTIFIER = "com.faceaisdk.FaceAISDK-iOS"; 447 | PRODUCT_NAME = "$(TARGET_NAME)"; 448 | SWIFT_EMIT_LOC_STRINGS = YES; 449 | SWIFT_VERSION = 5.0; 450 | TARGETED_DEVICE_FAMILY = "1,2"; 451 | }; 452 | name = Release; 453 | }; 454 | /* End XCBuildConfiguration section */ 455 | 456 | /* Begin XCConfigurationList section */ 457 | 7C73FE412DEFE193005437F4 /* Build configuration list for PBXProject "FaceAISDK_iOS" */ = { 458 | isa = XCConfigurationList; 459 | buildConfigurations = ( 460 | 7C73FE522DEFE199005437F4 /* Debug */, 461 | 7C73FE532DEFE199005437F4 /* Release */, 462 | ); 463 | defaultConfigurationIsVisible = 0; 464 | defaultConfigurationName = Release; 465 | }; 466 | 7C73FE542DEFE199005437F4 /* Build configuration list for PBXNativeTarget "FaceAISDK_iOS" */ = { 467 | isa = XCConfigurationList; 468 | buildConfigurations = ( 469 | 7C73FE552DEFE199005437F4 /* Debug */, 470 | 7C73FE562DEFE199005437F4 /* Release */, 471 | ); 472 | defaultConfigurationIsVisible = 0; 473 | defaultConfigurationName = Release; 474 | }; 475 | /* End XCConfigurationList section */ 476 | 477 | /* Begin XCRemoteSwiftPackageReference section */ 478 | 7CE8BB9D2DF175D000A48545 /* XCRemoteSwiftPackageReference "ToastUI" */ = { 479 | isa = XCRemoteSwiftPackageReference; 480 | repositoryURL = "https://github.com/quanshousio/ToastUI.git"; 481 | requirement = { 482 | kind = upToNextMajorVersion; 483 | minimumVersion = 4.0.0; 484 | }; 485 | }; 486 | /* End XCRemoteSwiftPackageReference section */ 487 | 488 | /* Begin XCSwiftPackageProductDependency section */ 489 | 7CE8BB9E2DF175D000A48545 /* ToastUI */ = { 490 | isa = XCSwiftPackageProductDependency; 491 | package = 7CE8BB9D2DF175D000A48545 /* XCRemoteSwiftPackageReference "ToastUI" */; 492 | productName = ToastUI; 493 | }; 494 | /* End XCSwiftPackageProductDependency section */ 495 | }; 496 | rootObject = 7C73FE3E2DEFE193005437F4 /* Project object */; 497 | } 498 | -------------------------------------------------------------------------------- /FaceAISDK_iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /FaceAISDK_iOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /FaceAISDK_iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "pins" : [ 3 | { 4 | "identity" : "toastui", 5 | "kind" : "remoteSourceControl", 6 | "location" : "https://github.com/quanshousio/ToastUI.git", 7 | "state" : { 8 | "revision" : "146e2f52c132f681fbf798c8c9f0eb52f021f346", 9 | "version" : "4.0.0" 10 | } 11 | } 12 | ], 13 | "version" : 2 14 | } 15 | -------------------------------------------------------------------------------- /FaceAISDK_iOS.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /FaceAISDK_iOS.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /FaceAISDK_iOS.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "pins" : [ 3 | { 4 | "identity" : "toastui", 5 | "kind" : "remoteSourceControl", 6 | "location" : "https://github.com/quanshousio/ToastUI.git", 7 | "state" : { 8 | "revision" : "146e2f52c132f681fbf798c8c9f0eb52f021f346", 9 | "version" : "4.0.0" 10 | } 11 | } 12 | ], 13 | "version" : 2 14 | } 15 | -------------------------------------------------------------------------------- /FaceAISDK_iOS/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AnyLifeZLB/FaceAI_Android/44b0e6bca2b8b40f5544e4b8c4db6abe55536a85/FaceAISDK_iOS/.DS_Store -------------------------------------------------------------------------------- /FaceAISDK_iOS/AddFaceView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import AVFoundation 3 | import FaceAISDK_Core 4 | 5 | 6 | let cameraSize: CGFloat = 300 // 相机的尺寸 7 | 8 | 9 | /** 10 | * 人脸录入,摄像头采集画面需要真机调试 11 | * UI 样式仅供参考,根据你的业务可自行调整 12 | * 13 | */ 14 | public struct AddFaceView: View { 15 | //录入保存的FaceID 值。一般是你的业务体系中个人的唯一编码,比如账号 身份证 16 | let faceID: String 17 | let onDismiss: (String?) -> Void 18 | 19 | @StateObject private var viewModel: AddFaceModel = AddFaceModel() 20 | 21 | public var body: some View { 22 | VStack { 23 | Text(viewModel.addFaceTips) 24 | .font(.system(size: 19).bold()) 25 | .padding(.bottom, 5) 26 | .foregroundColor(.black) 27 | 28 | Text(viewModel.addFaceTipsExtra) 29 | .font(.system(size: 17).bold()) 30 | .padding(.bottom, 6) 31 | .frame(minHeight: 30) 32 | .foregroundColor(.black) 33 | 34 | FaceCameraPreview(session: viewModel.captureSession,cameraSize: cameraSize) 35 | .frame( 36 | width: min(UIScreen.main.bounds.width,cameraSize), 37 | height: min(UIScreen.main.bounds.width,cameraSize)) 38 | .aspectRatio(1.0, contentMode: .fit) //Enforce1:1ratio 39 | .clipShape(Circle()) // Clip to ensure square bounds 40 | .background(Color.white) 41 | 42 | Spacer() 43 | } 44 | 45 | .overlay { 46 | if viewModel.readyConfirmFace { 47 | // 弹窗让用户确认录入的人脸是否合规 48 | PopupConfirmView( 49 | viewModel:viewModel, 50 | onConfirm: { 51 | //保存人脸图和命名 52 | let facePath=viewModel.confirmSaveFaceAir(fileName: faceID) 53 | onDismiss(facePath) 54 | } 55 | ) 56 | } 57 | } 58 | .animation(.easeInOut, value: true) 59 | .onAppear { 60 | viewModel.initAddFace() 61 | } 62 | .onDisappear{ 63 | viewModel.stopAddFace() 64 | } 65 | .padding() 66 | .background(Color.white) 67 | } 68 | 69 | 70 | struct PopupConfirmView: View { 71 | let viewModel: AddFaceModel 72 | let onConfirm: () -> Void 73 | 74 | var body: some View { 75 | VStack(alignment: .center) { 76 | Text("人脸录入确认") 77 | .font(.headline) 78 | .foregroundColor(.black) 79 | .padding() 80 | 81 | Text("请录入清晰无遮挡正脸图") 82 | .multilineTextAlignment(.center) 83 | .foregroundColor(.black) 84 | .font(.system(size: 14).bold()) 85 | 86 | Image(uiImage:viewModel.canAddFace) 87 | .resizable() 88 | .scaledToFit() 89 | .frame(width: 160) 90 | .cornerRadius(9) 91 | 92 | HStack(spacing: 30) { 93 | Button("重试") { 94 | viewModel.reInit() 95 | } 96 | .padding() 97 | .frame(maxWidth: .infinity, maxHeight: 44) 98 | .background(Color.gray.opacity(0.2)) 99 | .cornerRadius(8) 100 | 101 | Button("确认") { 102 | onConfirm() //触发关闭弹窗和页面的操作 103 | } 104 | .padding() 105 | .frame(maxWidth: .infinity, maxHeight: 44) 106 | .background(Color.blue) 107 | .foregroundColor(.white) 108 | .cornerRadius(8) 109 | }.padding() 110 | 111 | } 112 | .frame(maxWidth: .infinity, minHeight: 250) 113 | .background(Color.white) 114 | .cornerRadius(9) 115 | .shadow(radius: 9) 116 | } 117 | } 118 | 119 | } 120 | 121 | 122 | 123 | /** 124 | * IDE 编辑预览 125 | */ 126 | //#Preview { 127 | // AddFaceView(faceID: <#String#>, onDismiss: <#(String) -> Void#>) 128 | //} 129 | -------------------------------------------------------------------------------- /FaceAISDK_iOS/Assets.xcassets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AnyLifeZLB/FaceAI_Android/44b0e6bca2b8b40f5544e4b8c4db6abe55536a85/FaceAISDK_iOS/Assets.xcassets/.DS_Store -------------------------------------------------------------------------------- /FaceAISDK_iOS/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /FaceAISDK_iOS/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "face_logo.png", 5 | "idiom" : "universal", 6 | "platform" : "ios", 7 | "size" : "1024x1024" 8 | } 9 | ], 10 | "info" : { 11 | "author" : "xcode", 12 | "version" : 1 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /FaceAISDK_iOS/Assets.xcassets/AppIcon.appiconset/face_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AnyLifeZLB/FaceAI_Android/44b0e6bca2b8b40f5544e4b8c4db6abe55536a85/FaceAISDK_iOS/Assets.xcassets/AppIcon.appiconset/face_logo.png -------------------------------------------------------------------------------- /FaceAISDK_iOS/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FaceAISDK_iOS/FaceAINaviView.swift: -------------------------------------------------------------------------------- 1 | // ContentView.swift 2 | import SwiftUI 3 | import FaceAISDK_Core 4 | 5 | 6 | /** 7 | * iOS FaceAISDK 功能导航页面 8 | */ 9 | struct FaceAINaviView: View { 10 | @State private var navigationPath = NavigationPath() 11 | @State private var addFaceResult: String? 12 | @State private var faceVerifyResult: FaceVerifyResult? 13 | 14 | //录入保存的FaceID 值。一般是你的业务体系中个人的唯一编码,比如账号 身份证 15 | private let faceID="yourFaceIDValue"; 16 | 17 | var body: some View { 18 | NavigationStack(path: $navigationPath) { 19 | VStack(spacing: 20) { 20 | 21 | Button("去添加人脸照片") { 22 | navigationPath.append(FaceAINaviDestination.AddFacePageView(faceID)) 23 | }.padding(.top,66) 24 | 25 | Text("保存路径:\(addFaceResult ?? " 暂无")") 26 | .font(.system(size: 10).bold()) 27 | .padding(.horizontal,18) 28 | 29 | Button("查看我的人脸底片") { 30 | navigationPath.append(FaceAINaviDestination.ImageDetailView(faceID)) 31 | }.padding(.top,44) 32 | 33 | 34 | Button("人脸识别,活体检测") { 35 | navigationPath.append(FaceAINaviDestination.VerifyFacePageView(faceID)) 36 | }.padding(.top,44) 37 | 38 | 39 | Spacer() 40 | 41 | Button("关于我们"){ 42 | // 记得切换成iOS 的介绍版本 43 | let url = URL(string: "https://mp.weixin.qq.com/s/R43s70guLqxA6JPEdWtjcA") 44 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 45 | if UIApplication.shared.canOpenURL(url!) { 46 | UIApplication.shared.open(url!) 47 | } 48 | } 49 | } 50 | 51 | } 52 | .navigationTitle("FaceAISDK Navi.🧭") 53 | .navigationDestination(for: FaceAINaviDestination.self) { destination in 54 | switch destination { 55 | 56 | case .AddFacePageView(let param): 57 | AddFaceView(faceID: param,onDismiss: { result in 58 | addFaceResult = result 59 | navigationPath.removeLast() 60 | }) 61 | 62 | case .VerifyFacePageView(let param): 63 | //设置的相似度阈值threshold越高,对人脸角度,环境光线和摄像头宽动态要求越高 64 | VerifyFaceView(faceID: param,threshold: 0.85, onDismiss: { result in 65 | faceVerifyResult = result 66 | 67 | // faceVerifyResult.code 68 | // -2 人脸识别动作活体检测超过10秒 69 | // -1 多次切换人脸或检查失败 70 | // 0 默认值 71 | // 1 人脸识别对比成功大于设置的threshold 72 | // 2 人脸识别对比识别小于设置的threshold 73 | 74 | 75 | if !navigationPath.isEmpty { // 检查路径是否为空 76 | navigationPath.removeLast() 77 | } 78 | }) 79 | case .ImageDetailView(let param): 80 | ImageDetailView(faceID: param,onDismiss: { result in 81 | navigationPath.removeLast() 82 | }) 83 | 84 | } 85 | } 86 | } 87 | } 88 | 89 | 90 | 91 | } 92 | 93 | 94 | enum FaceAINaviDestination: Hashable { 95 | case AddFacePageView(String) 96 | case VerifyFacePageView(String) 97 | case ImageDetailView(String) 98 | } 99 | 100 | #Preview { 101 | FaceAINaviView() 102 | } 103 | -------------------------------------------------------------------------------- /FaceAISDK_iOS/FaceAISDK_iOSApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FaceAISDK_iOSApp.swift 3 | // FaceAISDK_iOS 4 | // 5 | // Created by anylife on 2025/6/4. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct FaceAISDK_iOSApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | FaceAINaviView() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /FaceAISDK_iOS/ImageDetailView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | 4 | // 5 | // ImageDetailView.swift 6 | // SDKDev 7 | // 8 | // Created by anylife on 5/30/25. 9 | // 10 | 11 | struct ImageDetailView: View { 12 | 13 | @Environment(\.dismiss) private var dismiss 14 | @State private var uiImage: UIImage? 15 | 16 | let faceID: String 17 | let onDismiss: (String) -> Void 18 | 19 | var body: some View { 20 | VStack { 21 | //加一点人脸合规的提示🔔 22 | 23 | if let uiImage = uiImage { 24 | Image(uiImage: uiImage) 25 | .resizable() 26 | .scaledToFit() 27 | .aspectRatio(contentMode: .fit) 28 | .frame(width: 150, height: 150) 29 | .padding(100) 30 | .background(Color.gray.opacity(0.1)) 31 | } 32 | Button("知道了") { 33 | dismiss() 34 | } 35 | .padding() 36 | } 37 | .onAppear(){ 38 | let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] 39 | let fileURL = documentDirectory.appendingPathComponent(faceID) 40 | 41 | guard FileManager.default.fileExists(atPath: fileURL.path) else { 42 | print("文件不存在: \(faceID)") 43 | return 44 | } 45 | 46 | DispatchQueue.global(qos: .userInitiated).async { 47 | if let imageData = try? Data(contentsOf: fileURL), 48 | let loadedImage = UIImage(data: imageData) { 49 | 50 | DispatchQueue.main.async { 51 | self.uiImage = loadedImage 52 | } 53 | } else { 54 | print("图片加载失败: \(faceID)") 55 | } 56 | } 57 | } 58 | 59 | } 60 | 61 | 62 | } 63 | -------------------------------------------------------------------------------- /FaceAISDK_iOS/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FaceAISDK_iOS/VerifyFaceView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import AVFoundation 3 | import FaceAISDK_Core 4 | import ToastUI 5 | 6 | 7 | /** 8 | * 人脸识别,摄像头采集画面需要真机调试 9 | * UI 样式仅供参考,根据你的业务可自行调整 10 | */ 11 | struct VerifyFaceView: View { 12 | //确保ViewModel的生命周期与视图一致,使用@StateObject持有ViewModel,视图被销毁时会一起释放 13 | @StateObject private var viewModel: VerifyFaceModel = VerifyFaceModel() 14 | @State private var showToast = false 15 | @Environment(\.dismiss) private var dismiss 16 | 17 | //录入保存的FaceID 值。一般是你的业务体系中个人的唯一编码,比如账号 身份证 18 | let faceID: String 19 | //人脸相似度阈值,范围0.8到0.95. 20 | //设置的相似度阈值越高,对人脸角度,环境光线和摄像头宽动态要求越高 21 | let threshold:Float 22 | let onDismiss: (FaceVerifyResult) -> Void 23 | 24 | var body: some View { 25 | VStack { 26 | Text(viewModel.verifyFaceTips) 27 | .font(.system(size: 19).bold()) 28 | .padding(.bottom, 5) 29 | .foregroundColor(.black) 30 | 31 | Text(viewModel.verifyFaceTipsExtra) 32 | .font(.system(size: 17).bold()) 33 | .padding(.bottom, 6) 34 | .frame(minHeight: 30) 35 | .foregroundColor(.black) 36 | 37 | FaceCameraPreview(session: viewModel.captureSession,cameraSize: cameraSize) 38 | .frame( 39 | width: min(UIScreen.main.bounds.width,cameraSize), 40 | height: min(UIScreen.main.bounds.width,cameraSize)) 41 | .aspectRatio(1.0, contentMode: .fit) //Enforce1:1ratio 42 | .clipShape(Circle()) //Clip to ensure square bounds 43 | 44 | Spacer() 45 | } 46 | 47 | .onAppear { 48 | //初始化人脸引擎,设置人脸识别的底片和比对相似度阈值(0.8到0.95) 49 | //设置的相似度阈值越高,对人脸角度,环境光线和摄像头宽动态要求越高 50 | //动作活体目前是随机的两个步骤,当前不支持设置,6月底会开发更多设置 51 | viewModel.initFaceAISDK(faceIDParam: faceID,threshold: threshold) 52 | } 53 | 54 | .onChange(of: viewModel.faceVerifyResult.code) { newValue in 55 | showToast = true 56 | DispatchQueue.main.asyncAfter(deadline: .now() + 1) { 57 | showToast = false 58 | onDismiss(viewModel.faceVerifyResult) // 传值给父视图 59 | dismiss() // 关闭页面 60 | } 61 | } 62 | 63 | .toast(isPresented: $showToast) { 64 | ToastView(" \(viewModel.faceVerifyResult.tips)") 65 | .toastViewStyle(.information) 66 | } 67 | 68 | .onDisappear{ 69 | viewModel.stopFaceVerify() //停止 70 | } 71 | .padding() 72 | .background(Color.white) 73 | } 74 | } 75 | 76 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | FaceAISDK License 2 | 3 | 4 | 可离线人脸识别认证SDK是由FaceAISDK工作室(以下简称“我们”或“FaceAISDK”)面向应用开发者(以下简称“开发者”)提供的在应用中认证使用者是否为本人,实现人脸登录、人脸考勤等需要校验是否真实本人的能力及服务。 5 | 6 | 开发者根据FaceAISDK的开发文档和SDK源码集成指南在其应用中集成了FaceAISDK后,我们将通过被集成的FaceAISDK向开发者的最终用户(以下简称“您”或“用户”)提供相关服务,处理开发者应用相关的数据,相关数据中可能包含您的个人信息。FaceAISDK非常重视您的个人信息和隐私保护,SDK本身不用联网就能工作,设备相机访问权限仅仅从摄像头获取人脸认证图像,本SDK不收集不传输存储个人信息数据到本SDK后台。 7 | 8 | 请注意:我们要求集成FaceAISDK的所有开发者严格遵循法律法规;在接入、使用各开放能力前,我们要求开发者在其产品应用的隐私政策中向您告知其集成SDK处理个人信息的基本情况,并获取您的同意或取得其他合法性基础。但我们无法控制开发者及其开发者应用如何处理开发者所控制的个人信息,也不对其行为负责。我们建议您认真阅读开发者应用相关用户协议及隐私政策,在确认充分了解并同意开发者如何处理您的个人信息后再使用开发者应用。 9 | 10 | 11 | 版权声明:FaceAISDK的开发文档和SDK源码集成指南为了方便开发者接入可以随意下载传播。严禁复制、变更、反向工程、反汇编、反编译、拆装、企图导出本SDK源代码、解码、其他对本SDK的源代码、构造、构思等进行解析或者复制的行为; 12 | 严禁赠与、借用、租用、转让、售卖、再分发、其他再许可本软件的相关行为 13 | FaceAISDK工作室对本SDK享有和保留所有权利、其他相关权利和资格,并保留本协议未明确授予您的其他任何权利。 14 | 15 | 如何联系我们 16 | Email:FaceAISDK.Service@gmail.com -------------------------------------------------------------------------------- /Localizable.xcstrings: -------------------------------------------------------------------------------- 1 | { 2 | "sourceLanguage" : "en", 3 | "strings" : { 4 | "AppName" : { 5 | "extractionState" : "manual", 6 | "localizations" : { 7 | "en" : { 8 | "stringUnit" : { 9 | "state" : "translated", 10 | "value" : "FaceAISDK" 11 | } 12 | } 13 | } 14 | }, 15 | "FaceAlign" : { 16 | "extractionState" : "manual" 17 | } 18 | }, 19 | "version" : "1.0" 20 | } -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'FaceAISDK_iOS' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # 1. pod install --repo-update 安装依赖 9 | # 2. ToastUI 使用SPM 管理 File->Add Package Dependence https://github.com/quanshousio/ToastUI.git 10 | 11 | pod 'FaceAISDK_Core', '0.0.91.airXC' 12 | 13 | 14 | 15 | end 16 | 17 | 18 | post_install do |installer| 19 | installer.pods_project.targets.each do |target| 20 | if target.name == 'FaceAISDK_Core' 21 | target.build_configurations.each do |config| 22 | config.build_settings['SWIFT_VERSION'] = '5.9.2' # 改为你的主项目版本 23 | end 24 | end 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - FaceAISDK_Core (0.0.91.airXC): 3 | - GoogleMLKit/FaceDetection 4 | - TensorFlowLiteSwift 5 | - GoogleDataTransport (10.1.0): 6 | - nanopb (~> 3.30910.0) 7 | - PromisesObjC (~> 2.4) 8 | - GoogleMLKit/FaceDetection (8.0.0): 9 | - GoogleMLKit/MLKitCore 10 | - MLKitFaceDetection (~> 7.0.0) 11 | - GoogleMLKit/MLKitCore (8.0.0): 12 | - MLKitCommon (~> 13.0.0) 13 | - GoogleToolboxForMac/Defines (4.2.1) 14 | - GoogleToolboxForMac/Logger (4.2.1): 15 | - GoogleToolboxForMac/Defines (= 4.2.1) 16 | - "GoogleToolboxForMac/NSData+zlib (4.2.1)": 17 | - GoogleToolboxForMac/Defines (= 4.2.1) 18 | - GoogleUtilities/Environment (8.1.0): 19 | - GoogleUtilities/Privacy 20 | - GoogleUtilities/Logger (8.1.0): 21 | - GoogleUtilities/Environment 22 | - GoogleUtilities/Privacy 23 | - GoogleUtilities/Privacy (8.1.0) 24 | - GoogleUtilities/UserDefaults (8.1.0): 25 | - GoogleUtilities/Logger 26 | - GoogleUtilities/Privacy 27 | - GTMSessionFetcher/Core (3.5.0) 28 | - MLImage (1.0.0-beta7) 29 | - MLKitCommon (13.0.0): 30 | - GoogleDataTransport (~> 10.0) 31 | - GoogleToolboxForMac/Logger (< 5.0, >= 4.2.1) 32 | - "GoogleToolboxForMac/NSData+zlib (< 5.0, >= 4.2.1)" 33 | - GoogleUtilities/Logger (~> 8.0) 34 | - GoogleUtilities/UserDefaults (~> 8.0) 35 | - GTMSessionFetcher/Core (< 4.0, >= 3.3.2) 36 | - MLKitFaceDetection (7.0.0): 37 | - MLKitCommon (~> 13.0) 38 | - MLKitVision (~> 9.0) 39 | - MLKitVision (9.0.0): 40 | - GoogleToolboxForMac/Logger (< 5.0, >= 4.2.1) 41 | - "GoogleToolboxForMac/NSData+zlib (< 5.0, >= 4.2.1)" 42 | - GTMSessionFetcher/Core (< 4.0, >= 3.3.2) 43 | - MLImage (= 1.0.0-beta7) 44 | - MLKitCommon (~> 13.0) 45 | - nanopb (3.30910.0): 46 | - nanopb/decode (= 3.30910.0) 47 | - nanopb/encode (= 3.30910.0) 48 | - nanopb/decode (3.30910.0) 49 | - nanopb/encode (3.30910.0) 50 | - PromisesObjC (2.4.0) 51 | - TensorFlowLiteC (2.17.0): 52 | - TensorFlowLiteC/Core (= 2.17.0) 53 | - TensorFlowLiteC/Core (2.17.0) 54 | - TensorFlowLiteSwift (2.17.0): 55 | - TensorFlowLiteSwift/Core (= 2.17.0) 56 | - TensorFlowLiteSwift/Core (2.17.0): 57 | - TensorFlowLiteC (= 2.17.0) 58 | - TensorFlowLiteSwift/Privacy (= 2.17.0) 59 | - TensorFlowLiteSwift/Privacy (2.17.0) 60 | 61 | DEPENDENCIES: 62 | - FaceAISDK_Core (= 0.0.91.airXC) 63 | 64 | SPEC REPOS: 65 | trunk: 66 | - FaceAISDK_Core 67 | - GoogleDataTransport 68 | - GoogleMLKit 69 | - GoogleToolboxForMac 70 | - GoogleUtilities 71 | - GTMSessionFetcher 72 | - MLImage 73 | - MLKitCommon 74 | - MLKitFaceDetection 75 | - MLKitVision 76 | - nanopb 77 | - PromisesObjC 78 | - TensorFlowLiteC 79 | - TensorFlowLiteSwift 80 | 81 | SPEC CHECKSUMS: 82 | FaceAISDK_Core: 425ec3ad9ef1e06d67263aa2be4ac5c881aa257e 83 | GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 84 | GoogleMLKit: ddd51d7dff36ff28defa69afedd9cdce684fd857 85 | GoogleToolboxForMac: d1a2cbf009c453f4d6ded37c105e2f67a32206d8 86 | GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 87 | GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 88 | MLImage: 2ab9c968e75f57911c16f4c9d9e8a8e9604a86a1 89 | MLKitCommon: 26b779f072a182c1603d4c88a101c350cac837b1 90 | MLKitFaceDetection: d50aff1a44aa9a4e95f7e208298a3ce40b68f9f8 91 | MLKitVision: fa8dea9012ac59497c79ddbe9ebf32051047ac4c 92 | nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 93 | PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 94 | TensorFlowLiteC: eac6d689a8d391d1b202dc59e3d9165ba64aaf73 95 | TensorFlowLiteSwift: 723fe42222815e72490c79feeff05305530de393 96 | 97 | PODFILE CHECKSUM: ca04a1806dfb14f8f776e565fc7a2b4df1818010 98 | 99 | COCOAPODS: 1.16.2 100 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 | 7 |
8 | 9 | 10 | ## FaceAISDK 介绍 11 | iOS FaceAISDK is on_device Offline Face Detection 、Recognition 、Liveness Detection Anti Spoofing SDK. 12 | FaceAISDK是iOS 设备端可离线不需联网的人脸识别、动作活体检测、人脸录入SDK,集成后可快速实现相关功能。 13 | 14 | 15 | . 16 |
17 | 18 |
19 | . 20 | 21 | 22 | 23 | ## 集成步骤 24 | SDK 默认的开发环境为Xcode 16+,语言为OC,C,Swift 6.1(重构完后会降级);UI为SwiftUI实现 25 | 26 | #### 1.Podfile 添加 pod 'FaceAISDK', ' version' 27 | 28 | 首次依赖安装Installing TensorFlowLiteSwift 会耗费10分钟左右时间(实际取决于你的网络状态) 29 | 更新到新版本SDK pod install --repo-update(请指定版本号,确保科学上网能同步GitHub) 30 | ToastUI 使用SPM 管理 File->Add Package Dependence https://github.com/quanshousio/ToastUI.git 31 | 32 | #### 2. 拷贝FaceAINaviView,AddFaceView,VerifyFaceView 到你的工程 33 | 记得声明相机使用权限;应用内跳转到 FaceAINaviView功能演示导航页面你就可以开始体验效果 34 | 35 | #### 3. 根据你的业务需求修改View 和参数设置等定制你的应用 36 | SDK中人脸录入和识别都需要指定一个唯一的FaceID Key来关联你的用户,可以使用注册的手机号,身份证等 37 | 动作活体检测可以指定动作活体的步骤个数为1还是2个;其中SDK 的UI实现是完整暴露给开发者自由修改 38 | 39 | ## 其他说明 40 | 本SDK 需要摄像头实时获取预览数据,目前只支持真机调试。 41 | 42 | 微信:HaoNan19990322 43 | Email: FaceAISDK.Service@gmail.com 44 | 45 | ## 其他平台? 46 | 47 | uniApp: https://github.com/AnyLifeZLB/UniPlugin-FaceAISDK 48 | Android:https://github.com/AnyLifeZLB/FaceVerificationSDK 49 | 50 | Android体验Demo APK下载如下 51 | 52 |
53 | 54 |
55 | 56 | . 57 | 58 | 59 | 60 | --------------------------------------------------------------------------------