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