├── ConfuseDemo.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── ConfuseFW.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcuserdata │ └── zhang.xcuserdatad │ └── xcschemes │ ├── ConfuseFW.xcscheme │ ├── safeConnfuse.xcscheme │ ├── unconnfuse.xcscheme │ └── xcschememanagement.plist ├── ConfuseFW ├── ConfuseClass.swift ├── ConfuseFW.h └── Info.plist ├── Example ├── Example.xcodeproj │ ├── project.pbxproj │ └── xcuserdata │ │ └── zhang.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist └── Example │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── ViewController.swift ├── Framework └── ConfuseFW.framework │ ├── ConfuseFW │ ├── Headers │ ├── ConfuseFW-Swift.h │ └── ConfuseFW.h │ ├── Info.plist │ └── Modules │ ├── ConfuseFW.swiftmodule │ ├── arm.swiftdoc │ ├── arm.swiftmodule │ ├── arm64.swiftdoc │ ├── arm64.swiftmodule │ ├── i386.swiftdoc │ ├── i386.swiftmodule │ ├── x86_64.swiftdoc │ └── x86_64.swiftmodule │ └── module.modulemap ├── README.md └── confuseAndBuild.sh /ConfuseDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ConfuseDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ConfuseFW.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXAggregateTarget section */ 10 | 1FF5F58620A6D2750053CD22 /* safeConnfuseAndBuild */ = { 11 | isa = PBXAggregateTarget; 12 | buildConfigurationList = 1FF5F58920A6D2750053CD22 /* Build configuration list for PBXAggregateTarget "safeConnfuseAndBuild" */; 13 | buildPhases = ( 14 | 1FF5F59220A6D2930053CD22 /* ShellScript */, 15 | ); 16 | dependencies = ( 17 | ); 18 | name = safeConnfuseAndBuild; 19 | productName = safeConnfuseAndBuild; 20 | }; 21 | 1FF5F58A20A6D2790053CD22 /* safeConnfuse */ = { 22 | isa = PBXAggregateTarget; 23 | buildConfigurationList = 1FF5F58B20A6D2790053CD22 /* Build configuration list for PBXAggregateTarget "safeConnfuse" */; 24 | buildPhases = ( 25 | 1FF5F59320A6D2970053CD22 /* ShellScript */, 26 | ); 27 | dependencies = ( 28 | ); 29 | name = safeConnfuse; 30 | productName = safeConnfuseAndBuild; 31 | }; 32 | 1FF5F58E20A6D27A0053CD22 /* unconnfuse */ = { 33 | isa = PBXAggregateTarget; 34 | buildConfigurationList = 1FF5F58F20A6D27A0053CD22 /* Build configuration list for PBXAggregateTarget "unconnfuse" */; 35 | buildPhases = ( 36 | 1FF5F59420A6D2990053CD22 /* ShellScript */, 37 | ); 38 | dependencies = ( 39 | ); 40 | name = unconnfuse; 41 | productName = safeConnfuseAndBuild; 42 | }; 43 | /* End PBXAggregateTarget section */ 44 | 45 | /* Begin PBXBuildFile section */ 46 | 1F3EAAE520A6CD25007E25CD /* ConfuseFW.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3EAAE320A6CD25007E25CD /* ConfuseFW.h */; settings = {ATTRIBUTES = (Public, ); }; }; 47 | 1F3EAAEC20A6CD44007E25CD /* ConfuseClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F3EAAEB20A6CD44007E25CD /* ConfuseClass.swift */; }; 48 | /* End PBXBuildFile section */ 49 | 50 | /* Begin PBXFileReference section */ 51 | 1F3EAAE020A6CD25007E25CD /* ConfuseFW.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ConfuseFW.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | 1F3EAAE320A6CD25007E25CD /* ConfuseFW.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ConfuseFW.h; sourceTree = ""; }; 53 | 1F3EAAE420A6CD25007E25CD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54 | 1F3EAAEB20A6CD44007E25CD /* ConfuseClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfuseClass.swift; sourceTree = ""; }; 55 | /* End PBXFileReference section */ 56 | 57 | /* Begin PBXFrameworksBuildPhase section */ 58 | 1F3EAADC20A6CD25007E25CD /* Frameworks */ = { 59 | isa = PBXFrameworksBuildPhase; 60 | buildActionMask = 2147483647; 61 | files = ( 62 | ); 63 | runOnlyForDeploymentPostprocessing = 0; 64 | }; 65 | /* End PBXFrameworksBuildPhase section */ 66 | 67 | /* Begin PBXGroup section */ 68 | 1F3EAAD620A6CD25007E25CD = { 69 | isa = PBXGroup; 70 | children = ( 71 | 1F3EAAE220A6CD25007E25CD /* ConfuseFW */, 72 | 1F3EAAE120A6CD25007E25CD /* Products */, 73 | ); 74 | sourceTree = ""; 75 | }; 76 | 1F3EAAE120A6CD25007E25CD /* Products */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | 1F3EAAE020A6CD25007E25CD /* ConfuseFW.framework */, 80 | ); 81 | name = Products; 82 | sourceTree = ""; 83 | }; 84 | 1F3EAAE220A6CD25007E25CD /* ConfuseFW */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 1F3EAAE320A6CD25007E25CD /* ConfuseFW.h */, 88 | 1F3EAAEB20A6CD44007E25CD /* ConfuseClass.swift */, 89 | 1F3EAAE420A6CD25007E25CD /* Info.plist */, 90 | ); 91 | path = ConfuseFW; 92 | sourceTree = ""; 93 | }; 94 | /* End PBXGroup section */ 95 | 96 | /* Begin PBXHeadersBuildPhase section */ 97 | 1F3EAADD20A6CD25007E25CD /* Headers */ = { 98 | isa = PBXHeadersBuildPhase; 99 | buildActionMask = 2147483647; 100 | files = ( 101 | 1F3EAAE520A6CD25007E25CD /* ConfuseFW.h in Headers */, 102 | ); 103 | runOnlyForDeploymentPostprocessing = 0; 104 | }; 105 | /* End PBXHeadersBuildPhase section */ 106 | 107 | /* Begin PBXNativeTarget section */ 108 | 1F3EAADF20A6CD25007E25CD /* ConfuseFW */ = { 109 | isa = PBXNativeTarget; 110 | buildConfigurationList = 1F3EAAE820A6CD25007E25CD /* Build configuration list for PBXNativeTarget "ConfuseFW" */; 111 | buildPhases = ( 112 | 1F3EAADB20A6CD25007E25CD /* Sources */, 113 | 1F3EAADC20A6CD25007E25CD /* Frameworks */, 114 | 1F3EAADD20A6CD25007E25CD /* Headers */, 115 | 1F3EAADE20A6CD25007E25CD /* Resources */, 116 | ); 117 | buildRules = ( 118 | ); 119 | dependencies = ( 120 | ); 121 | name = ConfuseFW; 122 | productName = ConfuseFW; 123 | productReference = 1F3EAAE020A6CD25007E25CD /* ConfuseFW.framework */; 124 | productType = "com.apple.product-type.framework"; 125 | }; 126 | /* End PBXNativeTarget section */ 127 | 128 | /* Begin PBXProject section */ 129 | 1F3EAAD720A6CD25007E25CD /* Project object */ = { 130 | isa = PBXProject; 131 | attributes = { 132 | LastUpgradeCheck = 0930; 133 | ORGANIZATIONNAME = Zhang; 134 | TargetAttributes = { 135 | 1F3EAADF20A6CD25007E25CD = { 136 | CreatedOnToolsVersion = 9.3; 137 | LastSwiftMigration = 0930; 138 | ProvisioningStyle = Automatic; 139 | }; 140 | 1FF5F58620A6D2750053CD22 = { 141 | CreatedOnToolsVersion = 9.3; 142 | ProvisioningStyle = Automatic; 143 | }; 144 | 1FF5F58A20A6D2790053CD22 = { 145 | ProvisioningStyle = Automatic; 146 | }; 147 | 1FF5F58E20A6D27A0053CD22 = { 148 | ProvisioningStyle = Automatic; 149 | }; 150 | }; 151 | }; 152 | buildConfigurationList = 1F3EAADA20A6CD25007E25CD /* Build configuration list for PBXProject "ConfuseFW" */; 153 | compatibilityVersion = "Xcode 8.0"; 154 | developmentRegion = en; 155 | hasScannedForEncodings = 0; 156 | knownRegions = ( 157 | en, 158 | ); 159 | mainGroup = 1F3EAAD620A6CD25007E25CD; 160 | productRefGroup = 1F3EAAE120A6CD25007E25CD /* Products */; 161 | projectDirPath = ""; 162 | projectRoot = ""; 163 | targets = ( 164 | 1F3EAADF20A6CD25007E25CD /* ConfuseFW */, 165 | 1FF5F58620A6D2750053CD22 /* safeConnfuseAndBuild */, 166 | 1FF5F58A20A6D2790053CD22 /* safeConnfuse */, 167 | 1FF5F58E20A6D27A0053CD22 /* unconnfuse */, 168 | ); 169 | }; 170 | /* End PBXProject section */ 171 | 172 | /* Begin PBXResourcesBuildPhase section */ 173 | 1F3EAADE20A6CD25007E25CD /* Resources */ = { 174 | isa = PBXResourcesBuildPhase; 175 | buildActionMask = 2147483647; 176 | files = ( 177 | ); 178 | runOnlyForDeploymentPostprocessing = 0; 179 | }; 180 | /* End PBXResourcesBuildPhase section */ 181 | 182 | /* Begin PBXShellScriptBuildPhase section */ 183 | 1FF5F59220A6D2930053CD22 /* ShellScript */ = { 184 | isa = PBXShellScriptBuildPhase; 185 | buildActionMask = 2147483647; 186 | files = ( 187 | ); 188 | inputPaths = ( 189 | ); 190 | outputPaths = ( 191 | ); 192 | runOnlyForDeploymentPostprocessing = 0; 193 | shellPath = /bin/sh; 194 | shellScript = "# import\nsource $PROJECT_DIR/confuseAndBuild.sh\n\n# 1. [去混淆->]备份->再混淆\n# 2. 自动编译\n# 3. 去混淆\nsafeConfuseAndBuild\n\n"; 195 | }; 196 | 1FF5F59320A6D2970053CD22 /* ShellScript */ = { 197 | isa = PBXShellScriptBuildPhase; 198 | buildActionMask = 2147483647; 199 | files = ( 200 | ); 201 | inputPaths = ( 202 | ); 203 | outputPaths = ( 204 | ); 205 | runOnlyForDeploymentPostprocessing = 0; 206 | shellPath = /bin/sh; 207 | shellScript = "# import\nsource $PROJECT_DIR/confuseAndBuild.sh\n\n# [去混淆->]备份->再混淆\nsafeConfuse\n"; 208 | }; 209 | 1FF5F59420A6D2990053CD22 /* ShellScript */ = { 210 | isa = PBXShellScriptBuildPhase; 211 | buildActionMask = 2147483647; 212 | files = ( 213 | ); 214 | inputPaths = ( 215 | ); 216 | outputPaths = ( 217 | ); 218 | runOnlyForDeploymentPostprocessing = 0; 219 | shellPath = /bin/sh; 220 | shellScript = "# import\nsource $PROJECT_DIR/confuseAndBuild.sh\n\n# 去混淆\nunconfuse\n"; 221 | }; 222 | /* End PBXShellScriptBuildPhase section */ 223 | 224 | /* Begin PBXSourcesBuildPhase section */ 225 | 1F3EAADB20A6CD25007E25CD /* Sources */ = { 226 | isa = PBXSourcesBuildPhase; 227 | buildActionMask = 2147483647; 228 | files = ( 229 | 1F3EAAEC20A6CD44007E25CD /* ConfuseClass.swift in Sources */, 230 | ); 231 | runOnlyForDeploymentPostprocessing = 0; 232 | }; 233 | /* End PBXSourcesBuildPhase section */ 234 | 235 | /* Begin XCBuildConfiguration section */ 236 | 1F3EAAE620A6CD25007E25CD /* Debug */ = { 237 | isa = XCBuildConfiguration; 238 | buildSettings = { 239 | ALWAYS_SEARCH_USER_PATHS = NO; 240 | CLANG_ANALYZER_NONNULL = YES; 241 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 242 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 243 | CLANG_CXX_LIBRARY = "libc++"; 244 | CLANG_ENABLE_MODULES = YES; 245 | CLANG_ENABLE_OBJC_ARC = YES; 246 | CLANG_ENABLE_OBJC_WEAK = YES; 247 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 248 | CLANG_WARN_BOOL_CONVERSION = YES; 249 | CLANG_WARN_COMMA = YES; 250 | CLANG_WARN_CONSTANT_CONVERSION = YES; 251 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 252 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 253 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 254 | CLANG_WARN_EMPTY_BODY = YES; 255 | CLANG_WARN_ENUM_CONVERSION = YES; 256 | CLANG_WARN_INFINITE_RECURSION = YES; 257 | CLANG_WARN_INT_CONVERSION = YES; 258 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 259 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 260 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 261 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 262 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 263 | CLANG_WARN_STRICT_PROTOTYPES = YES; 264 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 265 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 266 | CLANG_WARN_UNREACHABLE_CODE = YES; 267 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 268 | CODE_SIGN_IDENTITY = "iPhone Developer"; 269 | COPY_PHASE_STRIP = NO; 270 | CURRENT_PROJECT_VERSION = 1; 271 | DEBUG_INFORMATION_FORMAT = dwarf; 272 | ENABLE_STRICT_OBJC_MSGSEND = YES; 273 | ENABLE_TESTABILITY = YES; 274 | GCC_C_LANGUAGE_STANDARD = gnu11; 275 | GCC_DYNAMIC_NO_PIC = NO; 276 | GCC_NO_COMMON_BLOCKS = YES; 277 | GCC_OPTIMIZATION_LEVEL = 0; 278 | GCC_PREPROCESSOR_DEFINITIONS = ( 279 | "DEBUG=1", 280 | "$(inherited)", 281 | ); 282 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 283 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 284 | GCC_WARN_UNDECLARED_SELECTOR = YES; 285 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 286 | GCC_WARN_UNUSED_FUNCTION = YES; 287 | GCC_WARN_UNUSED_VARIABLE = YES; 288 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 289 | MTL_ENABLE_DEBUG_INFO = YES; 290 | ONLY_ACTIVE_ARCH = YES; 291 | SDKROOT = iphoneos; 292 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 293 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 294 | VERSIONING_SYSTEM = "apple-generic"; 295 | VERSION_INFO_PREFIX = ""; 296 | }; 297 | name = Debug; 298 | }; 299 | 1F3EAAE720A6CD25007E25CD /* Release */ = { 300 | isa = XCBuildConfiguration; 301 | buildSettings = { 302 | ALWAYS_SEARCH_USER_PATHS = NO; 303 | CLANG_ANALYZER_NONNULL = YES; 304 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 305 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 306 | CLANG_CXX_LIBRARY = "libc++"; 307 | CLANG_ENABLE_MODULES = YES; 308 | CLANG_ENABLE_OBJC_ARC = YES; 309 | CLANG_ENABLE_OBJC_WEAK = YES; 310 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 311 | CLANG_WARN_BOOL_CONVERSION = YES; 312 | CLANG_WARN_COMMA = YES; 313 | CLANG_WARN_CONSTANT_CONVERSION = YES; 314 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 315 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 316 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 317 | CLANG_WARN_EMPTY_BODY = YES; 318 | CLANG_WARN_ENUM_CONVERSION = YES; 319 | CLANG_WARN_INFINITE_RECURSION = YES; 320 | CLANG_WARN_INT_CONVERSION = YES; 321 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 322 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 323 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 324 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 325 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 326 | CLANG_WARN_STRICT_PROTOTYPES = YES; 327 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 328 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 329 | CLANG_WARN_UNREACHABLE_CODE = YES; 330 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 331 | CODE_SIGN_IDENTITY = "iPhone Developer"; 332 | COPY_PHASE_STRIP = NO; 333 | CURRENT_PROJECT_VERSION = 1; 334 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 335 | ENABLE_NS_ASSERTIONS = NO; 336 | ENABLE_STRICT_OBJC_MSGSEND = YES; 337 | GCC_C_LANGUAGE_STANDARD = gnu11; 338 | GCC_NO_COMMON_BLOCKS = YES; 339 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 340 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 341 | GCC_WARN_UNDECLARED_SELECTOR = YES; 342 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 343 | GCC_WARN_UNUSED_FUNCTION = YES; 344 | GCC_WARN_UNUSED_VARIABLE = YES; 345 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 346 | MTL_ENABLE_DEBUG_INFO = NO; 347 | SDKROOT = iphoneos; 348 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 349 | VALIDATE_PRODUCT = YES; 350 | VERSIONING_SYSTEM = "apple-generic"; 351 | VERSION_INFO_PREFIX = ""; 352 | }; 353 | name = Release; 354 | }; 355 | 1F3EAAE920A6CD25007E25CD /* Debug */ = { 356 | isa = XCBuildConfiguration; 357 | buildSettings = { 358 | CLANG_ENABLE_MODULES = YES; 359 | CODE_SIGN_IDENTITY = ""; 360 | CODE_SIGN_STYLE = Automatic; 361 | DEFINES_MODULE = YES; 362 | DEVELOPMENT_TEAM = J3FWM26YDF; 363 | DYLIB_COMPATIBILITY_VERSION = 1; 364 | DYLIB_CURRENT_VERSION = 1; 365 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 366 | INFOPLIST_FILE = ConfuseFW/Info.plist; 367 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 368 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 369 | PRODUCT_BUNDLE_IDENTIFIER = JonorZhang.ConfuseFW; 370 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 371 | SKIP_INSTALL = YES; 372 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 373 | SWIFT_VERSION = 4.0; 374 | TARGETED_DEVICE_FAMILY = "1,2"; 375 | }; 376 | name = Debug; 377 | }; 378 | 1F3EAAEA20A6CD25007E25CD /* Release */ = { 379 | isa = XCBuildConfiguration; 380 | buildSettings = { 381 | CLANG_ENABLE_MODULES = YES; 382 | CODE_SIGN_IDENTITY = ""; 383 | CODE_SIGN_STYLE = Automatic; 384 | DEFINES_MODULE = YES; 385 | DEVELOPMENT_TEAM = J3FWM26YDF; 386 | DYLIB_COMPATIBILITY_VERSION = 1; 387 | DYLIB_CURRENT_VERSION = 1; 388 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 389 | INFOPLIST_FILE = ConfuseFW/Info.plist; 390 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 391 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 392 | PRODUCT_BUNDLE_IDENTIFIER = JonorZhang.ConfuseFW; 393 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 394 | SKIP_INSTALL = YES; 395 | SWIFT_VERSION = 4.0; 396 | TARGETED_DEVICE_FAMILY = "1,2"; 397 | }; 398 | name = Release; 399 | }; 400 | 1FF5F58720A6D2750053CD22 /* Debug */ = { 401 | isa = XCBuildConfiguration; 402 | buildSettings = { 403 | CODE_SIGN_STYLE = Automatic; 404 | DEVELOPMENT_TEAM = J3FWM26YDF; 405 | PRODUCT_NAME = "$(TARGET_NAME)"; 406 | }; 407 | name = Debug; 408 | }; 409 | 1FF5F58820A6D2750053CD22 /* Release */ = { 410 | isa = XCBuildConfiguration; 411 | buildSettings = { 412 | CODE_SIGN_STYLE = Automatic; 413 | DEVELOPMENT_TEAM = J3FWM26YDF; 414 | PRODUCT_NAME = "$(TARGET_NAME)"; 415 | }; 416 | name = Release; 417 | }; 418 | 1FF5F58C20A6D2790053CD22 /* Debug */ = { 419 | isa = XCBuildConfiguration; 420 | buildSettings = { 421 | CODE_SIGN_STYLE = Automatic; 422 | DEVELOPMENT_TEAM = J3FWM26YDF; 423 | PRODUCT_NAME = "$(TARGET_NAME)"; 424 | }; 425 | name = Debug; 426 | }; 427 | 1FF5F58D20A6D2790053CD22 /* Release */ = { 428 | isa = XCBuildConfiguration; 429 | buildSettings = { 430 | CODE_SIGN_STYLE = Automatic; 431 | DEVELOPMENT_TEAM = J3FWM26YDF; 432 | PRODUCT_NAME = "$(TARGET_NAME)"; 433 | }; 434 | name = Release; 435 | }; 436 | 1FF5F59020A6D27A0053CD22 /* Debug */ = { 437 | isa = XCBuildConfiguration; 438 | buildSettings = { 439 | CODE_SIGN_STYLE = Automatic; 440 | DEVELOPMENT_TEAM = J3FWM26YDF; 441 | PRODUCT_NAME = "$(TARGET_NAME)"; 442 | }; 443 | name = Debug; 444 | }; 445 | 1FF5F59120A6D27A0053CD22 /* Release */ = { 446 | isa = XCBuildConfiguration; 447 | buildSettings = { 448 | CODE_SIGN_STYLE = Automatic; 449 | DEVELOPMENT_TEAM = J3FWM26YDF; 450 | PRODUCT_NAME = "$(TARGET_NAME)"; 451 | }; 452 | name = Release; 453 | }; 454 | /* End XCBuildConfiguration section */ 455 | 456 | /* Begin XCConfigurationList section */ 457 | 1F3EAADA20A6CD25007E25CD /* Build configuration list for PBXProject "ConfuseFW" */ = { 458 | isa = XCConfigurationList; 459 | buildConfigurations = ( 460 | 1F3EAAE620A6CD25007E25CD /* Debug */, 461 | 1F3EAAE720A6CD25007E25CD /* Release */, 462 | ); 463 | defaultConfigurationIsVisible = 0; 464 | defaultConfigurationName = Release; 465 | }; 466 | 1F3EAAE820A6CD25007E25CD /* Build configuration list for PBXNativeTarget "ConfuseFW" */ = { 467 | isa = XCConfigurationList; 468 | buildConfigurations = ( 469 | 1F3EAAE920A6CD25007E25CD /* Debug */, 470 | 1F3EAAEA20A6CD25007E25CD /* Release */, 471 | ); 472 | defaultConfigurationIsVisible = 0; 473 | defaultConfigurationName = Release; 474 | }; 475 | 1FF5F58920A6D2750053CD22 /* Build configuration list for PBXAggregateTarget "safeConnfuseAndBuild" */ = { 476 | isa = XCConfigurationList; 477 | buildConfigurations = ( 478 | 1FF5F58720A6D2750053CD22 /* Debug */, 479 | 1FF5F58820A6D2750053CD22 /* Release */, 480 | ); 481 | defaultConfigurationIsVisible = 0; 482 | defaultConfigurationName = Release; 483 | }; 484 | 1FF5F58B20A6D2790053CD22 /* Build configuration list for PBXAggregateTarget "safeConnfuse" */ = { 485 | isa = XCConfigurationList; 486 | buildConfigurations = ( 487 | 1FF5F58C20A6D2790053CD22 /* Debug */, 488 | 1FF5F58D20A6D2790053CD22 /* Release */, 489 | ); 490 | defaultConfigurationIsVisible = 0; 491 | defaultConfigurationName = Release; 492 | }; 493 | 1FF5F58F20A6D27A0053CD22 /* Build configuration list for PBXAggregateTarget "unconnfuse" */ = { 494 | isa = XCConfigurationList; 495 | buildConfigurations = ( 496 | 1FF5F59020A6D27A0053CD22 /* Debug */, 497 | 1FF5F59120A6D27A0053CD22 /* Release */, 498 | ); 499 | defaultConfigurationIsVisible = 0; 500 | defaultConfigurationName = Release; 501 | }; 502 | /* End XCConfigurationList section */ 503 | }; 504 | rootObject = 1F3EAAD720A6CD25007E25CD /* Project object */; 505 | } 506 | -------------------------------------------------------------------------------- /ConfuseFW.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ConfuseFW.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ConfuseFW.xcodeproj/xcuserdata/zhang.xcuserdatad/xcschemes/ConfuseFW.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /ConfuseFW.xcodeproj/xcuserdata/zhang.xcuserdatad/xcschemes/safeConnfuse.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /ConfuseFW.xcodeproj/xcuserdata/zhang.xcuserdatad/xcschemes/unconnfuse.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /ConfuseFW.xcodeproj/xcuserdata/zhang.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ConfuseFW.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | safeConnfuse.xcscheme 13 | 14 | orderHint 15 | 1 16 | 17 | safeConnfuseAndBuild.xcscheme 18 | 19 | orderHint 20 | 3 21 | 22 | unconnfuse.xcscheme 23 | 24 | orderHint 25 | 2 26 | 27 | 28 | SuppressBuildableAutocreation 29 | 30 | 1F3EAADF20A6CD25007E25CD 31 | 32 | primary 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ConfuseFW/ConfuseClass.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfuseClass.swift 3 | // ConfuseFW 4 | // 5 | // Created by Zhang on 2018/5/12. 6 | // Copyright © 2018年 Zhang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public class ConfuseClass1 { 12 | public var var1: String 13 | private(set) var private_var2: Int 14 | var private_cls: private_ConfuseClass2 15 | 16 | private init(var1: String, var2: Int, cls: private_ConfuseClass2) { 17 | self.var1 = var1 18 | self.private_var2 = var2 19 | self.private_cls = cls 20 | } 21 | 22 | public convenience init(var1: String, var2: Int) { 23 | self.init(var1: var1, var2: var2, cls: private_ConfuseClass2()) 24 | } 25 | 26 | public func func1() { 27 | private_func2() 28 | } 29 | 30 | func private_func2() { 31 | print(#function, var1, private_var2, private_cls) 32 | } 33 | } 34 | 35 | class private_ConfuseClass2 { 36 | var var3: String = "haha" 37 | } 38 | -------------------------------------------------------------------------------- /ConfuseFW/ConfuseFW.h: -------------------------------------------------------------------------------- 1 | // 2 | // ConfuseFW.h 3 | // ConfuseFW 4 | // 5 | // Created by Zhang on 2018/5/12. 6 | // Copyright © 2018年 Zhang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for ConfuseFW. 12 | FOUNDATION_EXPORT double ConfuseFWVersionNumber; 13 | 14 | //! Project version string for ConfuseFW. 15 | FOUNDATION_EXPORT const unsigned char ConfuseFWVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /ConfuseFW/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 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1FF5F5C020A6D61D0053CD22 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FF5F5BF20A6D61D0053CD22 /* AppDelegate.swift */; }; 11 | 1FF5F5C220A6D61D0053CD22 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FF5F5C120A6D61D0053CD22 /* ViewController.swift */; }; 12 | 1FF5F5C520A6D61D0053CD22 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1FF5F5C320A6D61D0053CD22 /* Main.storyboard */; }; 13 | 1FF5F5C720A6D61E0053CD22 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1FF5F5C620A6D61E0053CD22 /* Assets.xcassets */; }; 14 | 1FF5F5CA20A6D61E0053CD22 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1FF5F5C820A6D61E0053CD22 /* LaunchScreen.storyboard */; }; 15 | 1FF5F5D520A6D6820053CD22 /* ConfuseFW.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FF5F5D420A6D6820053CD22 /* ConfuseFW.framework */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXFileReference section */ 19 | 1FF5F5BC20A6D61D0053CD22 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 20 | 1FF5F5BF20A6D61D0053CD22 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 21 | 1FF5F5C120A6D61D0053CD22 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 22 | 1FF5F5C420A6D61D0053CD22 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 23 | 1FF5F5C620A6D61E0053CD22 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 24 | 1FF5F5C920A6D61E0053CD22 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 25 | 1FF5F5CB20A6D61E0053CD22 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 26 | 1FF5F5D420A6D6820053CD22 /* ConfuseFW.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ConfuseFW.framework; path = ../Framework/ConfuseFW.framework; sourceTree = ""; }; 27 | /* End PBXFileReference section */ 28 | 29 | /* Begin PBXFrameworksBuildPhase section */ 30 | 1FF5F5B920A6D61D0053CD22 /* Frameworks */ = { 31 | isa = PBXFrameworksBuildPhase; 32 | buildActionMask = 2147483647; 33 | files = ( 34 | 1FF5F5D520A6D6820053CD22 /* ConfuseFW.framework in Frameworks */, 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXFrameworksBuildPhase section */ 39 | 40 | /* Begin PBXGroup section */ 41 | 1FF5F5B320A6D61D0053CD22 = { 42 | isa = PBXGroup; 43 | children = ( 44 | 1FF5F5BE20A6D61D0053CD22 /* Example */, 45 | 1FF5F5BD20A6D61D0053CD22 /* Products */, 46 | 1FF5F5D120A6D65D0053CD22 /* Frameworks */, 47 | ); 48 | sourceTree = ""; 49 | }; 50 | 1FF5F5BD20A6D61D0053CD22 /* Products */ = { 51 | isa = PBXGroup; 52 | children = ( 53 | 1FF5F5BC20A6D61D0053CD22 /* Example.app */, 54 | ); 55 | name = Products; 56 | sourceTree = ""; 57 | }; 58 | 1FF5F5BE20A6D61D0053CD22 /* Example */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 1FF5F5BF20A6D61D0053CD22 /* AppDelegate.swift */, 62 | 1FF5F5C120A6D61D0053CD22 /* ViewController.swift */, 63 | 1FF5F5C320A6D61D0053CD22 /* Main.storyboard */, 64 | 1FF5F5C620A6D61E0053CD22 /* Assets.xcassets */, 65 | 1FF5F5C820A6D61E0053CD22 /* LaunchScreen.storyboard */, 66 | 1FF5F5CB20A6D61E0053CD22 /* Info.plist */, 67 | ); 68 | path = Example; 69 | sourceTree = ""; 70 | }; 71 | 1FF5F5D120A6D65D0053CD22 /* Frameworks */ = { 72 | isa = PBXGroup; 73 | children = ( 74 | 1FF5F5D420A6D6820053CD22 /* ConfuseFW.framework */, 75 | ); 76 | name = Frameworks; 77 | sourceTree = ""; 78 | }; 79 | /* End PBXGroup section */ 80 | 81 | /* Begin PBXNativeTarget section */ 82 | 1FF5F5BB20A6D61D0053CD22 /* Example */ = { 83 | isa = PBXNativeTarget; 84 | buildConfigurationList = 1FF5F5CE20A6D61E0053CD22 /* Build configuration list for PBXNativeTarget "Example" */; 85 | buildPhases = ( 86 | 1FF5F5B820A6D61D0053CD22 /* Sources */, 87 | 1FF5F5B920A6D61D0053CD22 /* Frameworks */, 88 | 1FF5F5BA20A6D61D0053CD22 /* Resources */, 89 | ); 90 | buildRules = ( 91 | ); 92 | dependencies = ( 93 | ); 94 | name = Example; 95 | productName = Example; 96 | productReference = 1FF5F5BC20A6D61D0053CD22 /* Example.app */; 97 | productType = "com.apple.product-type.application"; 98 | }; 99 | /* End PBXNativeTarget section */ 100 | 101 | /* Begin PBXProject section */ 102 | 1FF5F5B420A6D61D0053CD22 /* Project object */ = { 103 | isa = PBXProject; 104 | attributes = { 105 | LastSwiftUpdateCheck = 0930; 106 | LastUpgradeCheck = 0930; 107 | ORGANIZATIONNAME = Zhang; 108 | TargetAttributes = { 109 | 1FF5F5BB20A6D61D0053CD22 = { 110 | CreatedOnToolsVersion = 9.3; 111 | ProvisioningStyle = Automatic; 112 | }; 113 | }; 114 | }; 115 | buildConfigurationList = 1FF5F5B720A6D61D0053CD22 /* Build configuration list for PBXProject "Example" */; 116 | compatibilityVersion = "Xcode 8.0"; 117 | developmentRegion = en; 118 | hasScannedForEncodings = 0; 119 | knownRegions = ( 120 | en, 121 | Base, 122 | ); 123 | mainGroup = 1FF5F5B320A6D61D0053CD22; 124 | productRefGroup = 1FF5F5BD20A6D61D0053CD22 /* Products */; 125 | projectDirPath = ""; 126 | projectRoot = ""; 127 | targets = ( 128 | 1FF5F5BB20A6D61D0053CD22 /* Example */, 129 | ); 130 | }; 131 | /* End PBXProject section */ 132 | 133 | /* Begin PBXResourcesBuildPhase section */ 134 | 1FF5F5BA20A6D61D0053CD22 /* Resources */ = { 135 | isa = PBXResourcesBuildPhase; 136 | buildActionMask = 2147483647; 137 | files = ( 138 | 1FF5F5CA20A6D61E0053CD22 /* LaunchScreen.storyboard in Resources */, 139 | 1FF5F5C720A6D61E0053CD22 /* Assets.xcassets in Resources */, 140 | 1FF5F5C520A6D61D0053CD22 /* Main.storyboard in Resources */, 141 | ); 142 | runOnlyForDeploymentPostprocessing = 0; 143 | }; 144 | /* End PBXResourcesBuildPhase section */ 145 | 146 | /* Begin PBXSourcesBuildPhase section */ 147 | 1FF5F5B820A6D61D0053CD22 /* Sources */ = { 148 | isa = PBXSourcesBuildPhase; 149 | buildActionMask = 2147483647; 150 | files = ( 151 | 1FF5F5C220A6D61D0053CD22 /* ViewController.swift in Sources */, 152 | 1FF5F5C020A6D61D0053CD22 /* AppDelegate.swift in Sources */, 153 | ); 154 | runOnlyForDeploymentPostprocessing = 0; 155 | }; 156 | /* End PBXSourcesBuildPhase section */ 157 | 158 | /* Begin PBXVariantGroup section */ 159 | 1FF5F5C320A6D61D0053CD22 /* Main.storyboard */ = { 160 | isa = PBXVariantGroup; 161 | children = ( 162 | 1FF5F5C420A6D61D0053CD22 /* Base */, 163 | ); 164 | name = Main.storyboard; 165 | sourceTree = ""; 166 | }; 167 | 1FF5F5C820A6D61E0053CD22 /* LaunchScreen.storyboard */ = { 168 | isa = PBXVariantGroup; 169 | children = ( 170 | 1FF5F5C920A6D61E0053CD22 /* Base */, 171 | ); 172 | name = LaunchScreen.storyboard; 173 | sourceTree = ""; 174 | }; 175 | /* End PBXVariantGroup section */ 176 | 177 | /* Begin XCBuildConfiguration section */ 178 | 1FF5F5CC20A6D61E0053CD22 /* Debug */ = { 179 | isa = XCBuildConfiguration; 180 | buildSettings = { 181 | ALWAYS_SEARCH_USER_PATHS = NO; 182 | CLANG_ANALYZER_NONNULL = YES; 183 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 184 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 185 | CLANG_CXX_LIBRARY = "libc++"; 186 | CLANG_ENABLE_MODULES = YES; 187 | CLANG_ENABLE_OBJC_ARC = YES; 188 | CLANG_ENABLE_OBJC_WEAK = YES; 189 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 190 | CLANG_WARN_BOOL_CONVERSION = YES; 191 | CLANG_WARN_COMMA = YES; 192 | CLANG_WARN_CONSTANT_CONVERSION = YES; 193 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 194 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 195 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 196 | CLANG_WARN_EMPTY_BODY = YES; 197 | CLANG_WARN_ENUM_CONVERSION = YES; 198 | CLANG_WARN_INFINITE_RECURSION = YES; 199 | CLANG_WARN_INT_CONVERSION = YES; 200 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 201 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 202 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 203 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 204 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 205 | CLANG_WARN_STRICT_PROTOTYPES = YES; 206 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 207 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 208 | CLANG_WARN_UNREACHABLE_CODE = YES; 209 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 210 | CODE_SIGN_IDENTITY = "iPhone Developer"; 211 | COPY_PHASE_STRIP = NO; 212 | DEBUG_INFORMATION_FORMAT = dwarf; 213 | ENABLE_STRICT_OBJC_MSGSEND = YES; 214 | ENABLE_TESTABILITY = YES; 215 | GCC_C_LANGUAGE_STANDARD = gnu11; 216 | GCC_DYNAMIC_NO_PIC = NO; 217 | GCC_NO_COMMON_BLOCKS = YES; 218 | GCC_OPTIMIZATION_LEVEL = 0; 219 | GCC_PREPROCESSOR_DEFINITIONS = ( 220 | "DEBUG=1", 221 | "$(inherited)", 222 | ); 223 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 224 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 225 | GCC_WARN_UNDECLARED_SELECTOR = YES; 226 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 227 | GCC_WARN_UNUSED_FUNCTION = YES; 228 | GCC_WARN_UNUSED_VARIABLE = YES; 229 | IPHONEOS_DEPLOYMENT_TARGET = 11.3; 230 | MTL_ENABLE_DEBUG_INFO = YES; 231 | ONLY_ACTIVE_ARCH = YES; 232 | SDKROOT = iphoneos; 233 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 234 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 235 | }; 236 | name = Debug; 237 | }; 238 | 1FF5F5CD20A6D61E0053CD22 /* Release */ = { 239 | isa = XCBuildConfiguration; 240 | buildSettings = { 241 | ALWAYS_SEARCH_USER_PATHS = NO; 242 | CLANG_ANALYZER_NONNULL = YES; 243 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 244 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 245 | CLANG_CXX_LIBRARY = "libc++"; 246 | CLANG_ENABLE_MODULES = YES; 247 | CLANG_ENABLE_OBJC_ARC = YES; 248 | CLANG_ENABLE_OBJC_WEAK = YES; 249 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 250 | CLANG_WARN_BOOL_CONVERSION = YES; 251 | CLANG_WARN_COMMA = YES; 252 | CLANG_WARN_CONSTANT_CONVERSION = YES; 253 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 254 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 255 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 256 | CLANG_WARN_EMPTY_BODY = YES; 257 | CLANG_WARN_ENUM_CONVERSION = YES; 258 | CLANG_WARN_INFINITE_RECURSION = YES; 259 | CLANG_WARN_INT_CONVERSION = YES; 260 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 261 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 262 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 263 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 264 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 265 | CLANG_WARN_STRICT_PROTOTYPES = YES; 266 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 267 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 268 | CLANG_WARN_UNREACHABLE_CODE = YES; 269 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 270 | CODE_SIGN_IDENTITY = "iPhone Developer"; 271 | COPY_PHASE_STRIP = NO; 272 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 273 | ENABLE_NS_ASSERTIONS = NO; 274 | ENABLE_STRICT_OBJC_MSGSEND = YES; 275 | GCC_C_LANGUAGE_STANDARD = gnu11; 276 | GCC_NO_COMMON_BLOCKS = YES; 277 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 278 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 279 | GCC_WARN_UNDECLARED_SELECTOR = YES; 280 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 281 | GCC_WARN_UNUSED_FUNCTION = YES; 282 | GCC_WARN_UNUSED_VARIABLE = YES; 283 | IPHONEOS_DEPLOYMENT_TARGET = 11.3; 284 | MTL_ENABLE_DEBUG_INFO = NO; 285 | SDKROOT = iphoneos; 286 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 287 | VALIDATE_PRODUCT = YES; 288 | }; 289 | name = Release; 290 | }; 291 | 1FF5F5CF20A6D61E0053CD22 /* Debug */ = { 292 | isa = XCBuildConfiguration; 293 | buildSettings = { 294 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 295 | CODE_SIGN_STYLE = Automatic; 296 | DEVELOPMENT_TEAM = J3FWM26YDF; 297 | FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../Framework"; 298 | INFOPLIST_FILE = Example/Info.plist; 299 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 300 | PRODUCT_BUNDLE_IDENTIFIER = JonorZhang.Example; 301 | PRODUCT_NAME = "$(TARGET_NAME)"; 302 | SWIFT_VERSION = 4.0; 303 | TARGETED_DEVICE_FAMILY = "1,2"; 304 | }; 305 | name = Debug; 306 | }; 307 | 1FF5F5D020A6D61E0053CD22 /* Release */ = { 308 | isa = XCBuildConfiguration; 309 | buildSettings = { 310 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 311 | CODE_SIGN_STYLE = Automatic; 312 | DEVELOPMENT_TEAM = J3FWM26YDF; 313 | FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../Framework"; 314 | INFOPLIST_FILE = Example/Info.plist; 315 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 316 | PRODUCT_BUNDLE_IDENTIFIER = JonorZhang.Example; 317 | PRODUCT_NAME = "$(TARGET_NAME)"; 318 | SWIFT_VERSION = 4.0; 319 | TARGETED_DEVICE_FAMILY = "1,2"; 320 | }; 321 | name = Release; 322 | }; 323 | /* End XCBuildConfiguration section */ 324 | 325 | /* Begin XCConfigurationList section */ 326 | 1FF5F5B720A6D61D0053CD22 /* Build configuration list for PBXProject "Example" */ = { 327 | isa = XCConfigurationList; 328 | buildConfigurations = ( 329 | 1FF5F5CC20A6D61E0053CD22 /* Debug */, 330 | 1FF5F5CD20A6D61E0053CD22 /* Release */, 331 | ); 332 | defaultConfigurationIsVisible = 0; 333 | defaultConfigurationName = Release; 334 | }; 335 | 1FF5F5CE20A6D61E0053CD22 /* Build configuration list for PBXNativeTarget "Example" */ = { 336 | isa = XCConfigurationList; 337 | buildConfigurations = ( 338 | 1FF5F5CF20A6D61E0053CD22 /* Debug */, 339 | 1FF5F5D020A6D61E0053CD22 /* Release */, 340 | ); 341 | defaultConfigurationIsVisible = 0; 342 | defaultConfigurationName = Release; 343 | }; 344 | /* End XCConfigurationList section */ 345 | }; 346 | rootObject = 1FF5F5B420A6D61D0053CD22 /* Project object */; 347 | } 348 | -------------------------------------------------------------------------------- /Example/Example.xcodeproj/xcuserdata/zhang.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Example.xcscheme 8 | 9 | orderHint 10 | 4 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Example/Example/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Example 4 | // 5 | // Created by Zhang on 2018/5/12. 6 | // Copyright © 2018年 Zhang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 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 invalidate graphics rendering callbacks. 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 active 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 | -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Example/Example/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 | -------------------------------------------------------------------------------- /Example/Example/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 | -------------------------------------------------------------------------------- /Example/Example/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 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /Example/Example/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // Example 4 | // 5 | // Created by Zhang on 2018/5/12. 6 | // Copyright © 2018年 Zhang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import ConfuseFW 11 | 12 | class ViewController: UIViewController { 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | let cfs = ConfuseClass1.init(var1: "hello~", var2: 100) 17 | cfs.var1 = "hi~" 18 | cfs.func1() 19 | } 20 | 21 | override func didReceiveMemoryWarning() { 22 | super.didReceiveMemoryWarning() 23 | // Dispose of any resources that can be recreated. 24 | } 25 | 26 | 27 | } 28 | 29 | -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/ConfuseFW: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonorZhang/iOSConfuse/7c1061fa0ca68dc97f3f10d826807e2e948ae9a4/Framework/ConfuseFW.framework/ConfuseFW -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/Headers/ConfuseFW-Swift.h: -------------------------------------------------------------------------------- 1 | // Generated by Apple Swift version 4.1.2 (swiftlang-902.0.54 clang-902.0.39.2) 2 | #pragma clang diagnostic push 3 | #pragma clang diagnostic ignored "-Wgcc-compat" 4 | 5 | #if !defined(__has_include) 6 | # define __has_include(x) 0 7 | #endif 8 | #if !defined(__has_attribute) 9 | # define __has_attribute(x) 0 10 | #endif 11 | #if !defined(__has_feature) 12 | # define __has_feature(x) 0 13 | #endif 14 | #if !defined(__has_warning) 15 | # define __has_warning(x) 0 16 | #endif 17 | 18 | #if __has_include() 19 | # include 20 | #endif 21 | 22 | #pragma clang diagnostic ignored "-Wauto-import" 23 | #include 24 | #include 25 | #include 26 | #include 27 | 28 | #if !defined(SWIFT_TYPEDEFS) 29 | # define SWIFT_TYPEDEFS 1 30 | # if __has_include() 31 | # include 32 | # elif !defined(__cplusplus) 33 | typedef uint_least16_t char16_t; 34 | typedef uint_least32_t char32_t; 35 | # endif 36 | typedef float swift_float2 __attribute__((__ext_vector_type__(2))); 37 | typedef float swift_float3 __attribute__((__ext_vector_type__(3))); 38 | typedef float swift_float4 __attribute__((__ext_vector_type__(4))); 39 | typedef double swift_double2 __attribute__((__ext_vector_type__(2))); 40 | typedef double swift_double3 __attribute__((__ext_vector_type__(3))); 41 | typedef double swift_double4 __attribute__((__ext_vector_type__(4))); 42 | typedef int swift_int2 __attribute__((__ext_vector_type__(2))); 43 | typedef int swift_int3 __attribute__((__ext_vector_type__(3))); 44 | typedef int swift_int4 __attribute__((__ext_vector_type__(4))); 45 | typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); 46 | typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); 47 | typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); 48 | #endif 49 | 50 | #if !defined(SWIFT_PASTE) 51 | # define SWIFT_PASTE_HELPER(x, y) x##y 52 | # define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) 53 | #endif 54 | #if !defined(SWIFT_METATYPE) 55 | # define SWIFT_METATYPE(X) Class 56 | #endif 57 | #if !defined(SWIFT_CLASS_PROPERTY) 58 | # if __has_feature(objc_class_property) 59 | # define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ 60 | # else 61 | # define SWIFT_CLASS_PROPERTY(...) 62 | # endif 63 | #endif 64 | 65 | #if __has_attribute(objc_runtime_name) 66 | # define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) 67 | #else 68 | # define SWIFT_RUNTIME_NAME(X) 69 | #endif 70 | #if __has_attribute(swift_name) 71 | # define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) 72 | #else 73 | # define SWIFT_COMPILE_NAME(X) 74 | #endif 75 | #if __has_attribute(objc_method_family) 76 | # define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) 77 | #else 78 | # define SWIFT_METHOD_FAMILY(X) 79 | #endif 80 | #if __has_attribute(noescape) 81 | # define SWIFT_NOESCAPE __attribute__((noescape)) 82 | #else 83 | # define SWIFT_NOESCAPE 84 | #endif 85 | #if __has_attribute(warn_unused_result) 86 | # define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) 87 | #else 88 | # define SWIFT_WARN_UNUSED_RESULT 89 | #endif 90 | #if __has_attribute(noreturn) 91 | # define SWIFT_NORETURN __attribute__((noreturn)) 92 | #else 93 | # define SWIFT_NORETURN 94 | #endif 95 | #if !defined(SWIFT_CLASS_EXTRA) 96 | # define SWIFT_CLASS_EXTRA 97 | #endif 98 | #if !defined(SWIFT_PROTOCOL_EXTRA) 99 | # define SWIFT_PROTOCOL_EXTRA 100 | #endif 101 | #if !defined(SWIFT_ENUM_EXTRA) 102 | # define SWIFT_ENUM_EXTRA 103 | #endif 104 | #if !defined(SWIFT_CLASS) 105 | # if __has_attribute(objc_subclassing_restricted) 106 | # define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA 107 | # define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA 108 | # else 109 | # define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA 110 | # define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA 111 | # endif 112 | #endif 113 | 114 | #if !defined(SWIFT_PROTOCOL) 115 | # define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA 116 | # define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA 117 | #endif 118 | 119 | #if !defined(SWIFT_EXTENSION) 120 | # define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) 121 | #endif 122 | 123 | #if !defined(OBJC_DESIGNATED_INITIALIZER) 124 | # if __has_attribute(objc_designated_initializer) 125 | # define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) 126 | # else 127 | # define OBJC_DESIGNATED_INITIALIZER 128 | # endif 129 | #endif 130 | #if !defined(SWIFT_ENUM_ATTR) 131 | # if defined(__has_attribute) && __has_attribute(enum_extensibility) 132 | # define SWIFT_ENUM_ATTR __attribute__((enum_extensibility(open))) 133 | # else 134 | # define SWIFT_ENUM_ATTR 135 | # endif 136 | #endif 137 | #if !defined(SWIFT_ENUM) 138 | # define SWIFT_ENUM(_type, _name) enum _name : _type _name; enum SWIFT_ENUM_ATTR SWIFT_ENUM_EXTRA _name : _type 139 | # if __has_feature(generalized_swift_name) 140 | # define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR SWIFT_ENUM_EXTRA _name : _type 141 | # else 142 | # define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME) SWIFT_ENUM(_type, _name) 143 | # endif 144 | #endif 145 | #if !defined(SWIFT_UNAVAILABLE) 146 | # define SWIFT_UNAVAILABLE __attribute__((unavailable)) 147 | #endif 148 | #if !defined(SWIFT_UNAVAILABLE_MSG) 149 | # define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) 150 | #endif 151 | #if !defined(SWIFT_AVAILABILITY) 152 | # define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) 153 | #endif 154 | #if !defined(SWIFT_DEPRECATED) 155 | # define SWIFT_DEPRECATED __attribute__((deprecated)) 156 | #endif 157 | #if !defined(SWIFT_DEPRECATED_MSG) 158 | # define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) 159 | #endif 160 | #if __has_feature(attribute_diagnose_if_objc) 161 | # define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) 162 | #else 163 | # define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) 164 | #endif 165 | #if __has_feature(modules) 166 | #endif 167 | 168 | #pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" 169 | #pragma clang diagnostic ignored "-Wduplicate-method-arg" 170 | #if __has_warning("-Wpragma-clang-attribute") 171 | # pragma clang diagnostic ignored "-Wpragma-clang-attribute" 172 | #endif 173 | #pragma clang diagnostic ignored "-Wunknown-pragmas" 174 | #pragma clang diagnostic ignored "-Wnullability" 175 | 176 | #if __has_attribute(external_source_symbol) 177 | # pragma push_macro("any") 178 | # undef any 179 | # pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="ConfuseFW",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) 180 | # pragma pop_macro("any") 181 | #endif 182 | 183 | #if __has_attribute(external_source_symbol) 184 | # pragma clang attribute pop 185 | #endif 186 | #pragma clang diagnostic pop 187 | -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/Headers/ConfuseFW.h: -------------------------------------------------------------------------------- 1 | // 2 | // ConfuseFW.h 3 | // ConfuseFW 4 | // 5 | // Created by Zhang on 2018/5/12. 6 | // Copyright © 2018年 Zhang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for ConfuseFW. 12 | FOUNDATION_EXPORT double ConfuseFWVersionNumber; 13 | 14 | //! Project version string for ConfuseFW. 15 | FOUNDATION_EXPORT const unsigned char ConfuseFWVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonorZhang/iOSConfuse/7c1061fa0ca68dc97f3f10d826807e2e948ae9a4/Framework/ConfuseFW.framework/Info.plist -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/arm.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonorZhang/iOSConfuse/7c1061fa0ca68dc97f3f10d826807e2e948ae9a4/Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/arm.swiftdoc -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/arm.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonorZhang/iOSConfuse/7c1061fa0ca68dc97f3f10d826807e2e948ae9a4/Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/arm.swiftmodule -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/arm64.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonorZhang/iOSConfuse/7c1061fa0ca68dc97f3f10d826807e2e948ae9a4/Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/arm64.swiftdoc -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/arm64.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonorZhang/iOSConfuse/7c1061fa0ca68dc97f3f10d826807e2e948ae9a4/Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/arm64.swiftmodule -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/i386.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonorZhang/iOSConfuse/7c1061fa0ca68dc97f3f10d826807e2e948ae9a4/Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/i386.swiftdoc -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/i386.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonorZhang/iOSConfuse/7c1061fa0ca68dc97f3f10d826807e2e948ae9a4/Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/i386.swiftmodule -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/x86_64.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonorZhang/iOSConfuse/7c1061fa0ca68dc97f3f10d826807e2e948ae9a4/Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/x86_64.swiftdoc -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/x86_64.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonorZhang/iOSConfuse/7c1061fa0ca68dc97f3f10d826807e2e948ae9a4/Framework/ConfuseFW.framework/Modules/ConfuseFW.swiftmodule/x86_64.swiftmodule -------------------------------------------------------------------------------- /Framework/ConfuseFW.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module ConfuseFW { 2 | umbrella header "ConfuseFW.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | 8 | module ConfuseFW.Swift { 9 | header "ConfuseFW-Swift.h" 10 | requires objc 11 | } 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iOSConfuse 2 | 3 | ## 1.目录结构 4 | 5 | ``` 6 | - confuseAndBuild.sh # 混淆编译脚本 7 | - [Example] # 示例项目 8 | - [Framework] # 编译以后生成的通用framework 9 | - [ConfuseFW] # 框架源码 10 | - ConfuseFW.xcodeproj 11 | - ConfuseDemo.xcworkspace 12 | - README.md 13 | ``` 14 | 15 | ## 2.工程Scheme使用方法 16 | - **DemoTest** 17 | 编译Debug环境framework:只会编译当前设备对应架构,仅供测试用。 18 | - **safeConfuseAndBuild** 19 | 编译Release环境通用framework:编译时混淆代码,编译完去除混淆。 20 | - **safeConfuse** 21 | 安全混淆:备份源文件,然后混淆目标代码。 22 | - **unconfuse** 23 | 去除混淆:将备份源文件恢复。 24 | - **Example** 25 | 示例项目:框架使用Demo。 26 | 27 | ## 3. safeConfuseAndBuild.sh 28 | 这是iOS代码混淆及编译的自动化脚本,支持swift、m、c、cpp和h文件类型的混淆,使用编译时混淆的策略,不影响源码阅读,只需在想要混淆的函数名或者变量名前加个private_即可,可通过函数实现安全混淆、去混淆、混淆再编译。 29 | -------------------------------------------------------------------------------- /confuseAndBuild.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # confuseAndBuild.sh 4 | # ConfuseSwift 5 | # 6 | # Created by Jonor on 2018/4/28. 7 | # Copyright © 2018年 Zhang. All rights reserved. 8 | 9 | # ⚠️声明 10 | # 1. 请将该脚本放在Xcode工程的根目录。 11 | # 2. 当前版本未配置完整Xcode环境变量,仅支持混淆功能,不支持framework编译,若需编译请用Xcode运行该脚本。 12 | # 3. PS:下一版更新会支持在终端运行脚本。 13 | 14 | # 认为定义了‘PROJECT_NAME’的是从Xcode运行,未定义则是从终端运行 15 | if [ -z "$PROJECT_NAME" ]; then 16 | CONFUSE_DIR="." 17 | else 18 | CONFUSE_DIR="${SRCROOT}/${PROJECT_NAME}" 19 | fi 20 | 21 | CONFUSE_PREFIX="private_" 22 | 23 | BACKUP_FILE=".backup.log" 24 | SYMBOL_FILE=".symbol.log" 25 | CONFUSE_FILE=".confuse.log" 26 | CONFUSE_FLAG=".confuseFlag" 27 | 28 | SOURCE_ARRAY=( "*.swift" 29 | "*.m" 30 | "*.h" 31 | "*.c" 32 | "*.cpp") 33 | BACKUP_EXTENSION=".bak" 34 | 35 | 36 | # 格式:echo -e "\033[背景色;前景色m 打印的字符串 \033[0m" 37 | # 颜色:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37。 38 | # 示例:echo -e “\033[30m 我是黑色字 \033[0m” 39 | # 参考:https://www.cnblogs.com/xiansong1005/p/7221316.html 40 | # https://www.cnblogs.com/lr-ting/archive/2013/02/28/2936792.html 41 | info() { 42 | local green="\033[1;32m" 43 | local normal="\033[0m" 44 | echo -e "[${green}info${normal}] $1" 45 | } 46 | 47 | error() { 48 | local red="\033[1;31m" 49 | local normal="\033[0m" 50 | echo -e "[${red}error${normal}] $1" 51 | } 52 | 53 | # 生成随机字符串 16字 54 | randomString() { 55 | openssl rand -base64 64 | tr -cd 'a-zA-Z' | head -c 16 56 | } 57 | 58 | # 获取符号的随机字符串 $1是符号名 59 | randomStringWithSymbol() { 60 | grep -w $1 $SYMBOL_FILE -h | cut -d \ -f 2 61 | } 62 | 63 | removeIfExist() { 64 | if [ -f $1 ]; then 65 | rm $1 66 | fi 67 | } 68 | 69 | # 备份文件 $1:file full path 70 | backupFile() { 71 | file=$1 72 | # 在原文件名前加个.(点符合)用作备份名 73 | fileName=${file##*/} 74 | backupPath=${file/$fileName/.$fileName$BACKUP_EXTENSION} 75 | echo "backup $file to $backupPath" 76 | 77 | if [ ! -f $backupPath ]; then 78 | cp $file $backupPath 79 | echo $backupPath >>$BACKUP_FILE 80 | fi 81 | } 82 | 83 | # 方案1. 精确备份:用关键字遍历会修改到的source文件,再将其备份 -- 消耗性能 84 | # 方案2. 整体备份:备份所有source文件 -- 消耗存储空间 85 | # 根据需要,为简单起见,这里选用方案2 86 | backupAllSource() { 87 | info "backup all swift files" 88 | NAMES="-name \"${SOURCE_ARRAY[0]}\"" 89 | i=1 90 | while [ $i -lt ${#SOURCE_ARRAY[@]} ]; do 91 | NAMES+=" -or -name \"${SOURCE_ARRAY[$i]}\"" 92 | let i++ 93 | done 94 | # echo $NAMES 95 | 96 | removeIfExist $BACKUP_FILE 97 | touch $BACKUP_FILE 98 | 99 | eval "find $CONFUSE_DIR $NAMES" | while read file; do 100 | backupFile $file 101 | done 102 | } 103 | 104 | # 混淆工作, ⚠️该函数不会自动备份,要备份请调用safeConfuse函数 105 | confuseOnly() { 106 | info "confuse start..." 107 | 108 | # 获取要混淆的函数名和变量名 109 | INCLUDES="--include=\"${SOURCE_ARRAY[0]}\"" 110 | i=1 111 | while [ $i -lt ${#SOURCE_ARRAY[@]} ]; do 112 | INCLUDES+=" --include=\"${SOURCE_ARRAY[$i]}\"" 113 | let i++ 114 | done 115 | eval "grep $CONFUSE_PREFIX -r $CONFUSE_DIR $INCLUDES -n" >$CONFUSE_FILE 116 | 117 | # cat $CONFUSE_FILE 118 | # 绑定随机字符串 119 | removeIfExist $SYMBOL_FILE 120 | touch $SYMBOL_FILE 121 | 122 | cat $CONFUSE_FILE | egrep -w $CONFUSE_PREFIX"[0-9a-zA-Z_]*" -o | sort | uniq | while read line; do 123 | echo $line" `randomString`" >>$SYMBOL_FILE 124 | done 125 | 126 | # cat $SYMBOL_FILE 127 | 128 | # 读取备份文件记录 129 | # 在这里没使用遍历批量替换,怕文件太多的时候影响性能 130 | cat $CONFUSE_FILE | while read line; do 131 | # echo "> $line" 132 | # 截取行号 133 | lineNum=`echo $line | sed 's/.*:\([0-9]*\):.*/\1/g'` 134 | # 截取文件路径 135 | path=${line%%:*} 136 | 137 | # 一行可能有多个要替换的子串,要循环遍历完 138 | # 这里之所以要用`sort -r`倒序是因为有个bug:如有字符串"jjyy abc hello abcde", 现在要替换"abc"为"123"(abcde保持不变),也就是传说中的‘全匹配替换’, 139 | # 但不知为何在macOS下单词边界表达式不起作用:\ 或者 \babc\b都不起作用,Linux下这个正则表达式是没问题的。 140 | # 倒序之后有长串优先替换长串,防止短串把长串部分替换掉。但依然存在bug:若是长串不需要替换,则短串替换是依然会将长串部分替换😂 141 | # 因此依然还需要寻找macOS下单词边界/全匹配 的正则表达式 142 | echo $line | egrep -w $CONFUSE_PREFIX"[0-9a-zA-Z_]*" -o | sort -r | while read -ra symbol; do 143 | # 根据名称获取绑定的随机字符串 144 | random=`randomStringWithSymbol $symbol` 145 | # echo "$path $lineNum $symbol $random" 146 | # 随机字符串替换 147 | # -i:表示直接在原文件替换,"":表示不要备份 148 | sed -i "" "${lineNum}s/$symbol/$random/g" $path 149 | 150 | echo " $symbol => $random" 151 | done 152 | done 153 | 154 | info "confuse done" 155 | } 156 | 157 | # 编译工作,生成通用framework 158 | buildAll() { 159 | info "build start..." 160 | 161 | if [ -z "$PROJECT_NAME" ]; then 162 | echo -e "\033[1;31mERROR:当前版本未配置完整Xcode环境变量,仅支持混淆功能,不支持framework编译,若需编译请用Xcode运行该脚本\033[0m" 163 | return 164 | fi 165 | 166 | # 要build的target名 167 | TARGET_NAME=${PROJECT_NAME} 168 | UNIVERSAL_OUTPUT_DIR="${SRCROOT}/Framework/" 169 | 170 | # 创建输出目录,并删除之前的framework文件 171 | mkdir -p "${UNIVERSAL_OUTPUT_DIR}" 172 | rm -rf "${UNIVERSAL_OUTPUT_DIR}/${TARGET_NAME}.framework" 173 | 174 | #分别编译模拟器和真机的Framework 175 | xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} ARCHS="armv7 armv7s arm64" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build 176 | xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} ARCHS="i386 x86_64" -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build 177 | 178 | #拷贝framework到univer目录 179 | cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_DIR}" 180 | 181 | # 合并swiftmodule到univer目录 182 | cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/Modules/${TARGET_NAME}.swiftmodule/" "${UNIVERSAL_OUTPUT_DIR}/${TARGET_NAME}.framework/Modules/${TARGET_NAME}.swiftmodule" 183 | 184 | #合并framework,输出最终的framework到build目录 185 | lipo -create -output "${UNIVERSAL_OUTPUT_DIR}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}" 186 | 187 | #删除编译之后生成的无关的配置文件 188 | dir_path="${UNIVERSAL_OUTPUT_DIR}/${TARGET_NAME}.framework/" 189 | for file in ls $dir_path; do 190 | if [[ ${file} =~ ".xcconfig" ]]; then 191 | rm -f "${dir_path}/${file}" 192 | fi 193 | done 194 | 195 | #判断build文件夹是否存在,存在则删除 196 | if [ -d "${SRCROOT}/build" ]; then 197 | rm -rf "${SRCROOT}/build" 198 | fi 199 | 200 | #rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos" 201 | 202 | #打开合并后的文件夹 203 | open "${UNIVERSAL_OUTPUT_DIR}" 204 | 205 | info "build done" 206 | } 207 | 208 | # 清理工作,去混淆 209 | unconfuse() { 210 | info "clean start..." 211 | if [ -f $CONFUSE_FLAG ]; then 212 | # 恢复混淆的函数名所在source文件的bak内容 213 | cat $BACKUP_FILE | while read backup; do 214 | backupName=${backup##*/} 215 | fileName=`echo $backupName | cut -d "." -f2,3` 216 | filePath=${backup/$backupName/$fileName} 217 | 218 | echo "recover $backup to $filePath" 219 | 220 | cp $backup $filePath 221 | rm $backup 222 | done 223 | # 删除修改记录 224 | removeIfExist $SYMBOL_FILE 225 | removeIfExist $CONFUSE_FILE 226 | removeIfExist $BACKUP_FILE 227 | removeIfExist $CONFUSE_FLAG 228 | else 229 | echo "Not confuse yet!" 230 | fi 231 | info "clean done" 232 | } 233 | 234 | # 检查是否上次未完成 235 | precheck() { 236 | # 创建一个隐藏文件,仅标记混淆编译的状态 237 | # 由于编译过程有可能被中断,因此混淆后的代码可能未恢复,在开始备份前先做判断 238 | unconfuse 239 | touch $CONFUSE_FLAG 240 | } 241 | 242 | # 去混淆->备份->混淆 243 | safeConfuse() { 244 | precheck 245 | backupAllSource 246 | confuseOnly 247 | } 248 | 249 | # 去混淆->备份->混淆 250 | # 编译 251 | # 去混淆 252 | safeConfuseAndBuild() { 253 | info "preparing confuse and build..." 254 | 255 | safeConfuse 256 | buildAll 257 | unconfuse 258 | 259 | info "all done" 260 | } 261 | 262 | usage() { 263 | echo -e "\033[1;31musage: ./confuseAndBuild.sh [-u|c|b|a]" 264 | echo -e " -u" 265 | echo -e " unconfuse: 清理工作,去混淆" 266 | echo -e " -c" 267 | echo -e " safeConfuse: 去混淆->备份->混淆" 268 | echo -e " -b" 269 | echo -e " buildAll: 编译生成通用framework" 270 | echo -e " -a" 271 | echo -e " safeConfuseAndBuild: 去混淆->备份->混淆->编译->去混淆" 272 | echo -e "EXAMPLE:" 273 | echo -e " ./confuseAndBuild.sh -u\033[0m" 274 | } 275 | 276 | main() { 277 | echo "参数个数:$# 参数值:$1" 278 | case $1 in 279 | "-u" ) 280 | unconfuse 281 | ;; 282 | "-c" ) 283 | safeConfuse 284 | ;; 285 | "-b" ) 286 | buildAll 287 | ;; 288 | "-a" ) 289 | safeConfuseAndBuild 290 | ;; 291 | * ) 292 | usage 293 | ;; 294 | esac 295 | } 296 | 297 | main $@ 298 | 299 | --------------------------------------------------------------------------------