... | @@ -466,7 +466,7 @@ | ... | @@ -466,7 +466,7 @@ |
466 | isa = XCBuildConfiguration; | 466 | isa = XCBuildConfiguration; |
467 | buildSettings = { | 467 | buildSettings = { |
468 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | 468 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
469 | - CODE_SIGN_IDENTITY = "iPhone Developer: Yufeng Wang (N5VLW9NRUG)"; | 469 | + CODE_SIGN_IDENTITY = "iPhone Developer: Feng Zhang (4LYC35G22K)"; |
470 | DEAD_CODE_STRIPPING = NO; | 470 | DEAD_CODE_STRIPPING = NO; |
471 | ENABLE_BITCODE = NO; | 471 | ENABLE_BITCODE = NO; |
472 | FRAMEWORK_SEARCH_PATHS = ( | 472 | FRAMEWORK_SEARCH_PATHS = ( |
... | @@ -484,9 +484,9 @@ | ... | @@ -484,9 +484,9 @@ |
484 | ); | 484 | ); |
485 | ONLY_ACTIVE_ARCH = NO; | 485 | ONLY_ACTIVE_ARCH = NO; |
486 | OTHER_LDFLAGS = ""; | 486 | OTHER_LDFLAGS = ""; |
487 | - PRODUCT_BUNDLE_IDENTIFIER = com.jian.wuji; | 487 | + PRODUCT_BUNDLE_IDENTIFIER = yhjy.mhtx.ios; |
488 | PRODUCT_NAME = "$(TARGET_NAME)"; | 488 | PRODUCT_NAME = "$(TARGET_NAME)"; |
489 | - PROVISIONING_PROFILE = "e6d180fd-5532-4218-bf56-0c1afa8ea0b4"; | 489 | + PROVISIONING_PROFILE = "f746a8a9-526c-4114-b2d6-c8fa351e323a"; |
490 | TARGETED_DEVICE_FAMILY = 2; | 490 | TARGETED_DEVICE_FAMILY = 2; |
491 | VALID_ARCHS = "arm64 armv7s"; | 491 | VALID_ARCHS = "arm64 armv7s"; |
492 | }; | 492 | }; |
... | @@ -496,7 +496,7 @@ | ... | @@ -496,7 +496,7 @@ |
496 | isa = XCBuildConfiguration; | 496 | isa = XCBuildConfiguration; |
497 | buildSettings = { | 497 | buildSettings = { |
498 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | 498 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
499 | - CODE_SIGN_IDENTITY = "iPhone Developer: Yufeng Wang (N5VLW9NRUG)"; | 499 | + CODE_SIGN_IDENTITY = "iPhone Developer: Feng Zhang (4LYC35G22K)"; |
500 | DEAD_CODE_STRIPPING = NO; | 500 | DEAD_CODE_STRIPPING = NO; |
501 | ENABLE_BITCODE = NO; | 501 | ENABLE_BITCODE = NO; |
502 | FRAMEWORK_SEARCH_PATHS = ( | 502 | FRAMEWORK_SEARCH_PATHS = ( |
... | @@ -514,9 +514,9 @@ | ... | @@ -514,9 +514,9 @@ |
514 | ); | 514 | ); |
515 | ONLY_ACTIVE_ARCH = NO; | 515 | ONLY_ACTIVE_ARCH = NO; |
516 | OTHER_LDFLAGS = ""; | 516 | OTHER_LDFLAGS = ""; |
517 | - PRODUCT_BUNDLE_IDENTIFIER = com.jian.wuji; | 517 | + PRODUCT_BUNDLE_IDENTIFIER = yhjy.mhtx.ios; |
518 | PRODUCT_NAME = "$(TARGET_NAME)"; | 518 | PRODUCT_NAME = "$(TARGET_NAME)"; |
519 | - PROVISIONING_PROFILE = "e6d180fd-5532-4218-bf56-0c1afa8ea0b4"; | 519 | + PROVISIONING_PROFILE = "f746a8a9-526c-4114-b2d6-c8fa351e323a"; |
520 | TARGETED_DEVICE_FAMILY = 2; | 520 | TARGETED_DEVICE_FAMILY = 2; |
521 | VALID_ARCHS = "arm64 armv7s"; | 521 | VALID_ARCHS = "arm64 armv7s"; |
522 | }; | 522 | }; | ... | ... |
... | @@ -32,7 +32,7 @@ | ... | @@ -32,7 +32,7 @@ |
32 | 32 | ||
33 | #define REPORT_URL @"https://statistic.public.sdk.gzyouai.com/sdk/statistic" //http://183.57.76.181:9030/sdk/statistic | 33 | #define REPORT_URL @"https://statistic.public.sdk.gzyouai.com/sdk/statistic" //http://183.57.76.181:9030/sdk/statistic |
34 | 34 | ||
35 | -#define REPORT_IDFA_URL @"https://statistic.public.sdk.gzyouai.com/sdk/last_channel?idfa=" //@"http://183.57.76.181:9030/sdk/last_channel?idfa="// | 35 | +#define REPORT_IDFA_URL @"https://statistic.public.sdk.gzyouai.com/sdk/last_channel?idfa=%@&sdkSimpleName=%@&gameSimpleName=%@" //@"http://183.57.76.181:9030/sdk/last_channel?idfa="// |
36 | 36 | ||
37 | #define REPORT_OPEN @"open" | 37 | #define REPORT_OPEN @"open" |
38 | #define REPORT_ENTER @"enter" | 38 | #define REPORT_ENTER @"enter" | ... | ... |
1 | +// !$*UTF8*$! | ||
2 | +{ | ||
3 | + archiveVersion = 1; | ||
4 | + classes = { | ||
5 | + }; | ||
6 | + objectVersion = 46; | ||
7 | + objects = { | ||
8 | + | ||
9 | +/* Begin PBXBuildFile section */ | ||
10 | + 30C5475DA8C44BC2399095C8 /* SDKInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = 808C463EAECB4A4BB6BB2004 /* SDKInterface.m */; }; | ||
11 | + 3B404515BB7BFCD33A9B0E24 /* WSSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE784E00A1B96BCBC08E3129 /* WSSDK.framework */; }; | ||
12 | + 50954B5EAC6C16851E424C62 /* WSSDKBundle.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 87AC47478D1103BBD023A1DD /* WSSDKBundle.bundle */; }; | ||
13 | + 621048FF8BF94EBC43AFAF74 /* WSSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE784E00A1B96BCBC08E3129 /* WSSDK.framework */; }; | ||
14 | + 6C0D4A4DA615A3CAB008ECFD /* WSSDKBundle.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 87AC47478D1103BBD023A1DD /* WSSDKBundle.bundle */; }; | ||
15 | + 6C6B413AA6BC55551D978E35 /* pool_setting in Resources */ = {isa = PBXBuildFile; fileRef = 70DE4E99A139BD7CDDF57F75 /* pool_setting */; }; | ||
16 | + 809C497DA5E8F078C739BD79 /* pool_setting in Resources */ = {isa = PBXBuildFile; fileRef = 70DE4E99A139BD7CDDF57F75 /* pool_setting */; }; | ||
17 | + 80AE40FA805C0B970AB08460 /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82CD4C4DA8AFBE3304D3B851 /* AdSupport.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
18 | + 8425EC1A1F0E3CBD00B0D868 /* PoolSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8425EC191F0E3CBD00B0D868 /* PoolSdk.framework */; settings = {ASSET_TAGS = (); }; }; | ||
19 | + 847EE5E21EE9007E003A4B7B /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 847EE5E11EE9007E003A4B7B /* MainViewController.m */; settings = {ASSET_TAGS = (); }; }; | ||
20 | + 8484E4F51EE7E0DC00B402D1 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8484E4F21EE7E0DC00B402D1 /* AppDelegate.m */; settings = {ASSET_TAGS = (); }; }; | ||
21 | + 8484E4F61EE7E0DC00B402D1 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8484E4F41EE7E0DC00B402D1 /* ViewController.m */; settings = {ASSET_TAGS = (); }; }; | ||
22 | + 8484E4FC1EE7E1D800B402D1 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E4FB1EE7E1D800B402D1 /* libsqlite3.dylib */; }; | ||
23 | + 8484E4FE1EE7E1F700B402D1 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E4FD1EE7E1F700B402D1 /* CoreTelephony.framework */; }; | ||
24 | + 8484E5001EE7E20C00B402D1 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E4FF1EE7E20C00B402D1 /* CFNetwork.framework */; }; | ||
25 | + 8484E5021EE7E21F00B402D1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5011EE7E21F00B402D1 /* UIKit.framework */; }; | ||
26 | + 8484E5041EE7E24400B402D1 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5031EE7E24400B402D1 /* StoreKit.framework */; }; | ||
27 | + 8484E5061EE7E24A00B402D1 /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5051EE7E24A00B402D1 /* CoreMotion.framework */; }; | ||
28 | + 8484E5081EE7E25600B402D1 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5071EE7E25600B402D1 /* CoreText.framework */; }; | ||
29 | + 8484E50A1EE7E26200B402D1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5091EE7E26200B402D1 /* Security.framework */; }; | ||
30 | + 8484E50C1EE7E27100B402D1 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E50B1EE7E27100B402D1 /* CoreGraphics.framework */; }; | ||
31 | + 8484E50E1EE7E28000B402D1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E50D1EE7E28000B402D1 /* QuartzCore.framework */; }; | ||
32 | + 8484E5101EE7E29A00B402D1 /* libc++.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E50F1EE7E29A00B402D1 /* libc++.1.dylib */; }; | ||
33 | + 8484E5121EE7E2B800B402D1 /* libz.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5111EE7E2B800B402D1 /* libz.1.dylib */; }; | ||
34 | + 8484E5141EE7E2DE00B402D1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5131EE7E2DE00B402D1 /* Foundation.framework */; }; | ||
35 | + 8484E5161EE7E36800B402D1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5151EE7E36800B402D1 /* SystemConfiguration.framework */; }; | ||
36 | + 943045609C15BF800DB95AE4 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 35E1420FB0608659E1D07688 /* MBProgressHUD.m */; }; | ||
37 | + 96154CB3AA02C1A6FED23EBB /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82CD4C4DA8AFBE3304D3B851 /* AdSupport.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
38 | + 9BAB460C801471DBF2697BAE /* SDKInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = 808C463EAECB4A4BB6BB2004 /* SDKInterface.m */; }; | ||
39 | + 9D374AC1B1728FFB09B7CD98 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 35E1420FB0608659E1D07688 /* MBProgressHUD.m */; }; | ||
40 | + BB5F3C8E1C1811BC00DA339D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BB5F3C8D1C1811BC00DA339D /* main.m */; }; | ||
41 | + BB5F3C971C1811BC00DA339D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BB5F3C951C1811BC00DA339D /* Main.storyboard */; }; | ||
42 | + BB5F3C9C1C1811BC00DA339D /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB5F3C9A1C1811BC00DA339D /* LaunchScreen.xib */; }; | ||
43 | + BB5F3CA81C1811BC00DA339D /* DemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BB5F3CA71C1811BC00DA339D /* DemoTests.m */; }; | ||
44 | +/* End PBXBuildFile section */ | ||
45 | + | ||
46 | +/* Begin PBXContainerItemProxy section */ | ||
47 | + BB5F3CA21C1811BC00DA339D /* PBXContainerItemProxy */ = { | ||
48 | + isa = PBXContainerItemProxy; | ||
49 | + containerPortal = BB5F3C801C1811BC00DA339D /* Project object */; | ||
50 | + proxyType = 1; | ||
51 | + remoteGlobalIDString = BB5F3C871C1811BC00DA339D; | ||
52 | + remoteInfo = Demo; | ||
53 | + }; | ||
54 | +/* End PBXContainerItemProxy section */ | ||
55 | + | ||
56 | +/* Begin PBXCopyFilesBuildPhase section */ | ||
57 | + 84398BFB1C4C83EC0082D774 /* Embed Frameworks */ = { | ||
58 | + isa = PBXCopyFilesBuildPhase; | ||
59 | + buildActionMask = 2147483647; | ||
60 | + dstPath = ""; | ||
61 | + dstSubfolderSpec = 10; | ||
62 | + files = ( | ||
63 | + ); | ||
64 | + name = "Embed Frameworks"; | ||
65 | + runOnlyForDeploymentPostprocessing = 0; | ||
66 | + }; | ||
67 | +/* End PBXCopyFilesBuildPhase section */ | ||
68 | + | ||
69 | +/* Begin PBXFileReference section */ | ||
70 | + 0EA7410EBF281C739B6EA853 /* SDKInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDKInterface.h; path = poolsdk_file/poolsdk_play800/SDK/SDKInterface.h; sourceTree = SOURCE_ROOT; }; | ||
71 | + 35E1420FB0608659E1D07688 /* MBProgressHUD.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MBProgressHUD.m; path = poolsdk_file/poolsdk_play800/SDK/MBProgressHUD/MBProgressHUD.m; sourceTree = SOURCE_ROOT; }; | ||
72 | + 70DE4E99A139BD7CDDF57F75 /* pool_setting */ = {isa = PBXFileReference; lastKnownFileType = "?"; name = pool_setting; path = poolsdk_file/poolsdk_play800/SDK/pool_setting; sourceTree = SOURCE_ROOT; }; | ||
73 | + 808C463EAECB4A4BB6BB2004 /* SDKInterface.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDKInterface.m; path = poolsdk_file/poolsdk_play800/SDK/SDKInterface.m; sourceTree = SOURCE_ROOT; }; | ||
74 | + 82CD4C4DA8AFBE3304D3B851 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; }; | ||
75 | + 8425EC191F0E3CBD00B0D868 /* PoolSdk.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = PoolSdk.framework; sourceTree = "<group>"; }; | ||
76 | + 847EE5E01EE9007E003A4B7B /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = "<group>"; }; | ||
77 | + 847EE5E11EE9007E003A4B7B /* MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainViewController.m; sourceTree = "<group>"; }; | ||
78 | + 8484E4F11EE7E0DC00B402D1 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; }; | ||
79 | + 8484E4F21EE7E0DC00B402D1 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; }; | ||
80 | + 8484E4F31EE7E0DC00B402D1 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; }; | ||
81 | + 8484E4F41EE7E0DC00B402D1 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; }; | ||
82 | + 8484E4FB1EE7E1D800B402D1 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = ../../../../../../../../usr/lib/libsqlite3.dylib; sourceTree = "<group>"; }; | ||
83 | + 8484E4FD1EE7E1F700B402D1 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; | ||
84 | + 8484E4FF1EE7E20C00B402D1 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; | ||
85 | + 8484E5011EE7E21F00B402D1 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; | ||
86 | + 8484E5031EE7E24400B402D1 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; | ||
87 | + 8484E5051EE7E24A00B402D1 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; | ||
88 | + 8484E5071EE7E25600B402D1 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; | ||
89 | + 8484E5091EE7E26200B402D1 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; | ||
90 | + 8484E50B1EE7E27100B402D1 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; | ||
91 | + 8484E50D1EE7E28000B402D1 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; | ||
92 | + 8484E50F1EE7E29A00B402D1 /* libc++.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.1.dylib"; path = "../../../../../../../../usr/lib/libc++.1.dylib"; sourceTree = "<group>"; }; | ||
93 | + 8484E5111EE7E2B800B402D1 /* libz.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.1.dylib; path = ../../../../../../../../usr/lib/libz.1.dylib; sourceTree = "<group>"; }; | ||
94 | + 8484E5131EE7E2DE00B402D1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; | ||
95 | + 8484E5151EE7E36800B402D1 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; | ||
96 | + 87AC47478D1103BBD023A1DD /* WSSDKBundle.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = WSSDKBundle.bundle; path = poolsdk_file/poolsdk_play800/SDK/WSSDKBundle.bundle; sourceTree = SOURCE_ROOT; }; | ||
97 | + A484405786EA19C4B447AA93 /* MBProgressHUD.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MBProgressHUD.h; path = poolsdk_file/poolsdk_play800/SDK/MBProgressHUD/MBProgressHUD.h; sourceTree = SOURCE_ROOT; }; | ||
98 | + BB5F3C881C1811BC00DA339D /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
99 | + BB5F3C8D1C1811BC00DA339D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; | ||
100 | + BB5F3C961C1811BC00DA339D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; | ||
101 | + BB5F3C9B1C1811BC00DA339D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; }; | ||
102 | + BB5F3CA11C1811BC00DA339D /* DemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
103 | + BB5F3CA61C1811BC00DA339D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | ||
104 | + BB5F3CA71C1811BC00DA339D /* DemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoTests.m; sourceTree = "<group>"; }; | ||
105 | + CE784E00A1B96BCBC08E3129 /* WSSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WSSDK.framework; path = poolsdk_file/poolsdk_play800/SDK/WSSDK.framework; sourceTree = SOURCE_ROOT; }; | ||
106 | +/* End PBXFileReference section */ | ||
107 | + | ||
108 | +/* Begin PBXFrameworksBuildPhase section */ | ||
109 | + BB5F3C851C1811BC00DA339D /* Frameworks */ = { | ||
110 | + isa = PBXFrameworksBuildPhase; | ||
111 | + buildActionMask = 2147483647; | ||
112 | + files = ( | ||
113 | + 8484E5161EE7E36800B402D1 /* SystemConfiguration.framework in Frameworks */, | ||
114 | + 8484E4FC1EE7E1D800B402D1 /* libsqlite3.dylib in Frameworks */, | ||
115 | + 8484E5121EE7E2B800B402D1 /* libz.1.dylib in Frameworks */, | ||
116 | + 8484E5101EE7E29A00B402D1 /* libc++.1.dylib in Frameworks */, | ||
117 | + 8484E5001EE7E20C00B402D1 /* CFNetwork.framework in Frameworks */, | ||
118 | + 8484E5061EE7E24A00B402D1 /* CoreMotion.framework in Frameworks */, | ||
119 | + 8484E5021EE7E21F00B402D1 /* UIKit.framework in Frameworks */, | ||
120 | + 8484E50C1EE7E27100B402D1 /* CoreGraphics.framework in Frameworks */, | ||
121 | + 8484E5081EE7E25600B402D1 /* CoreText.framework in Frameworks */, | ||
122 | + 8484E50E1EE7E28000B402D1 /* QuartzCore.framework in Frameworks */, | ||
123 | + 8484E5141EE7E2DE00B402D1 /* Foundation.framework in Frameworks */, | ||
124 | + 8484E50A1EE7E26200B402D1 /* Security.framework in Frameworks */, | ||
125 | + 8484E5041EE7E24400B402D1 /* StoreKit.framework in Frameworks */, | ||
126 | + 8425EC1A1F0E3CBD00B0D868 /* PoolSdk.framework in Frameworks */, | ||
127 | + 8484E4FE1EE7E1F700B402D1 /* CoreTelephony.framework in Frameworks */, | ||
128 | + 621048FF8BF94EBC43AFAF74 /* WSSDK.framework in Frameworks */, | ||
129 | + 80AE40FA805C0B970AB08460 /* AdSupport.framework in Frameworks */, | ||
130 | + ); | ||
131 | + runOnlyForDeploymentPostprocessing = 0; | ||
132 | + }; | ||
133 | + BB5F3C9E1C1811BC00DA339D /* Frameworks */ = { | ||
134 | + isa = PBXFrameworksBuildPhase; | ||
135 | + buildActionMask = 2147483647; | ||
136 | + files = ( | ||
137 | + 3B404515BB7BFCD33A9B0E24 /* WSSDK.framework in Frameworks */, | ||
138 | + 96154CB3AA02C1A6FED23EBB /* AdSupport.framework in Frameworks */, | ||
139 | + ); | ||
140 | + runOnlyForDeploymentPostprocessing = 0; | ||
141 | + }; | ||
142 | +/* End PBXFrameworksBuildPhase section */ | ||
143 | + | ||
144 | +/* Begin PBXGroup section */ | ||
145 | + 218244E19195FB06A542F74A /* Frameworks */ = { | ||
146 | + isa = PBXGroup; | ||
147 | + children = ( | ||
148 | + 82CD4C4DA8AFBE3304D3B851 /* AdSupport.framework */, | ||
149 | + ); | ||
150 | + name = Frameworks; | ||
151 | + sourceTree = "<group>"; | ||
152 | + }; | ||
153 | + 7620454B80248959F0CA5CEE /* MBProgressHUD */ = { | ||
154 | + isa = PBXGroup; | ||
155 | + children = ( | ||
156 | + 35E1420FB0608659E1D07688 /* MBProgressHUD.m */, | ||
157 | + A484405786EA19C4B447AA93 /* MBProgressHUD.h */, | ||
158 | + ); | ||
159 | + name = MBProgressHUD; | ||
160 | + path = poolsdk_file/poolsdk_play800/SDK/MBProgressHUD; | ||
161 | + sourceTree = SOURCE_ROOT; | ||
162 | + }; | ||
163 | + 8476DF631C4DD70500EC42BA /* poolsdk_file */ = { | ||
164 | + isa = PBXGroup; | ||
165 | + children = ( | ||
166 | + ); | ||
167 | + name = poolsdk_file; | ||
168 | + sourceTree = "<group>"; | ||
169 | + }; | ||
170 | + BB5F3C7F1C1811BC00DA339D = { | ||
171 | + isa = PBXGroup; | ||
172 | + children = ( | ||
173 | + 8484E5151EE7E36800B402D1 /* SystemConfiguration.framework */, | ||
174 | + 8484E5131EE7E2DE00B402D1 /* Foundation.framework */, | ||
175 | + 8484E5111EE7E2B800B402D1 /* libz.1.dylib */, | ||
176 | + 8484E50F1EE7E29A00B402D1 /* libc++.1.dylib */, | ||
177 | + 8484E50D1EE7E28000B402D1 /* QuartzCore.framework */, | ||
178 | + 8484E50B1EE7E27100B402D1 /* CoreGraphics.framework */, | ||
179 | + 8484E5091EE7E26200B402D1 /* Security.framework */, | ||
180 | + 8484E5071EE7E25600B402D1 /* CoreText.framework */, | ||
181 | + 8484E5051EE7E24A00B402D1 /* CoreMotion.framework */, | ||
182 | + 8484E5031EE7E24400B402D1 /* StoreKit.framework */, | ||
183 | + 8484E5011EE7E21F00B402D1 /* UIKit.framework */, | ||
184 | + 8484E4FF1EE7E20C00B402D1 /* CFNetwork.framework */, | ||
185 | + 8484E4FD1EE7E1F700B402D1 /* CoreTelephony.framework */, | ||
186 | + 8484E4FB1EE7E1D800B402D1 /* libsqlite3.dylib */, | ||
187 | + 8476DF631C4DD70500EC42BA /* poolsdk_file */, | ||
188 | + BB5F3C8A1C1811BC00DA339D /* Demo */, | ||
189 | + BB5F3CA41C1811BC00DA339D /* DemoTests */, | ||
190 | + BB5F3C891C1811BC00DA339D /* Products */, | ||
191 | + D869437E85630602807E5FD6 /* SDK */, | ||
192 | + 218244E19195FB06A542F74A /* Frameworks */, | ||
193 | + ); | ||
194 | + sourceTree = "<group>"; | ||
195 | + }; | ||
196 | + BB5F3C891C1811BC00DA339D /* Products */ = { | ||
197 | + isa = PBXGroup; | ||
198 | + children = ( | ||
199 | + BB5F3C881C1811BC00DA339D /* Demo.app */, | ||
200 | + BB5F3CA11C1811BC00DA339D /* DemoTests.xctest */, | ||
201 | + ); | ||
202 | + name = Products; | ||
203 | + sourceTree = "<group>"; | ||
204 | + }; | ||
205 | + BB5F3C8A1C1811BC00DA339D /* Demo */ = { | ||
206 | + isa = PBXGroup; | ||
207 | + children = ( | ||
208 | + 8425EC191F0E3CBD00B0D868 /* PoolSdk.framework */, | ||
209 | + 8484E4F11EE7E0DC00B402D1 /* AppDelegate.h */, | ||
210 | + 8484E4F21EE7E0DC00B402D1 /* AppDelegate.m */, | ||
211 | + 8484E4F31EE7E0DC00B402D1 /* ViewController.h */, | ||
212 | + 8484E4F41EE7E0DC00B402D1 /* ViewController.m */, | ||
213 | + 847EE5E01EE9007E003A4B7B /* MainViewController.h */, | ||
214 | + 847EE5E11EE9007E003A4B7B /* MainViewController.m */, | ||
215 | + BB5F3C951C1811BC00DA339D /* Main.storyboard */, | ||
216 | + BB5F3C9A1C1811BC00DA339D /* LaunchScreen.xib */, | ||
217 | + BB5F3C8B1C1811BC00DA339D /* Supporting Files */, | ||
218 | + ); | ||
219 | + path = Demo; | ||
220 | + sourceTree = "<group>"; | ||
221 | + }; | ||
222 | + BB5F3C8B1C1811BC00DA339D /* Supporting Files */ = { | ||
223 | + isa = PBXGroup; | ||
224 | + children = ( | ||
225 | + BB5F3C8D1C1811BC00DA339D /* main.m */, | ||
226 | + ); | ||
227 | + name = "Supporting Files"; | ||
228 | + sourceTree = "<group>"; | ||
229 | + }; | ||
230 | + BB5F3CA41C1811BC00DA339D /* DemoTests */ = { | ||
231 | + isa = PBXGroup; | ||
232 | + children = ( | ||
233 | + BB5F3CA71C1811BC00DA339D /* DemoTests.m */, | ||
234 | + BB5F3CA51C1811BC00DA339D /* Supporting Files */, | ||
235 | + ); | ||
236 | + path = DemoTests; | ||
237 | + sourceTree = "<group>"; | ||
238 | + }; | ||
239 | + BB5F3CA51C1811BC00DA339D /* Supporting Files */ = { | ||
240 | + isa = PBXGroup; | ||
241 | + children = ( | ||
242 | + BB5F3CA61C1811BC00DA339D /* Info.plist */, | ||
243 | + ); | ||
244 | + name = "Supporting Files"; | ||
245 | + sourceTree = "<group>"; | ||
246 | + }; | ||
247 | + D869437E85630602807E5FD6 /* SDK */ = { | ||
248 | + isa = PBXGroup; | ||
249 | + children = ( | ||
250 | + 0EA7410EBF281C739B6EA853 /* SDKInterface.h */, | ||
251 | + 70DE4E99A139BD7CDDF57F75 /* pool_setting */, | ||
252 | + 808C463EAECB4A4BB6BB2004 /* SDKInterface.m */, | ||
253 | + 7620454B80248959F0CA5CEE /* MBProgressHUD */, | ||
254 | + CE784E00A1B96BCBC08E3129 /* WSSDK.framework */, | ||
255 | + 87AC47478D1103BBD023A1DD /* WSSDKBundle.bundle */, | ||
256 | + ); | ||
257 | + name = SDK; | ||
258 | + path = poolsdk_file/poolsdk_play800/SDK; | ||
259 | + sourceTree = SOURCE_ROOT; | ||
260 | + }; | ||
261 | +/* End PBXGroup section */ | ||
262 | + | ||
263 | +/* Begin PBXNativeTarget section */ | ||
264 | + BB5F3C871C1811BC00DA339D /* Demo */ = { | ||
265 | + isa = PBXNativeTarget; | ||
266 | + buildConfigurationList = BB5F3CAB1C1811BC00DA339D /* Build configuration list for PBXNativeTarget "Demo" */; | ||
267 | + buildPhases = ( | ||
268 | + BB5F3C841C1811BC00DA339D /* Sources */, | ||
269 | + BB5F3C851C1811BC00DA339D /* Frameworks */, | ||
270 | + BB5F3C861C1811BC00DA339D /* Resources */, | ||
271 | + 84398BFB1C4C83EC0082D774 /* Embed Frameworks */, | ||
272 | + ); | ||
273 | + buildRules = ( | ||
274 | + ); | ||
275 | + dependencies = ( | ||
276 | + ); | ||
277 | + name = Demo; | ||
278 | + productName = Demo; | ||
279 | + productReference = BB5F3C881C1811BC00DA339D /* Demo.app */; | ||
280 | + productType = "com.apple.product-type.application"; | ||
281 | + }; | ||
282 | + BB5F3CA01C1811BC00DA339D /* DemoTests */ = { | ||
283 | + isa = PBXNativeTarget; | ||
284 | + buildConfigurationList = BB5F3CAE1C1811BC00DA339D /* Build configuration list for PBXNativeTarget "DemoTests" */; | ||
285 | + buildPhases = ( | ||
286 | + BB5F3C9D1C1811BC00DA339D /* Sources */, | ||
287 | + BB5F3C9E1C1811BC00DA339D /* Frameworks */, | ||
288 | + BB5F3C9F1C1811BC00DA339D /* Resources */, | ||
289 | + ); | ||
290 | + buildRules = ( | ||
291 | + ); | ||
292 | + dependencies = ( | ||
293 | + BB5F3CA31C1811BC00DA339D /* PBXTargetDependency */, | ||
294 | + ); | ||
295 | + name = DemoTests; | ||
296 | + productName = DemoTests; | ||
297 | + productReference = BB5F3CA11C1811BC00DA339D /* DemoTests.xctest */; | ||
298 | + productType = "com.apple.product-type.bundle.unit-test"; | ||
299 | + }; | ||
300 | +/* End PBXNativeTarget section */ | ||
301 | + | ||
302 | +/* Begin PBXProject section */ | ||
303 | + BB5F3C801C1811BC00DA339D /* Project object */ = { | ||
304 | + isa = PBXProject; | ||
305 | + attributes = { | ||
306 | + LastUpgradeCheck = 0640; | ||
307 | + ORGANIZATIONNAME = winFan; | ||
308 | + TargetAttributes = { | ||
309 | + BB5F3C871C1811BC00DA339D = { | ||
310 | + CreatedOnToolsVersion = 6.4; | ||
311 | + }; | ||
312 | + BB5F3CA01C1811BC00DA339D = { | ||
313 | + CreatedOnToolsVersion = 6.4; | ||
314 | + TestTargetID = BB5F3C871C1811BC00DA339D; | ||
315 | + }; | ||
316 | + }; | ||
317 | + }; | ||
318 | + buildConfigurationList = BB5F3C831C1811BC00DA339D /* Build configuration list for PBXProject "Demo_play800" */; | ||
319 | + compatibilityVersion = "Xcode 3.2"; | ||
320 | + developmentRegion = English; | ||
321 | + hasScannedForEncodings = 0; | ||
322 | + knownRegions = ( | ||
323 | + en, | ||
324 | + Base, | ||
325 | + ); | ||
326 | + mainGroup = BB5F3C7F1C1811BC00DA339D; | ||
327 | + productRefGroup = BB5F3C891C1811BC00DA339D /* Products */; | ||
328 | + projectDirPath = ""; | ||
329 | + projectRoot = ""; | ||
330 | + targets = ( | ||
331 | + BB5F3C871C1811BC00DA339D /* Demo */, | ||
332 | + BB5F3CA01C1811BC00DA339D /* DemoTests */, | ||
333 | + ); | ||
334 | + }; | ||
335 | +/* End PBXProject section */ | ||
336 | + | ||
337 | +/* Begin PBXResourcesBuildPhase section */ | ||
338 | + BB5F3C861C1811BC00DA339D /* Resources */ = { | ||
339 | + isa = PBXResourcesBuildPhase; | ||
340 | + buildActionMask = 2147483647; | ||
341 | + files = ( | ||
342 | + BB5F3C971C1811BC00DA339D /* Main.storyboard in Resources */, | ||
343 | + BB5F3C9C1C1811BC00DA339D /* LaunchScreen.xib in Resources */, | ||
344 | + 809C497DA5E8F078C739BD79 /* pool_setting in Resources */, | ||
345 | + 50954B5EAC6C16851E424C62 /* WSSDKBundle.bundle in Resources */, | ||
346 | + ); | ||
347 | + runOnlyForDeploymentPostprocessing = 0; | ||
348 | + }; | ||
349 | + BB5F3C9F1C1811BC00DA339D /* Resources */ = { | ||
350 | + isa = PBXResourcesBuildPhase; | ||
351 | + buildActionMask = 2147483647; | ||
352 | + files = ( | ||
353 | + 6C6B413AA6BC55551D978E35 /* pool_setting in Resources */, | ||
354 | + 6C0D4A4DA615A3CAB008ECFD /* WSSDKBundle.bundle in Resources */, | ||
355 | + ); | ||
356 | + runOnlyForDeploymentPostprocessing = 0; | ||
357 | + }; | ||
358 | +/* End PBXResourcesBuildPhase section */ | ||
359 | + | ||
360 | +/* Begin PBXSourcesBuildPhase section */ | ||
361 | + BB5F3C841C1811BC00DA339D /* Sources */ = { | ||
362 | + isa = PBXSourcesBuildPhase; | ||
363 | + buildActionMask = 2147483647; | ||
364 | + files = ( | ||
365 | + 8484E4F51EE7E0DC00B402D1 /* AppDelegate.m in Sources */, | ||
366 | + 847EE5E21EE9007E003A4B7B /* MainViewController.m in Sources */, | ||
367 | + BB5F3C8E1C1811BC00DA339D /* main.m in Sources */, | ||
368 | + 8484E4F61EE7E0DC00B402D1 /* ViewController.m in Sources */, | ||
369 | + 30C5475DA8C44BC2399095C8 /* SDKInterface.m in Sources */, | ||
370 | + 9D374AC1B1728FFB09B7CD98 /* MBProgressHUD.m in Sources */, | ||
371 | + ); | ||
372 | + runOnlyForDeploymentPostprocessing = 0; | ||
373 | + }; | ||
374 | + BB5F3C9D1C1811BC00DA339D /* Sources */ = { | ||
375 | + isa = PBXSourcesBuildPhase; | ||
376 | + buildActionMask = 2147483647; | ||
377 | + files = ( | ||
378 | + BB5F3CA81C1811BC00DA339D /* DemoTests.m in Sources */, | ||
379 | + 9BAB460C801471DBF2697BAE /* SDKInterface.m in Sources */, | ||
380 | + 943045609C15BF800DB95AE4 /* MBProgressHUD.m in Sources */, | ||
381 | + ); | ||
382 | + runOnlyForDeploymentPostprocessing = 0; | ||
383 | + }; | ||
384 | +/* End PBXSourcesBuildPhase section */ | ||
385 | + | ||
386 | +/* Begin PBXTargetDependency section */ | ||
387 | + BB5F3CA31C1811BC00DA339D /* PBXTargetDependency */ = { | ||
388 | + isa = PBXTargetDependency; | ||
389 | + target = BB5F3C871C1811BC00DA339D /* Demo */; | ||
390 | + targetProxy = BB5F3CA21C1811BC00DA339D /* PBXContainerItemProxy */; | ||
391 | + }; | ||
392 | +/* End PBXTargetDependency section */ | ||
393 | + | ||
394 | +/* Begin PBXVariantGroup section */ | ||
395 | + BB5F3C951C1811BC00DA339D /* Main.storyboard */ = { | ||
396 | + isa = PBXVariantGroup; | ||
397 | + children = ( | ||
398 | + BB5F3C961C1811BC00DA339D /* Base */, | ||
399 | + ); | ||
400 | + name = Main.storyboard; | ||
401 | + sourceTree = "<group>"; | ||
402 | + }; | ||
403 | + BB5F3C9A1C1811BC00DA339D /* LaunchScreen.xib */ = { | ||
404 | + isa = PBXVariantGroup; | ||
405 | + children = ( | ||
406 | + BB5F3C9B1C1811BC00DA339D /* Base */, | ||
407 | + ); | ||
408 | + name = LaunchScreen.xib; | ||
409 | + sourceTree = "<group>"; | ||
410 | + }; | ||
411 | +/* End PBXVariantGroup section */ | ||
412 | + | ||
413 | +/* Begin XCBuildConfiguration section */ | ||
414 | + BB5F3CA91C1811BC00DA339D /* Debug */ = { | ||
415 | + isa = XCBuildConfiguration; | ||
416 | + buildSettings = { | ||
417 | + ALWAYS_SEARCH_USER_PATHS = NO; | ||
418 | + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = ""; | ||
419 | + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||
420 | + CLANG_CXX_LIBRARY = "libc++"; | ||
421 | + CLANG_ENABLE_MODULES = YES; | ||
422 | + CLANG_ENABLE_OBJC_ARC = YES; | ||
423 | + CLANG_WARN_BOOL_CONVERSION = YES; | ||
424 | + CLANG_WARN_CONSTANT_CONVERSION = YES; | ||
425 | + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||
426 | + CLANG_WARN_EMPTY_BODY = YES; | ||
427 | + CLANG_WARN_ENUM_CONVERSION = YES; | ||
428 | + CLANG_WARN_INT_CONVERSION = YES; | ||
429 | + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||
430 | + CLANG_WARN_UNREACHABLE_CODE = YES; | ||
431 | + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||
432 | + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||
433 | + COPY_PHASE_STRIP = NO; | ||
434 | + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||
435 | + ENABLE_BITCODE = NO; | ||
436 | + ENABLE_STRICT_OBJC_MSGSEND = YES; | ||
437 | + FRAMEWORK_SEARCH_PATHS = "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\""; | ||
438 | + GCC_C_LANGUAGE_STANDARD = gnu99; | ||
439 | + GCC_DYNAMIC_NO_PIC = NO; | ||
440 | + GCC_NO_COMMON_BLOCKS = YES; | ||
441 | + GCC_OPTIMIZATION_LEVEL = 0; | ||
442 | + GCC_PREPROCESSOR_DEFINITIONS = ( | ||
443 | + "DEBUG=1", | ||
444 | + "$(inherited)", | ||
445 | + ); | ||
446 | + GCC_SYMBOLS_PRIVATE_EXTERN = NO; | ||
447 | + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||
448 | + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||
449 | + GCC_WARN_UNDECLARED_SELECTOR = YES; | ||
450 | + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||
451 | + GCC_WARN_UNUSED_FUNCTION = YES; | ||
452 | + GCC_WARN_UNUSED_VARIABLE = YES; | ||
453 | + HEADER_SEARCH_PATHS = ( | ||
454 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\"", | ||
455 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK/MBProgressHUD\"", | ||
456 | + ); | ||
457 | + INFOPLIST_FILE = poolsdk_file/poolsdk_play800/Info.plist; | ||
458 | + IPHONEOS_DEPLOYMENT_TARGET = 8.4; | ||
459 | + LIBRARY_SEARCH_PATHS = "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\""; | ||
460 | + MTL_ENABLE_DEBUG_INFO = YES; | ||
461 | + ONLY_ACTIVE_ARCH = YES; | ||
462 | + OTHER_LDFLAGS = "-ObjC"; | ||
463 | + PRODUCT_BUNDLE_IDENTIFIER = com.hubing.qyj01; | ||
464 | + SDKROOT = iphoneos; | ||
465 | + }; | ||
466 | + name = Debug; | ||
467 | + }; | ||
468 | + BB5F3CAA1C1811BC00DA339D /* Release */ = { | ||
469 | + isa = XCBuildConfiguration; | ||
470 | + buildSettings = { | ||
471 | + ALWAYS_SEARCH_USER_PATHS = NO; | ||
472 | + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||
473 | + CLANG_CXX_LIBRARY = "libc++"; | ||
474 | + CLANG_ENABLE_MODULES = YES; | ||
475 | + CLANG_ENABLE_OBJC_ARC = YES; | ||
476 | + CLANG_WARN_BOOL_CONVERSION = YES; | ||
477 | + CLANG_WARN_CONSTANT_CONVERSION = YES; | ||
478 | + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||
479 | + CLANG_WARN_EMPTY_BODY = YES; | ||
480 | + CLANG_WARN_ENUM_CONVERSION = YES; | ||
481 | + CLANG_WARN_INT_CONVERSION = YES; | ||
482 | + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||
483 | + CLANG_WARN_UNREACHABLE_CODE = YES; | ||
484 | + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||
485 | + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||
486 | + COPY_PHASE_STRIP = NO; | ||
487 | + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||
488 | + ENABLE_BITCODE = NO; | ||
489 | + ENABLE_NS_ASSERTIONS = NO; | ||
490 | + ENABLE_STRICT_OBJC_MSGSEND = YES; | ||
491 | + FRAMEWORK_SEARCH_PATHS = "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\""; | ||
492 | + GCC_C_LANGUAGE_STANDARD = gnu99; | ||
493 | + GCC_NO_COMMON_BLOCKS = YES; | ||
494 | + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||
495 | + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||
496 | + GCC_WARN_UNDECLARED_SELECTOR = YES; | ||
497 | + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||
498 | + GCC_WARN_UNUSED_FUNCTION = YES; | ||
499 | + GCC_WARN_UNUSED_VARIABLE = YES; | ||
500 | + HEADER_SEARCH_PATHS = ( | ||
501 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\"", | ||
502 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK/MBProgressHUD\"", | ||
503 | + ); | ||
504 | + INFOPLIST_FILE = poolsdk_file/poolsdk_play800/Info.plist; | ||
505 | + IPHONEOS_DEPLOYMENT_TARGET = 8.4; | ||
506 | + LIBRARY_SEARCH_PATHS = "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\""; | ||
507 | + MTL_ENABLE_DEBUG_INFO = NO; | ||
508 | + OTHER_LDFLAGS = "-ObjC"; | ||
509 | + PRODUCT_BUNDLE_IDENTIFIER = com.hubing.qyj01; | ||
510 | + SDKROOT = iphoneos; | ||
511 | + VALIDATE_PRODUCT = YES; | ||
512 | + }; | ||
513 | + name = Release; | ||
514 | + }; | ||
515 | + BB5F3CAC1C1811BC00DA339D /* Debug */ = { | ||
516 | + isa = XCBuildConfiguration; | ||
517 | + buildSettings = { | ||
518 | + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||
519 | + CODE_SIGN_IDENTITY = "iPhone Developer: yalin qiu (L8S4MNKW95)"; | ||
520 | + DEAD_CODE_STRIPPING = NO; | ||
521 | + ENABLE_BITCODE = NO; | ||
522 | + FRAMEWORK_SEARCH_PATHS = ( | ||
523 | + "$(inherited)", | ||
524 | + "$(PROJECT_DIR)/Demo", | ||
525 | + "$(PROJECT_DIR)/poolsdk_file/poolsdk", | ||
526 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\"", | ||
527 | + ); | ||
528 | + HEADER_SEARCH_PATHS = ( | ||
529 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\"", | ||
530 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK/MBProgressHUD\"", | ||
531 | + ); | ||
532 | + INFOPLIST_FILE = poolsdk_file/poolsdk_play800/Info.plist; | ||
533 | + IPHONEOS_DEPLOYMENT_TARGET = 8.1; | ||
534 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | ||
535 | + LIBRARY_SEARCH_PATHS = ( | ||
536 | + "$(inherited)", | ||
537 | + "$(PROJECT_DIR)/Demo", | ||
538 | + "$(PROJECT_DIR)/poolsdk_file/poolsdk", | ||
539 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\"", | ||
540 | + ); | ||
541 | + ONLY_ACTIVE_ARCH = NO; | ||
542 | + OTHER_LDFLAGS = "-ObjC"; | ||
543 | + PRODUCT_BUNDLE_IDENTIFIER = com.mhtxyszt.ios; | ||
544 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
545 | + PROVISIONING_PROFILE = "d339d2d6-e1a9-4970-ad15-51d2672522a4"; | ||
546 | + TARGETED_DEVICE_FAMILY = 2; | ||
547 | + VALID_ARCHS = "arm64 armv7s"; | ||
548 | + }; | ||
549 | + name = Debug; | ||
550 | + }; | ||
551 | + BB5F3CAD1C1811BC00DA339D /* Release */ = { | ||
552 | + isa = XCBuildConfiguration; | ||
553 | + buildSettings = { | ||
554 | + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||
555 | + CODE_SIGN_IDENTITY = "iPhone Developer: yalin qiu (L8S4MNKW95)"; | ||
556 | + DEAD_CODE_STRIPPING = NO; | ||
557 | + ENABLE_BITCODE = NO; | ||
558 | + FRAMEWORK_SEARCH_PATHS = ( | ||
559 | + "$(inherited)", | ||
560 | + "$(PROJECT_DIR)/Demo", | ||
561 | + "$(PROJECT_DIR)/poolsdk_file/poolsdk", | ||
562 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\"", | ||
563 | + ); | ||
564 | + HEADER_SEARCH_PATHS = ( | ||
565 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\"", | ||
566 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK/MBProgressHUD\"", | ||
567 | + ); | ||
568 | + INFOPLIST_FILE = poolsdk_file/poolsdk_play800/Info.plist; | ||
569 | + IPHONEOS_DEPLOYMENT_TARGET = 8.1; | ||
570 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | ||
571 | + LIBRARY_SEARCH_PATHS = ( | ||
572 | + "$(inherited)", | ||
573 | + "$(PROJECT_DIR)/Demo", | ||
574 | + "$(PROJECT_DIR)/poolsdk_file/poolsdk", | ||
575 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\"", | ||
576 | + ); | ||
577 | + ONLY_ACTIVE_ARCH = NO; | ||
578 | + OTHER_LDFLAGS = "-ObjC"; | ||
579 | + PRODUCT_BUNDLE_IDENTIFIER = com.mhtxyszt.ios; | ||
580 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
581 | + PROVISIONING_PROFILE = "d339d2d6-e1a9-4970-ad15-51d2672522a4"; | ||
582 | + TARGETED_DEVICE_FAMILY = 2; | ||
583 | + VALID_ARCHS = "arm64 armv7s"; | ||
584 | + }; | ||
585 | + name = Release; | ||
586 | + }; | ||
587 | + BB5F3CAF1C1811BC00DA339D /* Debug */ = { | ||
588 | + isa = XCBuildConfiguration; | ||
589 | + buildSettings = { | ||
590 | + BUNDLE_LOADER = "$(TEST_HOST)"; | ||
591 | + ENABLE_BITCODE = NO; | ||
592 | + FRAMEWORK_SEARCH_PATHS = ( | ||
593 | + "$(SDKROOT)/Developer/Library/Frameworks", | ||
594 | + "$(inherited)", | ||
595 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\"", | ||
596 | + ); | ||
597 | + GCC_PREPROCESSOR_DEFINITIONS = ( | ||
598 | + "DEBUG=1", | ||
599 | + "$(inherited)", | ||
600 | + ); | ||
601 | + HEADER_SEARCH_PATHS = ( | ||
602 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\"", | ||
603 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK/MBProgressHUD\"", | ||
604 | + ); | ||
605 | + INFOPLIST_FILE = poolsdk_file/poolsdk_play800/Info.plist; | ||
606 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
607 | + LIBRARY_SEARCH_PATHS = "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\""; | ||
608 | + OTHER_LDFLAGS = "-ObjC"; | ||
609 | + PRODUCT_BUNDLE_IDENTIFIER = com.hubing.qyj01; | ||
610 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
611 | + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Demo.app/Demo"; | ||
612 | + }; | ||
613 | + name = Debug; | ||
614 | + }; | ||
615 | + BB5F3CB01C1811BC00DA339D /* Release */ = { | ||
616 | + isa = XCBuildConfiguration; | ||
617 | + buildSettings = { | ||
618 | + BUNDLE_LOADER = "$(TEST_HOST)"; | ||
619 | + ENABLE_BITCODE = NO; | ||
620 | + FRAMEWORK_SEARCH_PATHS = ( | ||
621 | + "$(SDKROOT)/Developer/Library/Frameworks", | ||
622 | + "$(inherited)", | ||
623 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\"", | ||
624 | + ); | ||
625 | + HEADER_SEARCH_PATHS = ( | ||
626 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\"", | ||
627 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK/MBProgressHUD\"", | ||
628 | + ); | ||
629 | + INFOPLIST_FILE = poolsdk_file/poolsdk_play800/Info.plist; | ||
630 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
631 | + LIBRARY_SEARCH_PATHS = "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_play800/SDK\""; | ||
632 | + OTHER_LDFLAGS = "-ObjC"; | ||
633 | + PRODUCT_BUNDLE_IDENTIFIER = com.hubing.qyj01; | ||
634 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
635 | + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Demo.app/Demo"; | ||
636 | + }; | ||
637 | + name = Release; | ||
638 | + }; | ||
639 | +/* End XCBuildConfiguration section */ | ||
640 | + | ||
641 | +/* Begin XCConfigurationList section */ | ||
642 | + BB5F3C831C1811BC00DA339D /* Build configuration list for PBXProject "Demo_play800" */ = { | ||
643 | + isa = XCConfigurationList; | ||
644 | + buildConfigurations = ( | ||
645 | + BB5F3CA91C1811BC00DA339D /* Debug */, | ||
646 | + BB5F3CAA1C1811BC00DA339D /* Release */, | ||
647 | + ); | ||
648 | + defaultConfigurationIsVisible = 0; | ||
649 | + defaultConfigurationName = Release; | ||
650 | + }; | ||
651 | + BB5F3CAB1C1811BC00DA339D /* Build configuration list for PBXNativeTarget "Demo" */ = { | ||
652 | + isa = XCConfigurationList; | ||
653 | + buildConfigurations = ( | ||
654 | + BB5F3CAC1C1811BC00DA339D /* Debug */, | ||
655 | + BB5F3CAD1C1811BC00DA339D /* Release */, | ||
656 | + ); | ||
657 | + defaultConfigurationIsVisible = 0; | ||
658 | + defaultConfigurationName = Release; | ||
659 | + }; | ||
660 | + BB5F3CAE1C1811BC00DA339D /* Build configuration list for PBXNativeTarget "DemoTests" */ = { | ||
661 | + isa = XCConfigurationList; | ||
662 | + buildConfigurations = ( | ||
663 | + BB5F3CAF1C1811BC00DA339D /* Debug */, | ||
664 | + BB5F3CB01C1811BC00DA339D /* Release */, | ||
665 | + ); | ||
666 | + defaultConfigurationIsVisible = 0; | ||
667 | + defaultConfigurationName = Release; | ||
668 | + }; | ||
669 | +/* End XCConfigurationList section */ | ||
670 | + }; | ||
671 | + rootObject = BB5F3C801C1811BC00DA339D /* Project object */; | ||
672 | +} |
1 | +{ | ||
2 | + "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "D1584AEF25B5C21395F515B62C90B71E0ACB26B2", | ||
3 | + "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { | ||
4 | + "5b13317c-0110-4367-8746-06bc6aadd3cd++2397" : { | ||
5 | + | ||
6 | + } | ||
7 | + }, | ||
8 | + "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { | ||
9 | + "D1584AEF25B5C21395F515B62C90B71E0ACB26B2" : 0, | ||
10 | + "5b13317c-0110-4367-8746-06bc6aadd3cd++2397" : 0 | ||
11 | + }, | ||
12 | + "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "8119CC7B-EDC1-4646-9378-8ECAC2EEB94B", | ||
13 | + "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { | ||
14 | + "D1584AEF25B5C21395F515B62C90B71E0ACB26B2" : "public_sdk_ios\/", | ||
15 | + "5b13317c-0110-4367-8746-06bc6aadd3cd++2397" : "youai_foolsdk_ios\/" | ||
16 | + }, | ||
17 | + "DVTSourceControlWorkspaceBlueprintNameKey" : "Demo", | ||
18 | + "DVTSourceControlWorkspaceBlueprintVersion" : 204, | ||
19 | + "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "PoolSdk_Demo\/Demo.xcodeproj", | ||
20 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ | ||
21 | + { | ||
22 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "svn:\/\/10.21.210.99", | ||
23 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Subversion", | ||
24 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "5b13317c-0110-4367-8746-06bc6aadd3cd++2397" | ||
25 | + }, | ||
26 | + { | ||
27 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "ssh:\/\/106.75.192.252:10022\/public_service\/public_sdk_ios.git", | ||
28 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", | ||
29 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "D1584AEF25B5C21395F515B62C90B71E0ACB26B2" | ||
30 | + } | ||
31 | + ] | ||
32 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Bucket | ||
3 | + type = "1" | ||
4 | + version = "2.0"> | ||
5 | + <Breakpoints> | ||
6 | + <BreakpointProxy | ||
7 | + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> | ||
8 | + <BreakpointContent | ||
9 | + shouldBeEnabled = "Yes" | ||
10 | + ignoreCount = "0" | ||
11 | + continueAfterRunningActions = "No" | ||
12 | + filePath = "../PoolSdk/PoolSdk/SDKInterface.m" | ||
13 | + timestampString = "471440051.171901" | ||
14 | + startingColumnNumber = "9223372036854775807" | ||
15 | + endingColumnNumber = "9223372036854775807" | ||
16 | + startingLineNumber = "77" | ||
17 | + endingLineNumber = "77" | ||
18 | + landmarkName = "-receiveLoginMessage:" | ||
19 | + landmarkType = "5"> | ||
20 | + </BreakpointContent> | ||
21 | + </BreakpointProxy> | ||
22 | + <BreakpointProxy | ||
23 | + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> | ||
24 | + <BreakpointContent | ||
25 | + shouldBeEnabled = "Yes" | ||
26 | + ignoreCount = "0" | ||
27 | + continueAfterRunningActions = "No" | ||
28 | + filePath = "../PoolSdk/PoolSdk/SDKInterface.m" | ||
29 | + timestampString = "471440051.171901" | ||
30 | + startingColumnNumber = "9223372036854775807" | ||
31 | + endingColumnNumber = "9223372036854775807" | ||
32 | + startingLineNumber = "43" | ||
33 | + endingLineNumber = "43" | ||
34 | + landmarkName = "-SDKloginSDK" | ||
35 | + landmarkType = "5"> | ||
36 | + </BreakpointContent> | ||
37 | + </BreakpointProxy> | ||
38 | + </Breakpoints> | ||
39 | +</Bucket> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Scheme | ||
3 | + LastUpgradeVersion = "0640" | ||
4 | + version = "1.3"> | ||
5 | + <BuildAction | ||
6 | + parallelizeBuildables = "YES" | ||
7 | + buildImplicitDependencies = "YES"> | ||
8 | + <BuildActionEntries> | ||
9 | + <BuildActionEntry | ||
10 | + buildForTesting = "YES" | ||
11 | + buildForRunning = "YES" | ||
12 | + buildForProfiling = "YES" | ||
13 | + buildForArchiving = "YES" | ||
14 | + buildForAnalyzing = "YES"> | ||
15 | + <BuildableReference | ||
16 | + BuildableIdentifier = "primary" | ||
17 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
18 | + BuildableName = "Demo.app" | ||
19 | + BlueprintName = "Demo" | ||
20 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
21 | + </BuildableReference> | ||
22 | + </BuildActionEntry> | ||
23 | + <BuildActionEntry | ||
24 | + buildForTesting = "YES" | ||
25 | + buildForRunning = "YES" | ||
26 | + buildForProfiling = "NO" | ||
27 | + buildForArchiving = "NO" | ||
28 | + buildForAnalyzing = "YES"> | ||
29 | + <BuildableReference | ||
30 | + BuildableIdentifier = "primary" | ||
31 | + BlueprintIdentifier = "BB5F3CA01C1811BC00DA339D" | ||
32 | + BuildableName = "DemoTests.xctest" | ||
33 | + BlueprintName = "DemoTests" | ||
34 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
35 | + </BuildableReference> | ||
36 | + </BuildActionEntry> | ||
37 | + </BuildActionEntries> | ||
38 | + </BuildAction> | ||
39 | + <TestAction | ||
40 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
41 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
42 | + shouldUseLaunchSchemeArgsEnv = "YES" | ||
43 | + buildConfiguration = "Debug"> | ||
44 | + <Testables> | ||
45 | + <TestableReference | ||
46 | + skipped = "NO"> | ||
47 | + <BuildableReference | ||
48 | + BuildableIdentifier = "primary" | ||
49 | + BlueprintIdentifier = "BB5F3CA01C1811BC00DA339D" | ||
50 | + BuildableName = "DemoTests.xctest" | ||
51 | + BlueprintName = "DemoTests" | ||
52 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
53 | + </BuildableReference> | ||
54 | + </TestableReference> | ||
55 | + </Testables> | ||
56 | + <MacroExpansion> | ||
57 | + <BuildableReference | ||
58 | + BuildableIdentifier = "primary" | ||
59 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
60 | + BuildableName = "Demo.app" | ||
61 | + BlueprintName = "Demo" | ||
62 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
63 | + </BuildableReference> | ||
64 | + </MacroExpansion> | ||
65 | + </TestAction> | ||
66 | + <LaunchAction | ||
67 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
68 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
69 | + launchStyle = "0" | ||
70 | + useCustomWorkingDirectory = "NO" | ||
71 | + buildConfiguration = "Debug" | ||
72 | + ignoresPersistentStateOnLaunch = "NO" | ||
73 | + debugDocumentVersioning = "YES" | ||
74 | + allowLocationSimulation = "YES"> | ||
75 | + <BuildableProductRunnable | ||
76 | + runnableDebuggingMode = "0"> | ||
77 | + <BuildableReference | ||
78 | + BuildableIdentifier = "primary" | ||
79 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
80 | + BuildableName = "Demo.app" | ||
81 | + BlueprintName = "Demo" | ||
82 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
83 | + </BuildableReference> | ||
84 | + </BuildableProductRunnable> | ||
85 | + <AdditionalOptions> | ||
86 | + </AdditionalOptions> | ||
87 | + </LaunchAction> | ||
88 | + <ProfileAction | ||
89 | + shouldUseLaunchSchemeArgsEnv = "YES" | ||
90 | + savedToolIdentifier = "" | ||
91 | + useCustomWorkingDirectory = "NO" | ||
92 | + buildConfiguration = "Release" | ||
93 | + debugDocumentVersioning = "YES"> | ||
94 | + <BuildableProductRunnable | ||
95 | + runnableDebuggingMode = "0"> | ||
96 | + <BuildableReference | ||
97 | + BuildableIdentifier = "primary" | ||
98 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
99 | + BuildableName = "Demo.app" | ||
100 | + BlueprintName = "Demo" | ||
101 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
102 | + </BuildableReference> | ||
103 | + </BuildableProductRunnable> | ||
104 | + </ProfileAction> | ||
105 | + <AnalyzeAction | ||
106 | + buildConfiguration = "Debug"> | ||
107 | + </AnalyzeAction> | ||
108 | + <ArchiveAction | ||
109 | + buildConfiguration = "Release" | ||
110 | + revealArchiveInOrganizer = "YES"> | ||
111 | + </ArchiveAction> | ||
112 | +</Scheme> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>SchemeUserState</key> | ||
6 | + <dict> | ||
7 | + <key>Demo.xcscheme</key> | ||
8 | + <dict> | ||
9 | + <key>orderHint</key> | ||
10 | + <integer>0</integer> | ||
11 | + </dict> | ||
12 | + </dict> | ||
13 | + <key>SuppressBuildableAutocreation</key> | ||
14 | + <dict> | ||
15 | + <key>BB5F3C871C1811BC00DA339D</key> | ||
16 | + <dict> | ||
17 | + <key>primary</key> | ||
18 | + <true/> | ||
19 | + </dict> | ||
20 | + <key>BB5F3CA01C1811BC00DA339D</key> | ||
21 | + <dict> | ||
22 | + <key>primary</key> | ||
23 | + <true/> | ||
24 | + </dict> | ||
25 | + </dict> | ||
26 | +</dict> | ||
27 | +</plist> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Bucket | ||
3 | + type = "1" | ||
4 | + version = "2.0"> | ||
5 | + <Breakpoints> | ||
6 | + <BreakpointProxy | ||
7 | + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> | ||
8 | + <BreakpointContent | ||
9 | + shouldBeEnabled = "No" | ||
10 | + ignoreCount = "0" | ||
11 | + continueAfterRunningActions = "No" | ||
12 | + filePath = "Demo/SDKInterface.h" | ||
13 | + timestampString = "474775745.083759" | ||
14 | + startingColumnNumber = "9223372036854775807" | ||
15 | + endingColumnNumber = "9223372036854775807" | ||
16 | + startingLineNumber = "9" | ||
17 | + endingLineNumber = "9" | ||
18 | + landmarkName = "@interface SDKInterface" | ||
19 | + landmarkType = "2"> | ||
20 | + </BreakpointContent> | ||
21 | + </BreakpointProxy> | ||
22 | + </Breakpoints> | ||
23 | +</Bucket> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Scheme | ||
3 | + LastUpgradeVersion = "0700" | ||
4 | + version = "1.3"> | ||
5 | + <BuildAction | ||
6 | + parallelizeBuildables = "YES" | ||
7 | + buildImplicitDependencies = "YES"> | ||
8 | + <BuildActionEntries> | ||
9 | + <BuildActionEntry | ||
10 | + buildForTesting = "YES" | ||
11 | + buildForRunning = "YES" | ||
12 | + buildForProfiling = "YES" | ||
13 | + buildForArchiving = "YES" | ||
14 | + buildForAnalyzing = "YES"> | ||
15 | + <BuildableReference | ||
16 | + BuildableIdentifier = "primary" | ||
17 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
18 | + BuildableName = "Demo.app" | ||
19 | + BlueprintName = "Demo" | ||
20 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
21 | + </BuildableReference> | ||
22 | + </BuildActionEntry> | ||
23 | + </BuildActionEntries> | ||
24 | + </BuildAction> | ||
25 | + <TestAction | ||
26 | + buildConfiguration = "Debug" | ||
27 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
28 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
29 | + shouldUseLaunchSchemeArgsEnv = "YES"> | ||
30 | + <Testables> | ||
31 | + <TestableReference | ||
32 | + skipped = "NO"> | ||
33 | + <BuildableReference | ||
34 | + BuildableIdentifier = "primary" | ||
35 | + BlueprintIdentifier = "BB5F3CA01C1811BC00DA339D" | ||
36 | + BuildableName = "DemoTests.xctest" | ||
37 | + BlueprintName = "DemoTests" | ||
38 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
39 | + </BuildableReference> | ||
40 | + </TestableReference> | ||
41 | + </Testables> | ||
42 | + <MacroExpansion> | ||
43 | + <BuildableReference | ||
44 | + BuildableIdentifier = "primary" | ||
45 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
46 | + BuildableName = "Demo.app" | ||
47 | + BlueprintName = "Demo" | ||
48 | + ReferencedContainer = "container:Demo_play800.xcodeproj"> | ||
49 | + </BuildableReference> | ||
50 | + </MacroExpansion> | ||
51 | + <AdditionalOptions> | ||
52 | + </AdditionalOptions> | ||
53 | + </TestAction> | ||
54 | + <LaunchAction | ||
55 | + buildConfiguration = "Debug" | ||
56 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
57 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
58 | + launchStyle = "0" | ||
59 | + useCustomWorkingDirectory = "NO" | ||
60 | + ignoresPersistentStateOnLaunch = "NO" | ||
61 | + debugDocumentVersioning = "YES" | ||
62 | + debugServiceExtension = "internal" | ||
63 | + allowLocationSimulation = "YES"> | ||
64 | + <BuildableProductRunnable | ||
65 | + runnableDebuggingMode = "0"> | ||
66 | + <BuildableReference | ||
67 | + BuildableIdentifier = "primary" | ||
68 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
69 | + BuildableName = "Demo.app" | ||
70 | + BlueprintName = "Demo" | ||
71 | + ReferencedContainer = "container:Demo_play800.xcodeproj"> | ||
72 | + </BuildableReference> | ||
73 | + </BuildableProductRunnable> | ||
74 | + <AdditionalOptions> | ||
75 | + </AdditionalOptions> | ||
76 | + </LaunchAction> | ||
77 | + <ProfileAction | ||
78 | + buildConfiguration = "Release" | ||
79 | + shouldUseLaunchSchemeArgsEnv = "YES" | ||
80 | + savedToolIdentifier = "" | ||
81 | + useCustomWorkingDirectory = "NO" | ||
82 | + debugDocumentVersioning = "YES"> | ||
83 | + <BuildableProductRunnable | ||
84 | + runnableDebuggingMode = "0"> | ||
85 | + <BuildableReference | ||
86 | + BuildableIdentifier = "primary" | ||
87 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
88 | + BuildableName = "Demo.app" | ||
89 | + BlueprintName = "Demo" | ||
90 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
91 | + </BuildableReference> | ||
92 | + </BuildableProductRunnable> | ||
93 | + </ProfileAction> | ||
94 | + <AnalyzeAction | ||
95 | + buildConfiguration = "Debug"> | ||
96 | + </AnalyzeAction> | ||
97 | + <ArchiveAction | ||
98 | + buildConfiguration = "Release" | ||
99 | + revealArchiveInOrganizer = "YES"> | ||
100 | + </ArchiveAction> | ||
101 | +</Scheme> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>SchemeUserState</key> | ||
6 | + <dict> | ||
7 | + <key>Demo.xcscheme</key> | ||
8 | + <dict> | ||
9 | + <key>orderHint</key> | ||
10 | + <integer>0</integer> | ||
11 | + </dict> | ||
12 | + </dict> | ||
13 | + <key>SuppressBuildableAutocreation</key> | ||
14 | + <dict> | ||
15 | + <key>BB5F3C871C1811BC00DA339D</key> | ||
16 | + <dict> | ||
17 | + <key>primary</key> | ||
18 | + <true/> | ||
19 | + </dict> | ||
20 | + <key>BB5F3CA01C1811BC00DA339D</key> | ||
21 | + <dict> | ||
22 | + <key>primary</key> | ||
23 | + <true/> | ||
24 | + </dict> | ||
25 | + </dict> | ||
26 | +</dict> | ||
27 | +</plist> |
1 | +// !$*UTF8*$! | ||
2 | +{ | ||
3 | + archiveVersion = 1; | ||
4 | + classes = { | ||
5 | + }; | ||
6 | + objectVersion = 46; | ||
7 | + objects = { | ||
8 | + | ||
9 | +/* Begin PBXBuildFile section */ | ||
10 | + 00ED411ABD0B426880B101D7 /* libc++.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E984069BEA942145F157BA0 /* libc++.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
11 | + 055B4E74A0E1D0A362C40F1B /* QYGameSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15574824A11223CBB9D1D8EE /* QYGameSDK.framework */; }; | ||
12 | + 05D04F299E662535A9DFBDAF /* AppleIap.m in Sources */ = {isa = PBXBuildFile; fileRef = 36544DBAA62CEBB313C92D3A /* AppleIap.m */; }; | ||
13 | + 08554FFEBF30A06D1A90B306 /* QYGameSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15574824A11223CBB9D1D8EE /* QYGameSDK.framework */; }; | ||
14 | + 0DD84DCE951921AF3C8918B4 /* QYGameSDK.bundle in Resources */ = {isa = PBXBuildFile; fileRef = F1004ED7B5BB76E8B9C8130A /* QYGameSDK.bundle */; }; | ||
15 | + 28B24CB6A081625DE08061F7 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 52B24D53B8475C78BBA761CB /* Info.plist */; }; | ||
16 | + 33B74DFF8036BBBBF4437716 /* IAPShare.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E214225ACAED044B48FE926 /* IAPShare.m */; }; | ||
17 | + 44F048EBBCDA6364C0594F75 /* IAPHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 874C46758FFCBB88B7031B42 /* IAPHelper.m */; }; | ||
18 | + 49BC4611A7BDF894F4027344 /* pool_setting in Resources */ = {isa = PBXBuildFile; fileRef = BDBD484281B34761A4799C2C /* pool_setting */; }; | ||
19 | + 4EF64CED9DDE0EE30F8379FE /* QYGameSDK.bundle in Resources */ = {isa = PBXBuildFile; fileRef = F1004ED7B5BB76E8B9C8130A /* QYGameSDK.bundle */; }; | ||
20 | + 4F3546A69FCB92B2CD5AF4A7 /* AppleIap.m in Sources */ = {isa = PBXBuildFile; fileRef = 36544DBAA62CEBB313C92D3A /* AppleIap.m */; }; | ||
21 | + 53284282BB7D5CFF54D809A9 /* IAPHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 874C46758FFCBB88B7031B42 /* IAPHelper.m */; }; | ||
22 | + 5A8C4FF0AD7A038290460F42 /* IAPShare.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E214225ACAED044B48FE926 /* IAPShare.m */; }; | ||
23 | + 5CB94776B81A8546E2087FB0 /* NSString+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F0B4ABE96C1160EC3CD2387 /* NSString+Base64.m */; }; | ||
24 | + 60E0418FA45110BCD738E7AC /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DBA2400187320F26ABB6BD25 /* libz.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
25 | + 62BB40048F58BF831FCFA061 /* SFHFKeychainUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A7540E69560C577F77690F8 /* SFHFKeychainUtils.m */; }; | ||
26 | + 64924775A22BC91855BA6C0E /* KeychainAccessGroups.plist in Resources */ = {isa = PBXBuildFile; fileRef = 04E74CD9829D943EEAF57513 /* KeychainAccessGroups.plist */; }; | ||
27 | + 679D450088CAA685ABDFC594 /* ReYunTrack.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 39BA47359BA7237E622A0E4D /* ReYunTrack.a */; }; | ||
28 | + 698948CE8A09FCBB43B26568 /* qyUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = AC374BA18A28D1FF46EDCBE9 /* qyUtils.m */; }; | ||
29 | + 7EE549C5B985FB2B881E06F1 /* SDKInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = E3E047ECB40028DAEB2AF850 /* SDKInterface.m */; }; | ||
30 | + 812D453CB5E596D4C19B1C16 /* qyUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = AC374BA18A28D1FF46EDCBE9 /* qyUtils.m */; }; | ||
31 | + 8425EC1A1F0E3CBD00B0D868 /* PoolSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8425EC191F0E3CBD00B0D868 /* PoolSdk.framework */; settings = {ASSET_TAGS = (); }; }; | ||
32 | + 847EE5E21EE9007E003A4B7B /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 847EE5E11EE9007E003A4B7B /* MainViewController.m */; settings = {ASSET_TAGS = (); }; }; | ||
33 | + 8484E4F51EE7E0DC00B402D1 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8484E4F21EE7E0DC00B402D1 /* AppDelegate.m */; settings = {ASSET_TAGS = (); }; }; | ||
34 | + 8484E4F61EE7E0DC00B402D1 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8484E4F41EE7E0DC00B402D1 /* ViewController.m */; settings = {ASSET_TAGS = (); }; }; | ||
35 | + 8484E4FC1EE7E1D800B402D1 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E4FB1EE7E1D800B402D1 /* libsqlite3.dylib */; }; | ||
36 | + 8484E4FE1EE7E1F700B402D1 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E4FD1EE7E1F700B402D1 /* CoreTelephony.framework */; }; | ||
37 | + 8484E5001EE7E20C00B402D1 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E4FF1EE7E20C00B402D1 /* CFNetwork.framework */; }; | ||
38 | + 8484E5021EE7E21F00B402D1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5011EE7E21F00B402D1 /* UIKit.framework */; }; | ||
39 | + 8484E5041EE7E24400B402D1 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5031EE7E24400B402D1 /* StoreKit.framework */; }; | ||
40 | + 8484E5061EE7E24A00B402D1 /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5051EE7E24A00B402D1 /* CoreMotion.framework */; }; | ||
41 | + 8484E5081EE7E25600B402D1 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5071EE7E25600B402D1 /* CoreText.framework */; }; | ||
42 | + 8484E50A1EE7E26200B402D1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5091EE7E26200B402D1 /* Security.framework */; }; | ||
43 | + 8484E50C1EE7E27100B402D1 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E50B1EE7E27100B402D1 /* CoreGraphics.framework */; }; | ||
44 | + 8484E50E1EE7E28000B402D1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E50D1EE7E28000B402D1 /* QuartzCore.framework */; }; | ||
45 | + 8484E5101EE7E29A00B402D1 /* libc++.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E50F1EE7E29A00B402D1 /* libc++.1.dylib */; }; | ||
46 | + 8484E5121EE7E2B800B402D1 /* libz.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5111EE7E2B800B402D1 /* libz.1.dylib */; }; | ||
47 | + 8484E5141EE7E2DE00B402D1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5131EE7E2DE00B402D1 /* Foundation.framework */; }; | ||
48 | + 8484E5161EE7E36800B402D1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5151EE7E36800B402D1 /* SystemConfiguration.framework */; }; | ||
49 | + 86234DA0B00E02E158BFA711 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 52B24D53B8475C78BBA761CB /* Info.plist */; }; | ||
50 | + 88754BCA9E81E8C7970224A0 /* p2y9y_private.plist in Resources */ = {isa = PBXBuildFile; fileRef = D7E34CDF8B1D29BAC01E9E19 /* p2y9y_private.plist */; }; | ||
51 | + 8FE34560B3120BDD939C8E94 /* libc++.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E984069BEA942145F157BA0 /* libc++.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
52 | + B1754F38957F9964DE899FF9 /* SDKInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = E3E047ECB40028DAEB2AF850 /* SDKInterface.m */; }; | ||
53 | + BB5F3C8E1C1811BC00DA339D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BB5F3C8D1C1811BC00DA339D /* main.m */; }; | ||
54 | + BB5F3C971C1811BC00DA339D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BB5F3C951C1811BC00DA339D /* Main.storyboard */; }; | ||
55 | + BB5F3C9C1C1811BC00DA339D /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB5F3C9A1C1811BC00DA339D /* LaunchScreen.xib */; }; | ||
56 | + BB5F3CA81C1811BC00DA339D /* DemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BB5F3CA71C1811BC00DA339D /* DemoTests.m */; }; | ||
57 | + C33642EF934E05A46D4BCF0D /* KeychainAccessGroups.plist in Resources */ = {isa = PBXBuildFile; fileRef = 04E74CD9829D943EEAF57513 /* KeychainAccessGroups.plist */; }; | ||
58 | + C6AE4075A91CDC778FAD02B5 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DBA2400187320F26ABB6BD25 /* libz.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
59 | + CBB24CA78BE8527437FB3FA6 /* NSString+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F0B4ABE96C1160EC3CD2387 /* NSString+Base64.m */; }; | ||
60 | + CDAB48FE92FF7F6A03C1329A /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF4567A2F6514A38657FC9 /* AdSupport.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
61 | + D08D40B8A871D0B9E76D6218 /* pool_setting in Resources */ = {isa = PBXBuildFile; fileRef = BDBD484281B34761A4799C2C /* pool_setting */; }; | ||
62 | + F00A4BD3AB498078181BF2C4 /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF4567A2F6514A38657FC9 /* AdSupport.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
63 | + F3CD4B5D867341B41D796511 /* SFHFKeychainUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A7540E69560C577F77690F8 /* SFHFKeychainUtils.m */; }; | ||
64 | + F4EF4980A8658303408DF4C1 /* ReYunTrack.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 39BA47359BA7237E622A0E4D /* ReYunTrack.a */; }; | ||
65 | + FECC456CBA21A0B67FC4AA28 /* p2y9y_private.plist in Resources */ = {isa = PBXBuildFile; fileRef = D7E34CDF8B1D29BAC01E9E19 /* p2y9y_private.plist */; }; | ||
66 | +/* End PBXBuildFile section */ | ||
67 | + | ||
68 | +/* Begin PBXContainerItemProxy section */ | ||
69 | + BB5F3CA21C1811BC00DA339D /* PBXContainerItemProxy */ = { | ||
70 | + isa = PBXContainerItemProxy; | ||
71 | + containerPortal = BB5F3C801C1811BC00DA339D /* Project object */; | ||
72 | + proxyType = 1; | ||
73 | + remoteGlobalIDString = BB5F3C871C1811BC00DA339D; | ||
74 | + remoteInfo = Demo; | ||
75 | + }; | ||
76 | +/* End PBXContainerItemProxy section */ | ||
77 | + | ||
78 | +/* Begin PBXCopyFilesBuildPhase section */ | ||
79 | + 84398BFB1C4C83EC0082D774 /* Embed Frameworks */ = { | ||
80 | + isa = PBXCopyFilesBuildPhase; | ||
81 | + buildActionMask = 2147483647; | ||
82 | + dstPath = ""; | ||
83 | + dstSubfolderSpec = 10; | ||
84 | + files = ( | ||
85 | + ); | ||
86 | + name = "Embed Frameworks"; | ||
87 | + runOnlyForDeploymentPostprocessing = 0; | ||
88 | + }; | ||
89 | +/* End PBXCopyFilesBuildPhase section */ | ||
90 | + | ||
91 | +/* Begin PBXFileReference section */ | ||
92 | + 04E74CD9829D943EEAF57513 /* KeychainAccessGroups.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = KeychainAccessGroups.plist; path = poolsdk_file/poolsdk_qianyou/SDK/KeychainAccessGroups.plist; sourceTree = SOURCE_ROOT; }; | ||
93 | + 11A648F09EAAAAC3049109A8 /* NSString+Base64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "NSString+Base64.h"; path = "poolsdk_file/poolsdk_qianyou/SDK/iaphelper/NSString+Base64.h"; sourceTree = SOURCE_ROOT; }; | ||
94 | + 15574824A11223CBB9D1D8EE /* QYGameSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QYGameSDK.framework; path = poolsdk_file/poolsdk_qianyou/SDK/QYGameSDK.framework; sourceTree = SOURCE_ROOT; }; | ||
95 | + 173C4351892F18A915D09FB4 /* qyUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = qyUtils.h; path = poolsdk_file/poolsdk_qianyou/SDK/qyUtils.h; sourceTree = SOURCE_ROOT; }; | ||
96 | + 1A7540E69560C577F77690F8 /* SFHFKeychainUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SFHFKeychainUtils.m; path = poolsdk_file/poolsdk_qianyou/SDK/iaphelper/SFHFKeychainUtils.m; sourceTree = SOURCE_ROOT; }; | ||
97 | + 31104845AD4F24C62AEA09CA /* ReYunTrack.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ReYunTrack.h; path = poolsdk_file/poolsdk_qianyou/SDK/ReYunTrack.h; sourceTree = SOURCE_ROOT; }; | ||
98 | + 36544DBAA62CEBB313C92D3A /* AppleIap.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppleIap.m; path = poolsdk_file/poolsdk_qianyou/SDK/AppleIap.m; sourceTree = SOURCE_ROOT; }; | ||
99 | + 39BA47359BA7237E622A0E4D /* ReYunTrack.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = ReYunTrack.a; path = poolsdk_file/poolsdk_qianyou/SDK/ReYunTrack.a; sourceTree = SOURCE_ROOT; }; | ||
100 | + 3E214225ACAED044B48FE926 /* IAPShare.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = IAPShare.m; path = poolsdk_file/poolsdk_qianyou/SDK/iaphelper/IAPShare.m; sourceTree = SOURCE_ROOT; }; | ||
101 | + 52B24D53B8475C78BBA761CB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = poolsdk_file/poolsdk_qianyou/SDK/Info.plist; sourceTree = SOURCE_ROOT; }; | ||
102 | + 7716471A9268C6D1C09AAFD3 /* AppleIap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppleIap.h; path = poolsdk_file/poolsdk_qianyou/SDK/AppleIap.h; sourceTree = SOURCE_ROOT; }; | ||
103 | + 7E984069BEA942145F157BA0 /* libc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.dylib"; path = "/usr/lib/libc++.dylib"; sourceTree = "<absolute>"; }; | ||
104 | + 7F0B4ABE96C1160EC3CD2387 /* NSString+Base64.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "NSString+Base64.m"; path = "poolsdk_file/poolsdk_qianyou/SDK/iaphelper/NSString+Base64.m"; sourceTree = SOURCE_ROOT; }; | ||
105 | + 80484C4EB439A887361D8A39 /* SDKInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDKInterface.h; path = poolsdk_file/poolsdk_qianyou/SDK/SDKInterface.h; sourceTree = SOURCE_ROOT; }; | ||
106 | + 8425EC191F0E3CBD00B0D868 /* PoolSdk.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = PoolSdk.framework; sourceTree = "<group>"; }; | ||
107 | + 847EE5E01EE9007E003A4B7B /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = "<group>"; }; | ||
108 | + 847EE5E11EE9007E003A4B7B /* MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainViewController.m; sourceTree = "<group>"; }; | ||
109 | + 8484E4F11EE7E0DC00B402D1 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; }; | ||
110 | + 8484E4F21EE7E0DC00B402D1 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; }; | ||
111 | + 8484E4F31EE7E0DC00B402D1 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; }; | ||
112 | + 8484E4F41EE7E0DC00B402D1 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; }; | ||
113 | + 8484E4FB1EE7E1D800B402D1 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = ../../../../../../../../usr/lib/libsqlite3.dylib; sourceTree = "<group>"; }; | ||
114 | + 8484E4FD1EE7E1F700B402D1 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; | ||
115 | + 8484E4FF1EE7E20C00B402D1 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; | ||
116 | + 8484E5011EE7E21F00B402D1 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; | ||
117 | + 8484E5031EE7E24400B402D1 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; | ||
118 | + 8484E5051EE7E24A00B402D1 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; | ||
119 | + 8484E5071EE7E25600B402D1 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; | ||
120 | + 8484E5091EE7E26200B402D1 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; | ||
121 | + 8484E50B1EE7E27100B402D1 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; | ||
122 | + 8484E50D1EE7E28000B402D1 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; | ||
123 | + 8484E50F1EE7E29A00B402D1 /* libc++.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.1.dylib"; path = "../../../../../../../../usr/lib/libc++.1.dylib"; sourceTree = "<group>"; }; | ||
124 | + 8484E5111EE7E2B800B402D1 /* libz.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.1.dylib; path = ../../../../../../../../usr/lib/libz.1.dylib; sourceTree = "<group>"; }; | ||
125 | + 8484E5131EE7E2DE00B402D1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; | ||
126 | + 8484E5151EE7E36800B402D1 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; | ||
127 | + 874C46758FFCBB88B7031B42 /* IAPHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = IAPHelper.m; path = poolsdk_file/poolsdk_qianyou/SDK/iaphelper/IAPHelper.m; sourceTree = SOURCE_ROOT; }; | ||
128 | + AC374BA18A28D1FF46EDCBE9 /* qyUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = qyUtils.m; path = poolsdk_file/poolsdk_qianyou/SDK/qyUtils.m; sourceTree = SOURCE_ROOT; }; | ||
129 | + AC4E46BC8E52A487FB748229 /* IAPShare.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IAPShare.h; path = poolsdk_file/poolsdk_qianyou/SDK/iaphelper/IAPShare.h; sourceTree = SOURCE_ROOT; }; | ||
130 | + B1CF4567A2F6514A38657FC9 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; }; | ||
131 | + BB5F3C881C1811BC00DA339D /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
132 | + BB5F3C8D1C1811BC00DA339D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; | ||
133 | + BB5F3C961C1811BC00DA339D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; | ||
134 | + BB5F3C9B1C1811BC00DA339D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; }; | ||
135 | + BB5F3CA11C1811BC00DA339D /* DemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
136 | + BB5F3CA61C1811BC00DA339D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | ||
137 | + BB5F3CA71C1811BC00DA339D /* DemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoTests.m; sourceTree = "<group>"; }; | ||
138 | + BDBD484281B34761A4799C2C /* pool_setting */ = {isa = PBXFileReference; lastKnownFileType = "?"; name = pool_setting; path = poolsdk_file/poolsdk_qianyou/SDK/pool_setting; sourceTree = SOURCE_ROOT; }; | ||
139 | + C4DE49828AD373CB12607318 /* SFHFKeychainUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SFHFKeychainUtils.h; path = poolsdk_file/poolsdk_qianyou/SDK/iaphelper/SFHFKeychainUtils.h; sourceTree = SOURCE_ROOT; }; | ||
140 | + D471429BB881D0FC1376867A /* IAPHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IAPHelper.h; path = poolsdk_file/poolsdk_qianyou/SDK/iaphelper/IAPHelper.h; sourceTree = SOURCE_ROOT; }; | ||
141 | + D7E34CDF8B1D29BAC01E9E19 /* p2y9y_private.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = p2y9y_private.plist; path = poolsdk_file/poolsdk_qianyou/SDK/p2y9y_private.plist; sourceTree = SOURCE_ROOT; }; | ||
142 | + DBA2400187320F26ABB6BD25 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = "<absolute>"; }; | ||
143 | + E3E047ECB40028DAEB2AF850 /* SDKInterface.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDKInterface.m; path = poolsdk_file/poolsdk_qianyou/SDK/SDKInterface.m; sourceTree = SOURCE_ROOT; }; | ||
144 | + F1004ED7B5BB76E8B9C8130A /* QYGameSDK.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = QYGameSDK.bundle; path = poolsdk_file/poolsdk_qianyou/SDK/QYGameSDK.bundle; sourceTree = SOURCE_ROOT; }; | ||
145 | +/* End PBXFileReference section */ | ||
146 | + | ||
147 | +/* Begin PBXFrameworksBuildPhase section */ | ||
148 | + BB5F3C851C1811BC00DA339D /* Frameworks */ = { | ||
149 | + isa = PBXFrameworksBuildPhase; | ||
150 | + buildActionMask = 2147483647; | ||
151 | + files = ( | ||
152 | + 8484E5161EE7E36800B402D1 /* SystemConfiguration.framework in Frameworks */, | ||
153 | + 8484E4FC1EE7E1D800B402D1 /* libsqlite3.dylib in Frameworks */, | ||
154 | + 8484E5121EE7E2B800B402D1 /* libz.1.dylib in Frameworks */, | ||
155 | + 8484E5101EE7E29A00B402D1 /* libc++.1.dylib in Frameworks */, | ||
156 | + 8484E5001EE7E20C00B402D1 /* CFNetwork.framework in Frameworks */, | ||
157 | + 8484E5061EE7E24A00B402D1 /* CoreMotion.framework in Frameworks */, | ||
158 | + 8484E5021EE7E21F00B402D1 /* UIKit.framework in Frameworks */, | ||
159 | + 8484E50C1EE7E27100B402D1 /* CoreGraphics.framework in Frameworks */, | ||
160 | + 8484E5081EE7E25600B402D1 /* CoreText.framework in Frameworks */, | ||
161 | + 8484E50E1EE7E28000B402D1 /* QuartzCore.framework in Frameworks */, | ||
162 | + 8484E5141EE7E2DE00B402D1 /* Foundation.framework in Frameworks */, | ||
163 | + 8484E50A1EE7E26200B402D1 /* Security.framework in Frameworks */, | ||
164 | + 8484E5041EE7E24400B402D1 /* StoreKit.framework in Frameworks */, | ||
165 | + 8425EC1A1F0E3CBD00B0D868 /* PoolSdk.framework in Frameworks */, | ||
166 | + 8484E4FE1EE7E1F700B402D1 /* CoreTelephony.framework in Frameworks */, | ||
167 | + 679D450088CAA685ABDFC594 /* ReYunTrack.a in Frameworks */, | ||
168 | + 055B4E74A0E1D0A362C40F1B /* QYGameSDK.framework in Frameworks */, | ||
169 | + F00A4BD3AB498078181BF2C4 /* AdSupport.framework in Frameworks */, | ||
170 | + 60E0418FA45110BCD738E7AC /* libz.dylib in Frameworks */, | ||
171 | + 00ED411ABD0B426880B101D7 /* libc++.dylib in Frameworks */, | ||
172 | + ); | ||
173 | + runOnlyForDeploymentPostprocessing = 0; | ||
174 | + }; | ||
175 | + BB5F3C9E1C1811BC00DA339D /* Frameworks */ = { | ||
176 | + isa = PBXFrameworksBuildPhase; | ||
177 | + buildActionMask = 2147483647; | ||
178 | + files = ( | ||
179 | + F4EF4980A8658303408DF4C1 /* ReYunTrack.a in Frameworks */, | ||
180 | + 08554FFEBF30A06D1A90B306 /* QYGameSDK.framework in Frameworks */, | ||
181 | + CDAB48FE92FF7F6A03C1329A /* AdSupport.framework in Frameworks */, | ||
182 | + C6AE4075A91CDC778FAD02B5 /* libz.dylib in Frameworks */, | ||
183 | + 8FE34560B3120BDD939C8E94 /* libc++.dylib in Frameworks */, | ||
184 | + ); | ||
185 | + runOnlyForDeploymentPostprocessing = 0; | ||
186 | + }; | ||
187 | +/* End PBXFrameworksBuildPhase section */ | ||
188 | + | ||
189 | +/* Begin PBXGroup section */ | ||
190 | + 131D468BAB1053B0BA2A87B0 /* Frameworks */ = { | ||
191 | + isa = PBXGroup; | ||
192 | + children = ( | ||
193 | + B1CF4567A2F6514A38657FC9 /* AdSupport.framework */, | ||
194 | + ); | ||
195 | + name = Frameworks; | ||
196 | + sourceTree = "<group>"; | ||
197 | + }; | ||
198 | + 2DD240129D2AA24D5E28005F /* SDK */ = { | ||
199 | + isa = PBXGroup; | ||
200 | + children = ( | ||
201 | + BDBD484281B34761A4799C2C /* pool_setting */, | ||
202 | + D7E34CDF8B1D29BAC01E9E19 /* p2y9y_private.plist */, | ||
203 | + 31104845AD4F24C62AEA09CA /* ReYunTrack.h */, | ||
204 | + 52B24D53B8475C78BBA761CB /* Info.plist */, | ||
205 | + 173C4351892F18A915D09FB4 /* qyUtils.h */, | ||
206 | + 39BA47359BA7237E622A0E4D /* ReYunTrack.a */, | ||
207 | + 7716471A9268C6D1C09AAFD3 /* AppleIap.h */, | ||
208 | + AC374BA18A28D1FF46EDCBE9 /* qyUtils.m */, | ||
209 | + E3E047ECB40028DAEB2AF850 /* SDKInterface.m */, | ||
210 | + 04E74CD9829D943EEAF57513 /* KeychainAccessGroups.plist */, | ||
211 | + 36544DBAA62CEBB313C92D3A /* AppleIap.m */, | ||
212 | + 80484C4EB439A887361D8A39 /* SDKInterface.h */, | ||
213 | + A3404A019DF6FDD4B6170E49 /* iaphelper */, | ||
214 | + F1004ED7B5BB76E8B9C8130A /* QYGameSDK.bundle */, | ||
215 | + 15574824A11223CBB9D1D8EE /* QYGameSDK.framework */, | ||
216 | + ); | ||
217 | + name = SDK; | ||
218 | + path = poolsdk_file/poolsdk_qianyou/SDK; | ||
219 | + sourceTree = SOURCE_ROOT; | ||
220 | + }; | ||
221 | + 8476DF631C4DD70500EC42BA /* poolsdk_file */ = { | ||
222 | + isa = PBXGroup; | ||
223 | + children = ( | ||
224 | + ); | ||
225 | + name = poolsdk_file; | ||
226 | + sourceTree = "<group>"; | ||
227 | + }; | ||
228 | + A3404A019DF6FDD4B6170E49 /* iaphelper */ = { | ||
229 | + isa = PBXGroup; | ||
230 | + children = ( | ||
231 | + 874C46758FFCBB88B7031B42 /* IAPHelper.m */, | ||
232 | + C4DE49828AD373CB12607318 /* SFHFKeychainUtils.h */, | ||
233 | + D471429BB881D0FC1376867A /* IAPHelper.h */, | ||
234 | + 1A7540E69560C577F77690F8 /* SFHFKeychainUtils.m */, | ||
235 | + 7F0B4ABE96C1160EC3CD2387 /* NSString+Base64.m */, | ||
236 | + 11A648F09EAAAAC3049109A8 /* NSString+Base64.h */, | ||
237 | + AC4E46BC8E52A487FB748229 /* IAPShare.h */, | ||
238 | + 3E214225ACAED044B48FE926 /* IAPShare.m */, | ||
239 | + ); | ||
240 | + name = iaphelper; | ||
241 | + path = poolsdk_file/poolsdk_qianyou/SDK/iaphelper; | ||
242 | + sourceTree = SOURCE_ROOT; | ||
243 | + }; | ||
244 | + BB5F3C7F1C1811BC00DA339D = { | ||
245 | + isa = PBXGroup; | ||
246 | + children = ( | ||
247 | + 8484E5151EE7E36800B402D1 /* SystemConfiguration.framework */, | ||
248 | + 8484E5131EE7E2DE00B402D1 /* Foundation.framework */, | ||
249 | + 8484E5111EE7E2B800B402D1 /* libz.1.dylib */, | ||
250 | + 8484E50F1EE7E29A00B402D1 /* libc++.1.dylib */, | ||
251 | + 8484E50D1EE7E28000B402D1 /* QuartzCore.framework */, | ||
252 | + 8484E50B1EE7E27100B402D1 /* CoreGraphics.framework */, | ||
253 | + 8484E5091EE7E26200B402D1 /* Security.framework */, | ||
254 | + 8484E5071EE7E25600B402D1 /* CoreText.framework */, | ||
255 | + 8484E5051EE7E24A00B402D1 /* CoreMotion.framework */, | ||
256 | + 8484E5031EE7E24400B402D1 /* StoreKit.framework */, | ||
257 | + 8484E5011EE7E21F00B402D1 /* UIKit.framework */, | ||
258 | + 8484E4FF1EE7E20C00B402D1 /* CFNetwork.framework */, | ||
259 | + 8484E4FD1EE7E1F700B402D1 /* CoreTelephony.framework */, | ||
260 | + 8484E4FB1EE7E1D800B402D1 /* libsqlite3.dylib */, | ||
261 | + 8476DF631C4DD70500EC42BA /* poolsdk_file */, | ||
262 | + BB5F3C8A1C1811BC00DA339D /* Demo */, | ||
263 | + BB5F3CA41C1811BC00DA339D /* DemoTests */, | ||
264 | + BB5F3C891C1811BC00DA339D /* Products */, | ||
265 | + 2DD240129D2AA24D5E28005F /* SDK */, | ||
266 | + 131D468BAB1053B0BA2A87B0 /* Frameworks */, | ||
267 | + C47346B2A89A2ADCE6E06B2C /* Libraries */, | ||
268 | + ); | ||
269 | + sourceTree = "<group>"; | ||
270 | + }; | ||
271 | + BB5F3C891C1811BC00DA339D /* Products */ = { | ||
272 | + isa = PBXGroup; | ||
273 | + children = ( | ||
274 | + BB5F3C881C1811BC00DA339D /* Demo.app */, | ||
275 | + BB5F3CA11C1811BC00DA339D /* DemoTests.xctest */, | ||
276 | + ); | ||
277 | + name = Products; | ||
278 | + sourceTree = "<group>"; | ||
279 | + }; | ||
280 | + BB5F3C8A1C1811BC00DA339D /* Demo */ = { | ||
281 | + isa = PBXGroup; | ||
282 | + children = ( | ||
283 | + 8425EC191F0E3CBD00B0D868 /* PoolSdk.framework */, | ||
284 | + 8484E4F11EE7E0DC00B402D1 /* AppDelegate.h */, | ||
285 | + 8484E4F21EE7E0DC00B402D1 /* AppDelegate.m */, | ||
286 | + 8484E4F31EE7E0DC00B402D1 /* ViewController.h */, | ||
287 | + 8484E4F41EE7E0DC00B402D1 /* ViewController.m */, | ||
288 | + 847EE5E01EE9007E003A4B7B /* MainViewController.h */, | ||
289 | + 847EE5E11EE9007E003A4B7B /* MainViewController.m */, | ||
290 | + BB5F3C951C1811BC00DA339D /* Main.storyboard */, | ||
291 | + BB5F3C9A1C1811BC00DA339D /* LaunchScreen.xib */, | ||
292 | + BB5F3C8B1C1811BC00DA339D /* Supporting Files */, | ||
293 | + ); | ||
294 | + path = Demo; | ||
295 | + sourceTree = "<group>"; | ||
296 | + }; | ||
297 | + BB5F3C8B1C1811BC00DA339D /* Supporting Files */ = { | ||
298 | + isa = PBXGroup; | ||
299 | + children = ( | ||
300 | + BB5F3C8D1C1811BC00DA339D /* main.m */, | ||
301 | + ); | ||
302 | + name = "Supporting Files"; | ||
303 | + sourceTree = "<group>"; | ||
304 | + }; | ||
305 | + BB5F3CA41C1811BC00DA339D /* DemoTests */ = { | ||
306 | + isa = PBXGroup; | ||
307 | + children = ( | ||
308 | + BB5F3CA71C1811BC00DA339D /* DemoTests.m */, | ||
309 | + BB5F3CA51C1811BC00DA339D /* Supporting Files */, | ||
310 | + ); | ||
311 | + path = DemoTests; | ||
312 | + sourceTree = "<group>"; | ||
313 | + }; | ||
314 | + BB5F3CA51C1811BC00DA339D /* Supporting Files */ = { | ||
315 | + isa = PBXGroup; | ||
316 | + children = ( | ||
317 | + BB5F3CA61C1811BC00DA339D /* Info.plist */, | ||
318 | + ); | ||
319 | + name = "Supporting Files"; | ||
320 | + sourceTree = "<group>"; | ||
321 | + }; | ||
322 | + C47346B2A89A2ADCE6E06B2C /* Libraries */ = { | ||
323 | + isa = PBXGroup; | ||
324 | + children = ( | ||
325 | + DBA2400187320F26ABB6BD25 /* libz.dylib */, | ||
326 | + 7E984069BEA942145F157BA0 /* libc++.dylib */, | ||
327 | + ); | ||
328 | + name = Libraries; | ||
329 | + sourceTree = "<group>"; | ||
330 | + }; | ||
331 | +/* End PBXGroup section */ | ||
332 | + | ||
333 | +/* Begin PBXNativeTarget section */ | ||
334 | + BB5F3C871C1811BC00DA339D /* Demo */ = { | ||
335 | + isa = PBXNativeTarget; | ||
336 | + buildConfigurationList = BB5F3CAB1C1811BC00DA339D /* Build configuration list for PBXNativeTarget "Demo" */; | ||
337 | + buildPhases = ( | ||
338 | + BB5F3C841C1811BC00DA339D /* Sources */, | ||
339 | + BB5F3C851C1811BC00DA339D /* Frameworks */, | ||
340 | + BB5F3C861C1811BC00DA339D /* Resources */, | ||
341 | + 84398BFB1C4C83EC0082D774 /* Embed Frameworks */, | ||
342 | + ); | ||
343 | + buildRules = ( | ||
344 | + ); | ||
345 | + dependencies = ( | ||
346 | + ); | ||
347 | + name = Demo; | ||
348 | + productName = Demo; | ||
349 | + productReference = BB5F3C881C1811BC00DA339D /* Demo.app */; | ||
350 | + productType = "com.apple.product-type.application"; | ||
351 | + }; | ||
352 | + BB5F3CA01C1811BC00DA339D /* DemoTests */ = { | ||
353 | + isa = PBXNativeTarget; | ||
354 | + buildConfigurationList = BB5F3CAE1C1811BC00DA339D /* Build configuration list for PBXNativeTarget "DemoTests" */; | ||
355 | + buildPhases = ( | ||
356 | + BB5F3C9D1C1811BC00DA339D /* Sources */, | ||
357 | + BB5F3C9E1C1811BC00DA339D /* Frameworks */, | ||
358 | + BB5F3C9F1C1811BC00DA339D /* Resources */, | ||
359 | + ); | ||
360 | + buildRules = ( | ||
361 | + ); | ||
362 | + dependencies = ( | ||
363 | + BB5F3CA31C1811BC00DA339D /* PBXTargetDependency */, | ||
364 | + ); | ||
365 | + name = DemoTests; | ||
366 | + productName = DemoTests; | ||
367 | + productReference = BB5F3CA11C1811BC00DA339D /* DemoTests.xctest */; | ||
368 | + productType = "com.apple.product-type.bundle.unit-test"; | ||
369 | + }; | ||
370 | +/* End PBXNativeTarget section */ | ||
371 | + | ||
372 | +/* Begin PBXProject section */ | ||
373 | + BB5F3C801C1811BC00DA339D /* Project object */ = { | ||
374 | + isa = PBXProject; | ||
375 | + attributes = { | ||
376 | + LastUpgradeCheck = 0640; | ||
377 | + ORGANIZATIONNAME = winFan; | ||
378 | + TargetAttributes = { | ||
379 | + BB5F3C871C1811BC00DA339D = { | ||
380 | + CreatedOnToolsVersion = 6.4; | ||
381 | + }; | ||
382 | + BB5F3CA01C1811BC00DA339D = { | ||
383 | + CreatedOnToolsVersion = 6.4; | ||
384 | + TestTargetID = BB5F3C871C1811BC00DA339D; | ||
385 | + }; | ||
386 | + }; | ||
387 | + }; | ||
388 | + buildConfigurationList = BB5F3C831C1811BC00DA339D /* Build configuration list for PBXProject "Demo_qianyou" */; | ||
389 | + compatibilityVersion = "Xcode 3.2"; | ||
390 | + developmentRegion = English; | ||
391 | + hasScannedForEncodings = 0; | ||
392 | + knownRegions = ( | ||
393 | + en, | ||
394 | + Base, | ||
395 | + ); | ||
396 | + mainGroup = BB5F3C7F1C1811BC00DA339D; | ||
397 | + productRefGroup = BB5F3C891C1811BC00DA339D /* Products */; | ||
398 | + projectDirPath = ""; | ||
399 | + projectRoot = ""; | ||
400 | + targets = ( | ||
401 | + BB5F3C871C1811BC00DA339D /* Demo */, | ||
402 | + BB5F3CA01C1811BC00DA339D /* DemoTests */, | ||
403 | + ); | ||
404 | + }; | ||
405 | +/* End PBXProject section */ | ||
406 | + | ||
407 | +/* Begin PBXResourcesBuildPhase section */ | ||
408 | + BB5F3C861C1811BC00DA339D /* Resources */ = { | ||
409 | + isa = PBXResourcesBuildPhase; | ||
410 | + buildActionMask = 2147483647; | ||
411 | + files = ( | ||
412 | + BB5F3C971C1811BC00DA339D /* Main.storyboard in Resources */, | ||
413 | + BB5F3C9C1C1811BC00DA339D /* LaunchScreen.xib in Resources */, | ||
414 | + D08D40B8A871D0B9E76D6218 /* pool_setting in Resources */, | ||
415 | + 88754BCA9E81E8C7970224A0 /* p2y9y_private.plist in Resources */, | ||
416 | + 28B24CB6A081625DE08061F7 /* Info.plist in Resources */, | ||
417 | + 64924775A22BC91855BA6C0E /* KeychainAccessGroups.plist in Resources */, | ||
418 | + 0DD84DCE951921AF3C8918B4 /* QYGameSDK.bundle in Resources */, | ||
419 | + ); | ||
420 | + runOnlyForDeploymentPostprocessing = 0; | ||
421 | + }; | ||
422 | + BB5F3C9F1C1811BC00DA339D /* Resources */ = { | ||
423 | + isa = PBXResourcesBuildPhase; | ||
424 | + buildActionMask = 2147483647; | ||
425 | + files = ( | ||
426 | + 49BC4611A7BDF894F4027344 /* pool_setting in Resources */, | ||
427 | + FECC456CBA21A0B67FC4AA28 /* p2y9y_private.plist in Resources */, | ||
428 | + 86234DA0B00E02E158BFA711 /* Info.plist in Resources */, | ||
429 | + C33642EF934E05A46D4BCF0D /* KeychainAccessGroups.plist in Resources */, | ||
430 | + 4EF64CED9DDE0EE30F8379FE /* QYGameSDK.bundle in Resources */, | ||
431 | + ); | ||
432 | + runOnlyForDeploymentPostprocessing = 0; | ||
433 | + }; | ||
434 | +/* End PBXResourcesBuildPhase section */ | ||
435 | + | ||
436 | +/* Begin PBXSourcesBuildPhase section */ | ||
437 | + BB5F3C841C1811BC00DA339D /* Sources */ = { | ||
438 | + isa = PBXSourcesBuildPhase; | ||
439 | + buildActionMask = 2147483647; | ||
440 | + files = ( | ||
441 | + 8484E4F51EE7E0DC00B402D1 /* AppDelegate.m in Sources */, | ||
442 | + 847EE5E21EE9007E003A4B7B /* MainViewController.m in Sources */, | ||
443 | + BB5F3C8E1C1811BC00DA339D /* main.m in Sources */, | ||
444 | + 8484E4F61EE7E0DC00B402D1 /* ViewController.m in Sources */, | ||
445 | + 812D453CB5E596D4C19B1C16 /* qyUtils.m in Sources */, | ||
446 | + B1754F38957F9964DE899FF9 /* SDKInterface.m in Sources */, | ||
447 | + 4F3546A69FCB92B2CD5AF4A7 /* AppleIap.m in Sources */, | ||
448 | + 53284282BB7D5CFF54D809A9 /* IAPHelper.m in Sources */, | ||
449 | + F3CD4B5D867341B41D796511 /* SFHFKeychainUtils.m in Sources */, | ||
450 | + 5CB94776B81A8546E2087FB0 /* NSString+Base64.m in Sources */, | ||
451 | + 33B74DFF8036BBBBF4437716 /* IAPShare.m in Sources */, | ||
452 | + ); | ||
453 | + runOnlyForDeploymentPostprocessing = 0; | ||
454 | + }; | ||
455 | + BB5F3C9D1C1811BC00DA339D /* Sources */ = { | ||
456 | + isa = PBXSourcesBuildPhase; | ||
457 | + buildActionMask = 2147483647; | ||
458 | + files = ( | ||
459 | + BB5F3CA81C1811BC00DA339D /* DemoTests.m in Sources */, | ||
460 | + 698948CE8A09FCBB43B26568 /* qyUtils.m in Sources */, | ||
461 | + 7EE549C5B985FB2B881E06F1 /* SDKInterface.m in Sources */, | ||
462 | + 05D04F299E662535A9DFBDAF /* AppleIap.m in Sources */, | ||
463 | + 44F048EBBCDA6364C0594F75 /* IAPHelper.m in Sources */, | ||
464 | + 62BB40048F58BF831FCFA061 /* SFHFKeychainUtils.m in Sources */, | ||
465 | + CBB24CA78BE8527437FB3FA6 /* NSString+Base64.m in Sources */, | ||
466 | + 5A8C4FF0AD7A038290460F42 /* IAPShare.m in Sources */, | ||
467 | + ); | ||
468 | + runOnlyForDeploymentPostprocessing = 0; | ||
469 | + }; | ||
470 | +/* End PBXSourcesBuildPhase section */ | ||
471 | + | ||
472 | +/* Begin PBXTargetDependency section */ | ||
473 | + BB5F3CA31C1811BC00DA339D /* PBXTargetDependency */ = { | ||
474 | + isa = PBXTargetDependency; | ||
475 | + target = BB5F3C871C1811BC00DA339D /* Demo */; | ||
476 | + targetProxy = BB5F3CA21C1811BC00DA339D /* PBXContainerItemProxy */; | ||
477 | + }; | ||
478 | +/* End PBXTargetDependency section */ | ||
479 | + | ||
480 | +/* Begin PBXVariantGroup section */ | ||
481 | + BB5F3C951C1811BC00DA339D /* Main.storyboard */ = { | ||
482 | + isa = PBXVariantGroup; | ||
483 | + children = ( | ||
484 | + BB5F3C961C1811BC00DA339D /* Base */, | ||
485 | + ); | ||
486 | + name = Main.storyboard; | ||
487 | + sourceTree = "<group>"; | ||
488 | + }; | ||
489 | + BB5F3C9A1C1811BC00DA339D /* LaunchScreen.xib */ = { | ||
490 | + isa = PBXVariantGroup; | ||
491 | + children = ( | ||
492 | + BB5F3C9B1C1811BC00DA339D /* Base */, | ||
493 | + ); | ||
494 | + name = LaunchScreen.xib; | ||
495 | + sourceTree = "<group>"; | ||
496 | + }; | ||
497 | +/* End PBXVariantGroup section */ | ||
498 | + | ||
499 | +/* Begin XCBuildConfiguration section */ | ||
500 | + BB5F3CA91C1811BC00DA339D /* Debug */ = { | ||
501 | + isa = XCBuildConfiguration; | ||
502 | + buildSettings = { | ||
503 | + ALWAYS_SEARCH_USER_PATHS = NO; | ||
504 | + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = ""; | ||
505 | + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||
506 | + CLANG_CXX_LIBRARY = "libc++"; | ||
507 | + CLANG_ENABLE_MODULES = YES; | ||
508 | + CLANG_ENABLE_OBJC_ARC = YES; | ||
509 | + CLANG_WARN_BOOL_CONVERSION = YES; | ||
510 | + CLANG_WARN_CONSTANT_CONVERSION = YES; | ||
511 | + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||
512 | + CLANG_WARN_EMPTY_BODY = YES; | ||
513 | + CLANG_WARN_ENUM_CONVERSION = YES; | ||
514 | + CLANG_WARN_INT_CONVERSION = YES; | ||
515 | + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||
516 | + CLANG_WARN_UNREACHABLE_CODE = YES; | ||
517 | + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||
518 | + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||
519 | + COPY_PHASE_STRIP = NO; | ||
520 | + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||
521 | + ENABLE_BITCODE = NO; | ||
522 | + ENABLE_STRICT_OBJC_MSGSEND = YES; | ||
523 | + FRAMEWORK_SEARCH_PATHS = "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\""; | ||
524 | + GCC_C_LANGUAGE_STANDARD = gnu99; | ||
525 | + GCC_DYNAMIC_NO_PIC = NO; | ||
526 | + GCC_NO_COMMON_BLOCKS = YES; | ||
527 | + GCC_OPTIMIZATION_LEVEL = 0; | ||
528 | + GCC_PREPROCESSOR_DEFINITIONS = ( | ||
529 | + "DEBUG=1", | ||
530 | + "$(inherited)", | ||
531 | + ); | ||
532 | + GCC_SYMBOLS_PRIVATE_EXTERN = NO; | ||
533 | + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||
534 | + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||
535 | + GCC_WARN_UNDECLARED_SELECTOR = YES; | ||
536 | + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||
537 | + GCC_WARN_UNUSED_FUNCTION = YES; | ||
538 | + GCC_WARN_UNUSED_VARIABLE = YES; | ||
539 | + HEADER_SEARCH_PATHS = ( | ||
540 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\"", | ||
541 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK/iaphelper\"", | ||
542 | + ); | ||
543 | + INFOPLIST_FILE = poolsdk_file/poolsdk_qianyou/Info.plist; | ||
544 | + IPHONEOS_DEPLOYMENT_TARGET = 8.4; | ||
545 | + LIBRARY_SEARCH_PATHS = "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\""; | ||
546 | + MTL_ENABLE_DEBUG_INFO = YES; | ||
547 | + ONLY_ACTIVE_ARCH = YES; | ||
548 | + OTHER_LDFLAGS = "-ObjC"; | ||
549 | + PRODUCT_BUNDLE_IDENTIFIER = com.pfd.jiankefy; | ||
550 | + SDKROOT = iphoneos; | ||
551 | + }; | ||
552 | + name = Debug; | ||
553 | + }; | ||
554 | + BB5F3CAA1C1811BC00DA339D /* Release */ = { | ||
555 | + isa = XCBuildConfiguration; | ||
556 | + buildSettings = { | ||
557 | + ALWAYS_SEARCH_USER_PATHS = NO; | ||
558 | + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||
559 | + CLANG_CXX_LIBRARY = "libc++"; | ||
560 | + CLANG_ENABLE_MODULES = YES; | ||
561 | + CLANG_ENABLE_OBJC_ARC = YES; | ||
562 | + CLANG_WARN_BOOL_CONVERSION = YES; | ||
563 | + CLANG_WARN_CONSTANT_CONVERSION = YES; | ||
564 | + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||
565 | + CLANG_WARN_EMPTY_BODY = YES; | ||
566 | + CLANG_WARN_ENUM_CONVERSION = YES; | ||
567 | + CLANG_WARN_INT_CONVERSION = YES; | ||
568 | + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||
569 | + CLANG_WARN_UNREACHABLE_CODE = YES; | ||
570 | + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||
571 | + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||
572 | + COPY_PHASE_STRIP = NO; | ||
573 | + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||
574 | + ENABLE_BITCODE = NO; | ||
575 | + ENABLE_NS_ASSERTIONS = NO; | ||
576 | + ENABLE_STRICT_OBJC_MSGSEND = YES; | ||
577 | + FRAMEWORK_SEARCH_PATHS = "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\""; | ||
578 | + GCC_C_LANGUAGE_STANDARD = gnu99; | ||
579 | + GCC_NO_COMMON_BLOCKS = YES; | ||
580 | + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||
581 | + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||
582 | + GCC_WARN_UNDECLARED_SELECTOR = YES; | ||
583 | + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||
584 | + GCC_WARN_UNUSED_FUNCTION = YES; | ||
585 | + GCC_WARN_UNUSED_VARIABLE = YES; | ||
586 | + HEADER_SEARCH_PATHS = ( | ||
587 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\"", | ||
588 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK/iaphelper\"", | ||
589 | + ); | ||
590 | + INFOPLIST_FILE = poolsdk_file/poolsdk_qianyou/Info.plist; | ||
591 | + IPHONEOS_DEPLOYMENT_TARGET = 8.4; | ||
592 | + LIBRARY_SEARCH_PATHS = "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\""; | ||
593 | + MTL_ENABLE_DEBUG_INFO = NO; | ||
594 | + OTHER_LDFLAGS = "-ObjC"; | ||
595 | + PRODUCT_BUNDLE_IDENTIFIER = com.pfd.jiankefy; | ||
596 | + SDKROOT = iphoneos; | ||
597 | + VALIDATE_PRODUCT = YES; | ||
598 | + }; | ||
599 | + name = Release; | ||
600 | + }; | ||
601 | + BB5F3CAC1C1811BC00DA339D /* Debug */ = { | ||
602 | + isa = XCBuildConfiguration; | ||
603 | + buildSettings = { | ||
604 | + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||
605 | + CODE_SIGN_IDENTITY = "iPhone Developer: lin pan (V5X25H8T33)"; | ||
606 | + DEAD_CODE_STRIPPING = NO; | ||
607 | + ENABLE_BITCODE = NO; | ||
608 | + FRAMEWORK_SEARCH_PATHS = ( | ||
609 | + "$(inherited)", | ||
610 | + "$(PROJECT_DIR)/Demo", | ||
611 | + "$(PROJECT_DIR)/poolsdk_file/poolsdk", | ||
612 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\"", | ||
613 | + ); | ||
614 | + HEADER_SEARCH_PATHS = ( | ||
615 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\"", | ||
616 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK/iaphelper\"", | ||
617 | + ); | ||
618 | + INFOPLIST_FILE = poolsdk_file/poolsdk_qianyou/Info.plist; | ||
619 | + IPHONEOS_DEPLOYMENT_TARGET = 8.1; | ||
620 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | ||
621 | + LIBRARY_SEARCH_PATHS = ( | ||
622 | + "$(inherited)", | ||
623 | + "$(PROJECT_DIR)/Demo", | ||
624 | + "$(PROJECT_DIR)/poolsdk_file/poolsdk", | ||
625 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\"", | ||
626 | + ); | ||
627 | + ONLY_ACTIVE_ARCH = NO; | ||
628 | + OTHER_LDFLAGS = "-ObjC"; | ||
629 | + PRODUCT_BUNDLE_IDENTIFIER = com.jhap.fengxian; | ||
630 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
631 | + PROVISIONING_PROFILE = "abd43790-4dbb-48ef-b278-e016140bf864"; | ||
632 | + TARGETED_DEVICE_FAMILY = 2; | ||
633 | + VALID_ARCHS = "arm64 armv7s"; | ||
634 | + }; | ||
635 | + name = Debug; | ||
636 | + }; | ||
637 | + BB5F3CAD1C1811BC00DA339D /* Release */ = { | ||
638 | + isa = XCBuildConfiguration; | ||
639 | + buildSettings = { | ||
640 | + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||
641 | + CODE_SIGN_IDENTITY = "iPhone Developer: lin pan (V5X25H8T33)"; | ||
642 | + DEAD_CODE_STRIPPING = NO; | ||
643 | + ENABLE_BITCODE = NO; | ||
644 | + FRAMEWORK_SEARCH_PATHS = ( | ||
645 | + "$(inherited)", | ||
646 | + "$(PROJECT_DIR)/Demo", | ||
647 | + "$(PROJECT_DIR)/poolsdk_file/poolsdk", | ||
648 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\"", | ||
649 | + ); | ||
650 | + HEADER_SEARCH_PATHS = ( | ||
651 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\"", | ||
652 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK/iaphelper\"", | ||
653 | + ); | ||
654 | + INFOPLIST_FILE = poolsdk_file/poolsdk_qianyou/Info.plist; | ||
655 | + IPHONEOS_DEPLOYMENT_TARGET = 8.1; | ||
656 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | ||
657 | + LIBRARY_SEARCH_PATHS = ( | ||
658 | + "$(inherited)", | ||
659 | + "$(PROJECT_DIR)/Demo", | ||
660 | + "$(PROJECT_DIR)/poolsdk_file/poolsdk", | ||
661 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\"", | ||
662 | + ); | ||
663 | + ONLY_ACTIVE_ARCH = NO; | ||
664 | + OTHER_LDFLAGS = "-ObjC"; | ||
665 | + PRODUCT_BUNDLE_IDENTIFIER = com.jhap.fengxian; | ||
666 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
667 | + PROVISIONING_PROFILE = "abd43790-4dbb-48ef-b278-e016140bf864"; | ||
668 | + TARGETED_DEVICE_FAMILY = 2; | ||
669 | + VALID_ARCHS = "arm64 armv7s"; | ||
670 | + }; | ||
671 | + name = Release; | ||
672 | + }; | ||
673 | + BB5F3CAF1C1811BC00DA339D /* Debug */ = { | ||
674 | + isa = XCBuildConfiguration; | ||
675 | + buildSettings = { | ||
676 | + BUNDLE_LOADER = "$(TEST_HOST)"; | ||
677 | + ENABLE_BITCODE = NO; | ||
678 | + FRAMEWORK_SEARCH_PATHS = ( | ||
679 | + "$(SDKROOT)/Developer/Library/Frameworks", | ||
680 | + "$(inherited)", | ||
681 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\"", | ||
682 | + ); | ||
683 | + GCC_PREPROCESSOR_DEFINITIONS = ( | ||
684 | + "DEBUG=1", | ||
685 | + "$(inherited)", | ||
686 | + ); | ||
687 | + HEADER_SEARCH_PATHS = ( | ||
688 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\"", | ||
689 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK/iaphelper\"", | ||
690 | + ); | ||
691 | + INFOPLIST_FILE = poolsdk_file/poolsdk_qianyou/Info.plist; | ||
692 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
693 | + LIBRARY_SEARCH_PATHS = "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\""; | ||
694 | + OTHER_LDFLAGS = "-ObjC"; | ||
695 | + PRODUCT_BUNDLE_IDENTIFIER = com.pfd.jiankefy; | ||
696 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
697 | + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Demo.app/Demo"; | ||
698 | + }; | ||
699 | + name = Debug; | ||
700 | + }; | ||
701 | + BB5F3CB01C1811BC00DA339D /* Release */ = { | ||
702 | + isa = XCBuildConfiguration; | ||
703 | + buildSettings = { | ||
704 | + BUNDLE_LOADER = "$(TEST_HOST)"; | ||
705 | + ENABLE_BITCODE = NO; | ||
706 | + FRAMEWORK_SEARCH_PATHS = ( | ||
707 | + "$(SDKROOT)/Developer/Library/Frameworks", | ||
708 | + "$(inherited)", | ||
709 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\"", | ||
710 | + ); | ||
711 | + HEADER_SEARCH_PATHS = ( | ||
712 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\"", | ||
713 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK/iaphelper\"", | ||
714 | + ); | ||
715 | + INFOPLIST_FILE = poolsdk_file/poolsdk_qianyou/Info.plist; | ||
716 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
717 | + LIBRARY_SEARCH_PATHS = "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_qianyou/SDK\""; | ||
718 | + OTHER_LDFLAGS = "-ObjC"; | ||
719 | + PRODUCT_BUNDLE_IDENTIFIER = com.pfd.jiankefy; | ||
720 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
721 | + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Demo.app/Demo"; | ||
722 | + }; | ||
723 | + name = Release; | ||
724 | + }; | ||
725 | +/* End XCBuildConfiguration section */ | ||
726 | + | ||
727 | +/* Begin XCConfigurationList section */ | ||
728 | + BB5F3C831C1811BC00DA339D /* Build configuration list for PBXProject "Demo_qianyou" */ = { | ||
729 | + isa = XCConfigurationList; | ||
730 | + buildConfigurations = ( | ||
731 | + BB5F3CA91C1811BC00DA339D /* Debug */, | ||
732 | + BB5F3CAA1C1811BC00DA339D /* Release */, | ||
733 | + ); | ||
734 | + defaultConfigurationIsVisible = 0; | ||
735 | + defaultConfigurationName = Release; | ||
736 | + }; | ||
737 | + BB5F3CAB1C1811BC00DA339D /* Build configuration list for PBXNativeTarget "Demo" */ = { | ||
738 | + isa = XCConfigurationList; | ||
739 | + buildConfigurations = ( | ||
740 | + BB5F3CAC1C1811BC00DA339D /* Debug */, | ||
741 | + BB5F3CAD1C1811BC00DA339D /* Release */, | ||
742 | + ); | ||
743 | + defaultConfigurationIsVisible = 0; | ||
744 | + defaultConfigurationName = Release; | ||
745 | + }; | ||
746 | + BB5F3CAE1C1811BC00DA339D /* Build configuration list for PBXNativeTarget "DemoTests" */ = { | ||
747 | + isa = XCConfigurationList; | ||
748 | + buildConfigurations = ( | ||
749 | + BB5F3CAF1C1811BC00DA339D /* Debug */, | ||
750 | + BB5F3CB01C1811BC00DA339D /* Release */, | ||
751 | + ); | ||
752 | + defaultConfigurationIsVisible = 0; | ||
753 | + defaultConfigurationName = Release; | ||
754 | + }; | ||
755 | +/* End XCConfigurationList section */ | ||
756 | + }; | ||
757 | + rootObject = BB5F3C801C1811BC00DA339D /* Project object */; | ||
758 | +} |
1 | +{ | ||
2 | + "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "D1584AEF25B5C21395F515B62C90B71E0ACB26B2", | ||
3 | + "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { | ||
4 | + "5b13317c-0110-4367-8746-06bc6aadd3cd++2397" : { | ||
5 | + | ||
6 | + } | ||
7 | + }, | ||
8 | + "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { | ||
9 | + "D1584AEF25B5C21395F515B62C90B71E0ACB26B2" : 0, | ||
10 | + "5b13317c-0110-4367-8746-06bc6aadd3cd++2397" : 0 | ||
11 | + }, | ||
12 | + "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "8119CC7B-EDC1-4646-9378-8ECAC2EEB94B", | ||
13 | + "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { | ||
14 | + "D1584AEF25B5C21395F515B62C90B71E0ACB26B2" : "public_sdk_ios\/", | ||
15 | + "5b13317c-0110-4367-8746-06bc6aadd3cd++2397" : "youai_foolsdk_ios\/" | ||
16 | + }, | ||
17 | + "DVTSourceControlWorkspaceBlueprintNameKey" : "Demo", | ||
18 | + "DVTSourceControlWorkspaceBlueprintVersion" : 204, | ||
19 | + "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "PoolSdk_Demo\/Demo.xcodeproj", | ||
20 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ | ||
21 | + { | ||
22 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "svn:\/\/10.21.210.99", | ||
23 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Subversion", | ||
24 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "5b13317c-0110-4367-8746-06bc6aadd3cd++2397" | ||
25 | + }, | ||
26 | + { | ||
27 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "ssh:\/\/106.75.192.252:10022\/public_service\/public_sdk_ios.git", | ||
28 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", | ||
29 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "D1584AEF25B5C21395F515B62C90B71E0ACB26B2" | ||
30 | + } | ||
31 | + ] | ||
32 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Bucket | ||
3 | + type = "1" | ||
4 | + version = "2.0"> | ||
5 | + <Breakpoints> | ||
6 | + <BreakpointProxy | ||
7 | + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> | ||
8 | + <BreakpointContent | ||
9 | + shouldBeEnabled = "Yes" | ||
10 | + ignoreCount = "0" | ||
11 | + continueAfterRunningActions = "No" | ||
12 | + filePath = "../PoolSdk/PoolSdk/SDKInterface.m" | ||
13 | + timestampString = "471440051.171901" | ||
14 | + startingColumnNumber = "9223372036854775807" | ||
15 | + endingColumnNumber = "9223372036854775807" | ||
16 | + startingLineNumber = "77" | ||
17 | + endingLineNumber = "77" | ||
18 | + landmarkName = "-receiveLoginMessage:" | ||
19 | + landmarkType = "5"> | ||
20 | + </BreakpointContent> | ||
21 | + </BreakpointProxy> | ||
22 | + <BreakpointProxy | ||
23 | + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> | ||
24 | + <BreakpointContent | ||
25 | + shouldBeEnabled = "Yes" | ||
26 | + ignoreCount = "0" | ||
27 | + continueAfterRunningActions = "No" | ||
28 | + filePath = "../PoolSdk/PoolSdk/SDKInterface.m" | ||
29 | + timestampString = "471440051.171901" | ||
30 | + startingColumnNumber = "9223372036854775807" | ||
31 | + endingColumnNumber = "9223372036854775807" | ||
32 | + startingLineNumber = "43" | ||
33 | + endingLineNumber = "43" | ||
34 | + landmarkName = "-SDKloginSDK" | ||
35 | + landmarkType = "5"> | ||
36 | + </BreakpointContent> | ||
37 | + </BreakpointProxy> | ||
38 | + </Breakpoints> | ||
39 | +</Bucket> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Scheme | ||
3 | + LastUpgradeVersion = "0640" | ||
4 | + version = "1.3"> | ||
5 | + <BuildAction | ||
6 | + parallelizeBuildables = "YES" | ||
7 | + buildImplicitDependencies = "YES"> | ||
8 | + <BuildActionEntries> | ||
9 | + <BuildActionEntry | ||
10 | + buildForTesting = "YES" | ||
11 | + buildForRunning = "YES" | ||
12 | + buildForProfiling = "YES" | ||
13 | + buildForArchiving = "YES" | ||
14 | + buildForAnalyzing = "YES"> | ||
15 | + <BuildableReference | ||
16 | + BuildableIdentifier = "primary" | ||
17 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
18 | + BuildableName = "Demo.app" | ||
19 | + BlueprintName = "Demo" | ||
20 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
21 | + </BuildableReference> | ||
22 | + </BuildActionEntry> | ||
23 | + <BuildActionEntry | ||
24 | + buildForTesting = "YES" | ||
25 | + buildForRunning = "YES" | ||
26 | + buildForProfiling = "NO" | ||
27 | + buildForArchiving = "NO" | ||
28 | + buildForAnalyzing = "YES"> | ||
29 | + <BuildableReference | ||
30 | + BuildableIdentifier = "primary" | ||
31 | + BlueprintIdentifier = "BB5F3CA01C1811BC00DA339D" | ||
32 | + BuildableName = "DemoTests.xctest" | ||
33 | + BlueprintName = "DemoTests" | ||
34 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
35 | + </BuildableReference> | ||
36 | + </BuildActionEntry> | ||
37 | + </BuildActionEntries> | ||
38 | + </BuildAction> | ||
39 | + <TestAction | ||
40 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
41 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
42 | + shouldUseLaunchSchemeArgsEnv = "YES" | ||
43 | + buildConfiguration = "Debug"> | ||
44 | + <Testables> | ||
45 | + <TestableReference | ||
46 | + skipped = "NO"> | ||
47 | + <BuildableReference | ||
48 | + BuildableIdentifier = "primary" | ||
49 | + BlueprintIdentifier = "BB5F3CA01C1811BC00DA339D" | ||
50 | + BuildableName = "DemoTests.xctest" | ||
51 | + BlueprintName = "DemoTests" | ||
52 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
53 | + </BuildableReference> | ||
54 | + </TestableReference> | ||
55 | + </Testables> | ||
56 | + <MacroExpansion> | ||
57 | + <BuildableReference | ||
58 | + BuildableIdentifier = "primary" | ||
59 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
60 | + BuildableName = "Demo.app" | ||
61 | + BlueprintName = "Demo" | ||
62 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
63 | + </BuildableReference> | ||
64 | + </MacroExpansion> | ||
65 | + </TestAction> | ||
66 | + <LaunchAction | ||
67 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
68 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
69 | + launchStyle = "0" | ||
70 | + useCustomWorkingDirectory = "NO" | ||
71 | + buildConfiguration = "Debug" | ||
72 | + ignoresPersistentStateOnLaunch = "NO" | ||
73 | + debugDocumentVersioning = "YES" | ||
74 | + allowLocationSimulation = "YES"> | ||
75 | + <BuildableProductRunnable | ||
76 | + runnableDebuggingMode = "0"> | ||
77 | + <BuildableReference | ||
78 | + BuildableIdentifier = "primary" | ||
79 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
80 | + BuildableName = "Demo.app" | ||
81 | + BlueprintName = "Demo" | ||
82 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
83 | + </BuildableReference> | ||
84 | + </BuildableProductRunnable> | ||
85 | + <AdditionalOptions> | ||
86 | + </AdditionalOptions> | ||
87 | + </LaunchAction> | ||
88 | + <ProfileAction | ||
89 | + shouldUseLaunchSchemeArgsEnv = "YES" | ||
90 | + savedToolIdentifier = "" | ||
91 | + useCustomWorkingDirectory = "NO" | ||
92 | + buildConfiguration = "Release" | ||
93 | + debugDocumentVersioning = "YES"> | ||
94 | + <BuildableProductRunnable | ||
95 | + runnableDebuggingMode = "0"> | ||
96 | + <BuildableReference | ||
97 | + BuildableIdentifier = "primary" | ||
98 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
99 | + BuildableName = "Demo.app" | ||
100 | + BlueprintName = "Demo" | ||
101 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
102 | + </BuildableReference> | ||
103 | + </BuildableProductRunnable> | ||
104 | + </ProfileAction> | ||
105 | + <AnalyzeAction | ||
106 | + buildConfiguration = "Debug"> | ||
107 | + </AnalyzeAction> | ||
108 | + <ArchiveAction | ||
109 | + buildConfiguration = "Release" | ||
110 | + revealArchiveInOrganizer = "YES"> | ||
111 | + </ArchiveAction> | ||
112 | +</Scheme> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>SchemeUserState</key> | ||
6 | + <dict> | ||
7 | + <key>Demo.xcscheme</key> | ||
8 | + <dict> | ||
9 | + <key>orderHint</key> | ||
10 | + <integer>0</integer> | ||
11 | + </dict> | ||
12 | + </dict> | ||
13 | + <key>SuppressBuildableAutocreation</key> | ||
14 | + <dict> | ||
15 | + <key>BB5F3C871C1811BC00DA339D</key> | ||
16 | + <dict> | ||
17 | + <key>primary</key> | ||
18 | + <true/> | ||
19 | + </dict> | ||
20 | + <key>BB5F3CA01C1811BC00DA339D</key> | ||
21 | + <dict> | ||
22 | + <key>primary</key> | ||
23 | + <true/> | ||
24 | + </dict> | ||
25 | + </dict> | ||
26 | +</dict> | ||
27 | +</plist> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Bucket | ||
3 | + type = "1" | ||
4 | + version = "2.0"> | ||
5 | + <Breakpoints> | ||
6 | + <BreakpointProxy | ||
7 | + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> | ||
8 | + <BreakpointContent | ||
9 | + shouldBeEnabled = "No" | ||
10 | + ignoreCount = "0" | ||
11 | + continueAfterRunningActions = "No" | ||
12 | + filePath = "Demo/SDKInterface.h" | ||
13 | + timestampString = "474775745.083759" | ||
14 | + startingColumnNumber = "9223372036854775807" | ||
15 | + endingColumnNumber = "9223372036854775807" | ||
16 | + startingLineNumber = "9" | ||
17 | + endingLineNumber = "9" | ||
18 | + landmarkName = "@interface SDKInterface" | ||
19 | + landmarkType = "2"> | ||
20 | + </BreakpointContent> | ||
21 | + </BreakpointProxy> | ||
22 | + </Breakpoints> | ||
23 | +</Bucket> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Scheme | ||
3 | + LastUpgradeVersion = "0700" | ||
4 | + version = "1.3"> | ||
5 | + <BuildAction | ||
6 | + parallelizeBuildables = "YES" | ||
7 | + buildImplicitDependencies = "YES"> | ||
8 | + <BuildActionEntries> | ||
9 | + <BuildActionEntry | ||
10 | + buildForTesting = "YES" | ||
11 | + buildForRunning = "YES" | ||
12 | + buildForProfiling = "YES" | ||
13 | + buildForArchiving = "YES" | ||
14 | + buildForAnalyzing = "YES"> | ||
15 | + <BuildableReference | ||
16 | + BuildableIdentifier = "primary" | ||
17 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
18 | + BuildableName = "Demo.app" | ||
19 | + BlueprintName = "Demo" | ||
20 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
21 | + </BuildableReference> | ||
22 | + </BuildActionEntry> | ||
23 | + </BuildActionEntries> | ||
24 | + </BuildAction> | ||
25 | + <TestAction | ||
26 | + buildConfiguration = "Debug" | ||
27 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
28 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
29 | + shouldUseLaunchSchemeArgsEnv = "YES"> | ||
30 | + <Testables> | ||
31 | + <TestableReference | ||
32 | + skipped = "NO"> | ||
33 | + <BuildableReference | ||
34 | + BuildableIdentifier = "primary" | ||
35 | + BlueprintIdentifier = "BB5F3CA01C1811BC00DA339D" | ||
36 | + BuildableName = "DemoTests.xctest" | ||
37 | + BlueprintName = "DemoTests" | ||
38 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
39 | + </BuildableReference> | ||
40 | + </TestableReference> | ||
41 | + </Testables> | ||
42 | + <MacroExpansion> | ||
43 | + <BuildableReference | ||
44 | + BuildableIdentifier = "primary" | ||
45 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
46 | + BuildableName = "Demo.app" | ||
47 | + BlueprintName = "Demo" | ||
48 | + ReferencedContainer = "container:Demo_qianyou.xcodeproj"> | ||
49 | + </BuildableReference> | ||
50 | + </MacroExpansion> | ||
51 | + <AdditionalOptions> | ||
52 | + </AdditionalOptions> | ||
53 | + </TestAction> | ||
54 | + <LaunchAction | ||
55 | + buildConfiguration = "Debug" | ||
56 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
57 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
58 | + launchStyle = "0" | ||
59 | + useCustomWorkingDirectory = "NO" | ||
60 | + ignoresPersistentStateOnLaunch = "NO" | ||
61 | + debugDocumentVersioning = "YES" | ||
62 | + debugServiceExtension = "internal" | ||
63 | + allowLocationSimulation = "YES"> | ||
64 | + <BuildableProductRunnable | ||
65 | + runnableDebuggingMode = "0"> | ||
66 | + <BuildableReference | ||
67 | + BuildableIdentifier = "primary" | ||
68 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
69 | + BuildableName = "Demo.app" | ||
70 | + BlueprintName = "Demo" | ||
71 | + ReferencedContainer = "container:Demo_qianyou.xcodeproj"> | ||
72 | + </BuildableReference> | ||
73 | + </BuildableProductRunnable> | ||
74 | + <AdditionalOptions> | ||
75 | + </AdditionalOptions> | ||
76 | + </LaunchAction> | ||
77 | + <ProfileAction | ||
78 | + buildConfiguration = "Release" | ||
79 | + shouldUseLaunchSchemeArgsEnv = "YES" | ||
80 | + savedToolIdentifier = "" | ||
81 | + useCustomWorkingDirectory = "NO" | ||
82 | + debugDocumentVersioning = "YES"> | ||
83 | + <BuildableProductRunnable | ||
84 | + runnableDebuggingMode = "0"> | ||
85 | + <BuildableReference | ||
86 | + BuildableIdentifier = "primary" | ||
87 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
88 | + BuildableName = "Demo.app" | ||
89 | + BlueprintName = "Demo" | ||
90 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
91 | + </BuildableReference> | ||
92 | + </BuildableProductRunnable> | ||
93 | + </ProfileAction> | ||
94 | + <AnalyzeAction | ||
95 | + buildConfiguration = "Debug"> | ||
96 | + </AnalyzeAction> | ||
97 | + <ArchiveAction | ||
98 | + buildConfiguration = "Release" | ||
99 | + revealArchiveInOrganizer = "YES"> | ||
100 | + </ArchiveAction> | ||
101 | +</Scheme> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>SchemeUserState</key> | ||
6 | + <dict> | ||
7 | + <key>Demo.xcscheme</key> | ||
8 | + <dict> | ||
9 | + <key>orderHint</key> | ||
10 | + <integer>0</integer> | ||
11 | + </dict> | ||
12 | + </dict> | ||
13 | + <key>SuppressBuildableAutocreation</key> | ||
14 | + <dict> | ||
15 | + <key>BB5F3C871C1811BC00DA339D</key> | ||
16 | + <dict> | ||
17 | + <key>primary</key> | ||
18 | + <true/> | ||
19 | + </dict> | ||
20 | + <key>BB5F3CA01C1811BC00DA339D</key> | ||
21 | + <dict> | ||
22 | + <key>primary</key> | ||
23 | + <true/> | ||
24 | + </dict> | ||
25 | + </dict> | ||
26 | +</dict> | ||
27 | +</plist> |
1 | +// !$*UTF8*$! | ||
2 | +{ | ||
3 | + archiveVersion = 1; | ||
4 | + classes = { | ||
5 | + }; | ||
6 | + objectVersion = 46; | ||
7 | + objects = { | ||
8 | + | ||
9 | +/* Begin PBXBuildFile section */ | ||
10 | + 062345E1ABBB2C3A1EA9E1F2 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 670744858A16F1E10BED4D2F /* libz.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
11 | + 09AF4E77893C0BA8841245D0 /* XYPieChartView.m in Sources */ = {isa = PBXBuildFile; fileRef = EBFB427996200FC54A3045DB /* XYPieChartView.m */; }; | ||
12 | + 127444478785CA14E7328ED1 /* PieChart.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC434797A41AC5D23300700C /* PieChart.xcassets */; }; | ||
13 | + 13FD46848A3CE9D9E564946D /* fackCode.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D654BEBA260D144E8633F22 /* fackCode.m */; }; | ||
14 | + 1FC74435B2B0750A9DCEEB37 /* XYCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 66AA42DD8FC39BDB25ADB114 /* XYCommon.m */; }; | ||
15 | + 267147A68AD62661516F573D /* WindowView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D4C4C799DEA8F12A8F30A46 /* WindowView.m */; }; | ||
16 | + 29B847B48A5485BBA979C37E /* WindowView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D4C4C799DEA8F12A8F30A46 /* WindowView.m */; }; | ||
17 | + 2B8147E399B4D416BAA09CD3 /* PieChart.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC434797A41AC5D23300700C /* PieChart.xcassets */; }; | ||
18 | + 2B8547CA80D8BB38EA373D46 /* fackCode.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D654BEBA260D144E8633F22 /* fackCode.m */; }; | ||
19 | + 3C2D4C2FB2D96D1F99C5A6C9 /* SDKInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = A95249E2B785F433C16E09F8 /* SDKInterface.m */; }; | ||
20 | + 3CB147188BBF0C063422B202 /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 140841E5B239D3B5760E985F /* AdSupport.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
21 | + 422C4A6EA9CA17F79D5EB241 /* XPResource.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D366468492FF60FB3E21CF13 /* XPResource.bundle */; }; | ||
22 | + 56204E5EA4C3440A19D43D1D /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 140841E5B239D3B5760E985F /* AdSupport.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
23 | + 56E74E558ECB8D40CEA1B6EF /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 670744858A16F1E10BED4D2F /* libz.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
24 | + 599C405BA8C060143D9D7888 /* XYRotatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 31144476A790C2AC4F721359 /* XYRotatedView.m */; }; | ||
25 | + 59E74770A02276B354EC89A5 /* MGBSHud.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FCE454BA44F6CB4494BBA4A /* MGBSHud.framework */; }; | ||
26 | + 5E394907BA3B085B67618D42 /* jcore-ios-1.1.5.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B01B4227837DFD459FB4745F /* jcore-ios-1.1.5.a */; }; | ||
27 | + 5FC24674978F969595C45038 /* UIView+extension.m in Sources */ = {isa = PBXBuildFile; fileRef = B769446CB4990B0D877A6DDC /* UIView+extension.m */; }; | ||
28 | + 62494352808F98BB9C4C41D8 /* XpSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 60BB4D1682AC2DC26E5526AA /* XpSDK.framework */; }; | ||
29 | + 64184F768F82486A1E3613B8 /* pool_setting in Resources */ = {isa = PBXBuildFile; fileRef = 15454ABBB8A907B323BB22F1 /* pool_setting */; }; | ||
30 | + 66A643648B8D01F6C74F9250 /* jcore-ios-1.1.5.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B01B4227837DFD459FB4745F /* jcore-ios-1.1.5.a */; }; | ||
31 | + 6F01485BB3F7DF232F9E1D13 /* XYRenderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 533C4F378D03742608E60D83 /* XYRenderView.m */; }; | ||
32 | + 6F6D41F89A6F826A7E0B375A /* XYCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 66AA42DD8FC39BDB25ADB114 /* XYCommon.m */; }; | ||
33 | + 71294E4DA73F36A2288EA87B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 977A46CA88A90F03FC5F2803 /* libresolv.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
34 | + 8425EC1A1F0E3CBD00B0D868 /* PoolSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8425EC191F0E3CBD00B0D868 /* PoolSdk.framework */; settings = {ASSET_TAGS = (); }; }; | ||
35 | + 847EE5E21EE9007E003A4B7B /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 847EE5E11EE9007E003A4B7B /* MainViewController.m */; settings = {ASSET_TAGS = (); }; }; | ||
36 | + 8484E4F51EE7E0DC00B402D1 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8484E4F21EE7E0DC00B402D1 /* AppDelegate.m */; settings = {ASSET_TAGS = (); }; }; | ||
37 | + 8484E4F61EE7E0DC00B402D1 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8484E4F41EE7E0DC00B402D1 /* ViewController.m */; settings = {ASSET_TAGS = (); }; }; | ||
38 | + 8484E4FC1EE7E1D800B402D1 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E4FB1EE7E1D800B402D1 /* libsqlite3.dylib */; }; | ||
39 | + 8484E4FE1EE7E1F700B402D1 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E4FD1EE7E1F700B402D1 /* CoreTelephony.framework */; }; | ||
40 | + 8484E5001EE7E20C00B402D1 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E4FF1EE7E20C00B402D1 /* CFNetwork.framework */; }; | ||
41 | + 8484E5021EE7E21F00B402D1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5011EE7E21F00B402D1 /* UIKit.framework */; }; | ||
42 | + 8484E5041EE7E24400B402D1 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5031EE7E24400B402D1 /* StoreKit.framework */; }; | ||
43 | + 8484E5061EE7E24A00B402D1 /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5051EE7E24A00B402D1 /* CoreMotion.framework */; }; | ||
44 | + 8484E5081EE7E25600B402D1 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5071EE7E25600B402D1 /* CoreText.framework */; }; | ||
45 | + 8484E50A1EE7E26200B402D1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5091EE7E26200B402D1 /* Security.framework */; }; | ||
46 | + 8484E50C1EE7E27100B402D1 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E50B1EE7E27100B402D1 /* CoreGraphics.framework */; }; | ||
47 | + 8484E50E1EE7E28000B402D1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E50D1EE7E28000B402D1 /* QuartzCore.framework */; }; | ||
48 | + 8484E5101EE7E29A00B402D1 /* libc++.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E50F1EE7E29A00B402D1 /* libc++.1.dylib */; }; | ||
49 | + 8484E5121EE7E2B800B402D1 /* libz.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5111EE7E2B800B402D1 /* libz.1.dylib */; }; | ||
50 | + 8484E5141EE7E2DE00B402D1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5131EE7E2DE00B402D1 /* Foundation.framework */; }; | ||
51 | + 8484E5161EE7E36800B402D1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8484E5151EE7E36800B402D1 /* SystemConfiguration.framework */; }; | ||
52 | + 84F0C99F1FA09F810040A023 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F0C99E1FA09F810040A023 /* libz.tbd */; }; | ||
53 | + 85C04DF3BFE09FFF96EBA77A /* janalytics-ios-1.1.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 20DA476E8534421C70684D5F /* janalytics-ios-1.1.3.a */; }; | ||
54 | + 9188459BA6A0CA1391B1FBC6 /* MGBSHudBundle.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E7D24D03B3D638309F02B3CE /* MGBSHudBundle.bundle */; }; | ||
55 | + 97734FA4943D07CDAA6ED1BA /* XYPieChartView.m in Sources */ = {isa = PBXBuildFile; fileRef = EBFB427996200FC54A3045DB /* XYPieChartView.m */; }; | ||
56 | + A7AE42EF96A061B10279A235 /* UIView+extension.m in Sources */ = {isa = PBXBuildFile; fileRef = B769446CB4990B0D877A6DDC /* UIView+extension.m */; }; | ||
57 | + BB5F3C8E1C1811BC00DA339D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BB5F3C8D1C1811BC00DA339D /* main.m */; }; | ||
58 | + BB5F3C971C1811BC00DA339D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BB5F3C951C1811BC00DA339D /* Main.storyboard */; }; | ||
59 | + BB5F3C9C1C1811BC00DA339D /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB5F3C9A1C1811BC00DA339D /* LaunchScreen.xib */; }; | ||
60 | + BB5F3CA81C1811BC00DA339D /* DemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BB5F3CA71C1811BC00DA339D /* DemoTests.m */; }; | ||
61 | + C07A4C128CE68CB25D747E88 /* SDKInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = A95249E2B785F433C16E09F8 /* SDKInterface.m */; }; | ||
62 | + C539499BBF90B8D50986C190 /* XpSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 60BB4D1682AC2DC26E5526AA /* XpSDK.framework */; }; | ||
63 | + DA8942D39DC50DCB14520E99 /* XYRotatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 31144476A790C2AC4F721359 /* XYRotatedView.m */; }; | ||
64 | + DFB2415285FE66C5C2252043 /* XPResource.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D366468492FF60FB3E21CF13 /* XPResource.bundle */; }; | ||
65 | + E3A648679F39E19D4DB52E5A /* pool_setting in Resources */ = {isa = PBXBuildFile; fileRef = 15454ABBB8A907B323BB22F1 /* pool_setting */; }; | ||
66 | + E8D04121932CC01CB18679F1 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 977A46CA88A90F03FC5F2803 /* libresolv.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; | ||
67 | + F69D4FC486A805D305FEDFA9 /* MGBSHudBundle.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E7D24D03B3D638309F02B3CE /* MGBSHudBundle.bundle */; }; | ||
68 | + FC3B468EAE1A5CC796F20029 /* MGBSHud.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FCE454BA44F6CB4494BBA4A /* MGBSHud.framework */; }; | ||
69 | + FE8C4E4A977421AB7F93D60D /* XYRenderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 533C4F378D03742608E60D83 /* XYRenderView.m */; }; | ||
70 | + FED24FFF8CD5ED3018ED195C /* janalytics-ios-1.1.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 20DA476E8534421C70684D5F /* janalytics-ios-1.1.3.a */; }; | ||
71 | +/* End PBXBuildFile section */ | ||
72 | + | ||
73 | +/* Begin PBXContainerItemProxy section */ | ||
74 | + BB5F3CA21C1811BC00DA339D /* PBXContainerItemProxy */ = { | ||
75 | + isa = PBXContainerItemProxy; | ||
76 | + containerPortal = BB5F3C801C1811BC00DA339D /* Project object */; | ||
77 | + proxyType = 1; | ||
78 | + remoteGlobalIDString = BB5F3C871C1811BC00DA339D; | ||
79 | + remoteInfo = Demo; | ||
80 | + }; | ||
81 | +/* End PBXContainerItemProxy section */ | ||
82 | + | ||
83 | +/* Begin PBXCopyFilesBuildPhase section */ | ||
84 | + 84398BFB1C4C83EC0082D774 /* Embed Frameworks */ = { | ||
85 | + isa = PBXCopyFilesBuildPhase; | ||
86 | + buildActionMask = 2147483647; | ||
87 | + dstPath = ""; | ||
88 | + dstSubfolderSpec = 10; | ||
89 | + files = ( | ||
90 | + ); | ||
91 | + name = "Embed Frameworks"; | ||
92 | + runOnlyForDeploymentPostprocessing = 0; | ||
93 | + }; | ||
94 | +/* End PBXCopyFilesBuildPhase section */ | ||
95 | + | ||
96 | +/* Begin PBXFileReference section */ | ||
97 | + 140841E5B239D3B5760E985F /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; }; | ||
98 | + 15454ABBB8A907B323BB22F1 /* pool_setting */ = {isa = PBXFileReference; lastKnownFileType = "?"; name = pool_setting; path = poolsdk_file/poolsdk_xipu/SDK/pool_setting; sourceTree = SOURCE_ROOT; }; | ||
99 | + 1D654BEBA260D144E8633F22 /* fackCode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = fackCode.m; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/fackCode.m; sourceTree = SOURCE_ROOT; }; | ||
100 | + 1D854BA0A305791979583706 /* XYRenderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = XYRenderView.h; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView/XYRenderView.h; sourceTree = SOURCE_ROOT; }; | ||
101 | + 20DA476E8534421C70684D5F /* janalytics-ios-1.1.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "janalytics-ios-1.1.3.a"; path = "poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics/janalytics-ios-1.1.3.a"; sourceTree = SOURCE_ROOT; }; | ||
102 | + 2ADA47C2A7A76E56A793B5F9 /* SDKInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDKInterface.h; path = poolsdk_file/poolsdk_xipu/SDK/SDKInterface.h; sourceTree = SOURCE_ROOT; }; | ||
103 | + 31144476A790C2AC4F721359 /* XYRotatedView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = XYRotatedView.m; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView/XYRotatedView.m; sourceTree = SOURCE_ROOT; }; | ||
104 | + 3ED94C959D56902AFE93BD06 /* XYPieChartView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = XYPieChartView.h; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView/XYPieChartView.h; sourceTree = SOURCE_ROOT; }; | ||
105 | + 44204E0983A9F8C22AFD69F9 /* UIView+extension.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "UIView+extension.h"; path = "poolsdk_file/poolsdk_xipu/SDK/ResourceCode/UIView+extension.h"; sourceTree = SOURCE_ROOT; }; | ||
106 | + 4FCE454BA44F6CB4494BBA4A /* MGBSHud.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MGBSHud.framework; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MGBSHudFramework/MGBSHud.framework; sourceTree = SOURCE_ROOT; }; | ||
107 | + 533C4F378D03742608E60D83 /* XYRenderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = XYRenderView.m; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView/XYRenderView.m; sourceTree = SOURCE_ROOT; }; | ||
108 | + 60BB4D1682AC2DC26E5526AA /* XpSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XpSDK.framework; path = poolsdk_file/poolsdk_xipu/SDK/XpSDK.framework; sourceTree = SOURCE_ROOT; }; | ||
109 | + 66AA42DD8FC39BDB25ADB114 /* XYCommon.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = XYCommon.m; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView/XYCommon.m; sourceTree = SOURCE_ROOT; }; | ||
110 | + 670744858A16F1E10BED4D2F /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = "<absolute>"; }; | ||
111 | + 6E7F426C95B67B9394D1957D /* XYCommon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = XYCommon.h; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView/XYCommon.h; sourceTree = SOURCE_ROOT; }; | ||
112 | + 70DC4E4DBE2136652B461E82 /* XYRotatedView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = XYRotatedView.h; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView/XYRotatedView.h; sourceTree = SOURCE_ROOT; }; | ||
113 | + 7D4C4C799DEA8F12A8F30A46 /* WindowView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = WindowView.m; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/WindowView.m; sourceTree = SOURCE_ROOT; }; | ||
114 | + 8425EC191F0E3CBD00B0D868 /* PoolSdk.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = PoolSdk.framework; sourceTree = "<group>"; }; | ||
115 | + 847EE5E01EE9007E003A4B7B /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = "<group>"; }; | ||
116 | + 847EE5E11EE9007E003A4B7B /* MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainViewController.m; sourceTree = "<group>"; }; | ||
117 | + 8484E4F11EE7E0DC00B402D1 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; }; | ||
118 | + 8484E4F21EE7E0DC00B402D1 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; }; | ||
119 | + 8484E4F31EE7E0DC00B402D1 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; }; | ||
120 | + 8484E4F41EE7E0DC00B402D1 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; }; | ||
121 | + 8484E4FB1EE7E1D800B402D1 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = ../../../../../../../../usr/lib/libsqlite3.dylib; sourceTree = "<group>"; }; | ||
122 | + 8484E4FD1EE7E1F700B402D1 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; | ||
123 | + 8484E4FF1EE7E20C00B402D1 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; | ||
124 | + 8484E5011EE7E21F00B402D1 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; | ||
125 | + 8484E5031EE7E24400B402D1 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; | ||
126 | + 8484E5051EE7E24A00B402D1 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; | ||
127 | + 8484E5071EE7E25600B402D1 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; | ||
128 | + 8484E5091EE7E26200B402D1 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; | ||
129 | + 8484E50B1EE7E27100B402D1 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; | ||
130 | + 8484E50D1EE7E28000B402D1 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; | ||
131 | + 8484E50F1EE7E29A00B402D1 /* libc++.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.1.dylib"; path = "../../../../../../../../usr/lib/libc++.1.dylib"; sourceTree = "<group>"; }; | ||
132 | + 8484E5111EE7E2B800B402D1 /* libz.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.1.dylib; path = ../../../../../../../../usr/lib/libz.1.dylib; sourceTree = "<group>"; }; | ||
133 | + 8484E5131EE7E2DE00B402D1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; | ||
134 | + 8484E5151EE7E36800B402D1 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; | ||
135 | + 84F0C99E1FA09F810040A023 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; | ||
136 | + 977A46CA88A90F03FC5F2803 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = /usr/lib/libresolv.dylib; sourceTree = "<absolute>"; }; | ||
137 | + A248420B81CF10FBA8286985 /* WindowView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WindowView.h; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/WindowView.h; sourceTree = SOURCE_ROOT; }; | ||
138 | + A3C24294BC587B180D4FAC5B /* JANALYTICSService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JANALYTICSService.h; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics/JANALYTICSService.h; sourceTree = SOURCE_ROOT; }; | ||
139 | + A95249E2B785F433C16E09F8 /* SDKInterface.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDKInterface.m; path = poolsdk_file/poolsdk_xipu/SDK/SDKInterface.m; sourceTree = SOURCE_ROOT; }; | ||
140 | + B01B4227837DFD459FB4745F /* jcore-ios-1.1.5.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "jcore-ios-1.1.5.a"; path = "poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics/jcore-ios-1.1.5.a"; sourceTree = SOURCE_ROOT; }; | ||
141 | + B67F46B0AB01BC8F30D0DD2A /* fackCode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fackCode.h; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/fackCode.h; sourceTree = SOURCE_ROOT; }; | ||
142 | + B769446CB4990B0D877A6DDC /* UIView+extension.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "UIView+extension.m"; path = "poolsdk_file/poolsdk_xipu/SDK/ResourceCode/UIView+extension.m"; sourceTree = SOURCE_ROOT; }; | ||
143 | + BB5F3C881C1811BC00DA339D /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
144 | + BB5F3C8D1C1811BC00DA339D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; | ||
145 | + BB5F3C961C1811BC00DA339D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; | ||
146 | + BB5F3C9B1C1811BC00DA339D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; }; | ||
147 | + BB5F3CA11C1811BC00DA339D /* DemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
148 | + BB5F3CA61C1811BC00DA339D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | ||
149 | + BB5F3CA71C1811BC00DA339D /* DemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoTests.m; sourceTree = "<group>"; }; | ||
150 | + CD484B898BDF5F21ED20EF1F /* JANALYTICSEventObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JANALYTICSEventObject.h; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics/JANALYTICSEventObject.h; sourceTree = SOURCE_ROOT; }; | ||
151 | + D366468492FF60FB3E21CF13 /* XPResource.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = XPResource.bundle; path = poolsdk_file/poolsdk_xipu/SDK/XPResource.bundle; sourceTree = SOURCE_ROOT; }; | ||
152 | + E7D24D03B3D638309F02B3CE /* MGBSHudBundle.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = MGBSHudBundle.bundle; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MGBSHudFramework/MGBSHudBundle.bundle; sourceTree = SOURCE_ROOT; }; | ||
153 | + EBFB427996200FC54A3045DB /* XYPieChartView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = XYPieChartView.m; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView/XYPieChartView.m; sourceTree = SOURCE_ROOT; }; | ||
154 | + EC434797A41AC5D23300700C /* PieChart.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = PieChart.xcassets; path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView/PieChart.xcassets; sourceTree = SOURCE_ROOT; }; | ||
155 | +/* End PBXFileReference section */ | ||
156 | + | ||
157 | +/* Begin PBXFrameworksBuildPhase section */ | ||
158 | + BB5F3C851C1811BC00DA339D /* Frameworks */ = { | ||
159 | + isa = PBXFrameworksBuildPhase; | ||
160 | + buildActionMask = 2147483647; | ||
161 | + files = ( | ||
162 | + 84F0C99F1FA09F810040A023 /* libz.tbd in Frameworks */, | ||
163 | + 8484E5161EE7E36800B402D1 /* SystemConfiguration.framework in Frameworks */, | ||
164 | + 8484E4FC1EE7E1D800B402D1 /* libsqlite3.dylib in Frameworks */, | ||
165 | + 8484E5121EE7E2B800B402D1 /* libz.1.dylib in Frameworks */, | ||
166 | + 8484E5101EE7E29A00B402D1 /* libc++.1.dylib in Frameworks */, | ||
167 | + 8484E5001EE7E20C00B402D1 /* CFNetwork.framework in Frameworks */, | ||
168 | + 8484E5061EE7E24A00B402D1 /* CoreMotion.framework in Frameworks */, | ||
169 | + 8484E5021EE7E21F00B402D1 /* UIKit.framework in Frameworks */, | ||
170 | + 8484E50C1EE7E27100B402D1 /* CoreGraphics.framework in Frameworks */, | ||
171 | + 8484E5081EE7E25600B402D1 /* CoreText.framework in Frameworks */, | ||
172 | + 8484E50E1EE7E28000B402D1 /* QuartzCore.framework in Frameworks */, | ||
173 | + 8484E5141EE7E2DE00B402D1 /* Foundation.framework in Frameworks */, | ||
174 | + 8484E50A1EE7E26200B402D1 /* Security.framework in Frameworks */, | ||
175 | + 8484E5041EE7E24400B402D1 /* StoreKit.framework in Frameworks */, | ||
176 | + 8425EC1A1F0E3CBD00B0D868 /* PoolSdk.framework in Frameworks */, | ||
177 | + 8484E4FE1EE7E1F700B402D1 /* CoreTelephony.framework in Frameworks */, | ||
178 | + FED24FFF8CD5ED3018ED195C /* janalytics-ios-1.1.3.a in Frameworks */, | ||
179 | + 66A643648B8D01F6C74F9250 /* jcore-ios-1.1.5.a in Frameworks */, | ||
180 | + 59E74770A02276B354EC89A5 /* MGBSHud.framework in Frameworks */, | ||
181 | + 62494352808F98BB9C4C41D8 /* XpSDK.framework in Frameworks */, | ||
182 | + 3CB147188BBF0C063422B202 /* AdSupport.framework in Frameworks */, | ||
183 | + 062345E1ABBB2C3A1EA9E1F2 /* libz.dylib in Frameworks */, | ||
184 | + E8D04121932CC01CB18679F1 /* libresolv.dylib in Frameworks */, | ||
185 | + ); | ||
186 | + runOnlyForDeploymentPostprocessing = 0; | ||
187 | + }; | ||
188 | + BB5F3C9E1C1811BC00DA339D /* Frameworks */ = { | ||
189 | + isa = PBXFrameworksBuildPhase; | ||
190 | + buildActionMask = 2147483647; | ||
191 | + files = ( | ||
192 | + 85C04DF3BFE09FFF96EBA77A /* janalytics-ios-1.1.3.a in Frameworks */, | ||
193 | + 5E394907BA3B085B67618D42 /* jcore-ios-1.1.5.a in Frameworks */, | ||
194 | + FC3B468EAE1A5CC796F20029 /* MGBSHud.framework in Frameworks */, | ||
195 | + C539499BBF90B8D50986C190 /* XpSDK.framework in Frameworks */, | ||
196 | + 56204E5EA4C3440A19D43D1D /* AdSupport.framework in Frameworks */, | ||
197 | + 56E74E558ECB8D40CEA1B6EF /* libz.dylib in Frameworks */, | ||
198 | + 71294E4DA73F36A2288EA87B /* libresolv.dylib in Frameworks */, | ||
199 | + ); | ||
200 | + runOnlyForDeploymentPostprocessing = 0; | ||
201 | + }; | ||
202 | +/* End PBXFrameworksBuildPhase section */ | ||
203 | + | ||
204 | +/* Begin PBXGroup section */ | ||
205 | + 3BD745448926286BB529B20C /* MGBSHudFramework */ = { | ||
206 | + isa = PBXGroup; | ||
207 | + children = ( | ||
208 | + 4FCE454BA44F6CB4494BBA4A /* MGBSHud.framework */, | ||
209 | + E7D24D03B3D638309F02B3CE /* MGBSHudBundle.bundle */, | ||
210 | + ); | ||
211 | + name = MGBSHudFramework; | ||
212 | + path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MGBSHudFramework; | ||
213 | + sourceTree = SOURCE_ROOT; | ||
214 | + }; | ||
215 | + 5F36493A8587902411A078CB /* Frameworks */ = { | ||
216 | + isa = PBXGroup; | ||
217 | + children = ( | ||
218 | + 84F0C99E1FA09F810040A023 /* libz.tbd */, | ||
219 | + 140841E5B239D3B5760E985F /* AdSupport.framework */, | ||
220 | + ); | ||
221 | + name = Frameworks; | ||
222 | + sourceTree = "<group>"; | ||
223 | + }; | ||
224 | + 77D9440780B15FA42220F2A5 /* Libraries */ = { | ||
225 | + isa = PBXGroup; | ||
226 | + children = ( | ||
227 | + 670744858A16F1E10BED4D2F /* libz.dylib */, | ||
228 | + 977A46CA88A90F03FC5F2803 /* libresolv.dylib */, | ||
229 | + ); | ||
230 | + name = Libraries; | ||
231 | + sourceTree = "<group>"; | ||
232 | + }; | ||
233 | + 8476DF631C4DD70500EC42BA /* poolsdk_file */ = { | ||
234 | + isa = PBXGroup; | ||
235 | + children = ( | ||
236 | + ); | ||
237 | + name = poolsdk_file; | ||
238 | + sourceTree = "<group>"; | ||
239 | + }; | ||
240 | + 9FAA4C389D3997D4813CD6A8 /* JGStatistics */ = { | ||
241 | + isa = PBXGroup; | ||
242 | + children = ( | ||
243 | + 20DA476E8534421C70684D5F /* janalytics-ios-1.1.3.a */, | ||
244 | + A3C24294BC587B180D4FAC5B /* JANALYTICSService.h */, | ||
245 | + CD484B898BDF5F21ED20EF1F /* JANALYTICSEventObject.h */, | ||
246 | + B01B4227837DFD459FB4745F /* jcore-ios-1.1.5.a */, | ||
247 | + ); | ||
248 | + name = JGStatistics; | ||
249 | + path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics; | ||
250 | + sourceTree = SOURCE_ROOT; | ||
251 | + }; | ||
252 | + A0EA44058D9D904443DB0C01 /* SDK */ = { | ||
253 | + isa = PBXGroup; | ||
254 | + children = ( | ||
255 | + 2ADA47C2A7A76E56A793B5F9 /* SDKInterface.h */, | ||
256 | + 15454ABBB8A907B323BB22F1 /* pool_setting */, | ||
257 | + A95249E2B785F433C16E09F8 /* SDKInterface.m */, | ||
258 | + BAF04CC6B0E99F3AFE4063BD /* ResourceCode */, | ||
259 | + D366468492FF60FB3E21CF13 /* XPResource.bundle */, | ||
260 | + 60BB4D1682AC2DC26E5526AA /* XpSDK.framework */, | ||
261 | + ); | ||
262 | + name = SDK; | ||
263 | + path = poolsdk_file/poolsdk_xipu/SDK; | ||
264 | + sourceTree = SOURCE_ROOT; | ||
265 | + }; | ||
266 | + BAF04CC6B0E99F3AFE4063BD /* ResourceCode */ = { | ||
267 | + isa = PBXGroup; | ||
268 | + children = ( | ||
269 | + B67F46B0AB01BC8F30D0DD2A /* fackCode.h */, | ||
270 | + A248420B81CF10FBA8286985 /* WindowView.h */, | ||
271 | + 1D654BEBA260D144E8633F22 /* fackCode.m */, | ||
272 | + 7D4C4C799DEA8F12A8F30A46 /* WindowView.m */, | ||
273 | + B769446CB4990B0D877A6DDC /* UIView+extension.m */, | ||
274 | + 44204E0983A9F8C22AFD69F9 /* UIView+extension.h */, | ||
275 | + 9FAA4C389D3997D4813CD6A8 /* JGStatistics */, | ||
276 | + 3BD745448926286BB529B20C /* MGBSHudFramework */, | ||
277 | + FD554497B71E4F8FEDC9E5F0 /* MMCategory */, | ||
278 | + CDD84C40A9CF4231DD162B10 /* PieChartView */, | ||
279 | + ); | ||
280 | + name = ResourceCode; | ||
281 | + path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode; | ||
282 | + sourceTree = SOURCE_ROOT; | ||
283 | + }; | ||
284 | + BB5F3C7F1C1811BC00DA339D = { | ||
285 | + isa = PBXGroup; | ||
286 | + children = ( | ||
287 | + 8484E5151EE7E36800B402D1 /* SystemConfiguration.framework */, | ||
288 | + 8484E5131EE7E2DE00B402D1 /* Foundation.framework */, | ||
289 | + 8484E5111EE7E2B800B402D1 /* libz.1.dylib */, | ||
290 | + 8484E50F1EE7E29A00B402D1 /* libc++.1.dylib */, | ||
291 | + 8484E50D1EE7E28000B402D1 /* QuartzCore.framework */, | ||
292 | + 8484E50B1EE7E27100B402D1 /* CoreGraphics.framework */, | ||
293 | + 8484E5091EE7E26200B402D1 /* Security.framework */, | ||
294 | + 8484E5071EE7E25600B402D1 /* CoreText.framework */, | ||
295 | + 8484E5051EE7E24A00B402D1 /* CoreMotion.framework */, | ||
296 | + 8484E5031EE7E24400B402D1 /* StoreKit.framework */, | ||
297 | + 8484E5011EE7E21F00B402D1 /* UIKit.framework */, | ||
298 | + 8484E4FF1EE7E20C00B402D1 /* CFNetwork.framework */, | ||
299 | + 8484E4FD1EE7E1F700B402D1 /* CoreTelephony.framework */, | ||
300 | + 8484E4FB1EE7E1D800B402D1 /* libsqlite3.dylib */, | ||
301 | + 8476DF631C4DD70500EC42BA /* poolsdk_file */, | ||
302 | + BB5F3C8A1C1811BC00DA339D /* Demo */, | ||
303 | + BB5F3CA41C1811BC00DA339D /* DemoTests */, | ||
304 | + BB5F3C891C1811BC00DA339D /* Products */, | ||
305 | + A0EA44058D9D904443DB0C01 /* SDK */, | ||
306 | + 5F36493A8587902411A078CB /* Frameworks */, | ||
307 | + 77D9440780B15FA42220F2A5 /* Libraries */, | ||
308 | + ); | ||
309 | + sourceTree = "<group>"; | ||
310 | + }; | ||
311 | + BB5F3C891C1811BC00DA339D /* Products */ = { | ||
312 | + isa = PBXGroup; | ||
313 | + children = ( | ||
314 | + BB5F3C881C1811BC00DA339D /* Demo.app */, | ||
315 | + BB5F3CA11C1811BC00DA339D /* DemoTests.xctest */, | ||
316 | + ); | ||
317 | + name = Products; | ||
318 | + sourceTree = "<group>"; | ||
319 | + }; | ||
320 | + BB5F3C8A1C1811BC00DA339D /* Demo */ = { | ||
321 | + isa = PBXGroup; | ||
322 | + children = ( | ||
323 | + 8425EC191F0E3CBD00B0D868 /* PoolSdk.framework */, | ||
324 | + 8484E4F11EE7E0DC00B402D1 /* AppDelegate.h */, | ||
325 | + 8484E4F21EE7E0DC00B402D1 /* AppDelegate.m */, | ||
326 | + 8484E4F31EE7E0DC00B402D1 /* ViewController.h */, | ||
327 | + 8484E4F41EE7E0DC00B402D1 /* ViewController.m */, | ||
328 | + 847EE5E01EE9007E003A4B7B /* MainViewController.h */, | ||
329 | + 847EE5E11EE9007E003A4B7B /* MainViewController.m */, | ||
330 | + BB5F3C951C1811BC00DA339D /* Main.storyboard */, | ||
331 | + BB5F3C9A1C1811BC00DA339D /* LaunchScreen.xib */, | ||
332 | + BB5F3C8B1C1811BC00DA339D /* Supporting Files */, | ||
333 | + ); | ||
334 | + path = Demo; | ||
335 | + sourceTree = "<group>"; | ||
336 | + }; | ||
337 | + BB5F3C8B1C1811BC00DA339D /* Supporting Files */ = { | ||
338 | + isa = PBXGroup; | ||
339 | + children = ( | ||
340 | + BB5F3C8D1C1811BC00DA339D /* main.m */, | ||
341 | + ); | ||
342 | + name = "Supporting Files"; | ||
343 | + sourceTree = "<group>"; | ||
344 | + }; | ||
345 | + BB5F3CA41C1811BC00DA339D /* DemoTests */ = { | ||
346 | + isa = PBXGroup; | ||
347 | + children = ( | ||
348 | + BB5F3CA71C1811BC00DA339D /* DemoTests.m */, | ||
349 | + BB5F3CA51C1811BC00DA339D /* Supporting Files */, | ||
350 | + ); | ||
351 | + path = DemoTests; | ||
352 | + sourceTree = "<group>"; | ||
353 | + }; | ||
354 | + BB5F3CA51C1811BC00DA339D /* Supporting Files */ = { | ||
355 | + isa = PBXGroup; | ||
356 | + children = ( | ||
357 | + BB5F3CA61C1811BC00DA339D /* Info.plist */, | ||
358 | + ); | ||
359 | + name = "Supporting Files"; | ||
360 | + sourceTree = "<group>"; | ||
361 | + }; | ||
362 | + CDD84C40A9CF4231DD162B10 /* PieChartView */ = { | ||
363 | + isa = PBXGroup; | ||
364 | + children = ( | ||
365 | + 533C4F378D03742608E60D83 /* XYRenderView.m */, | ||
366 | + 1D854BA0A305791979583706 /* XYRenderView.h */, | ||
367 | + EBFB427996200FC54A3045DB /* XYPieChartView.m */, | ||
368 | + 3ED94C959D56902AFE93BD06 /* XYPieChartView.h */, | ||
369 | + 66AA42DD8FC39BDB25ADB114 /* XYCommon.m */, | ||
370 | + 70DC4E4DBE2136652B461E82 /* XYRotatedView.h */, | ||
371 | + 6E7F426C95B67B9394D1957D /* XYCommon.h */, | ||
372 | + 31144476A790C2AC4F721359 /* XYRotatedView.m */, | ||
373 | + EC434797A41AC5D23300700C /* PieChart.xcassets */, | ||
374 | + ); | ||
375 | + name = PieChartView; | ||
376 | + path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView; | ||
377 | + sourceTree = SOURCE_ROOT; | ||
378 | + }; | ||
379 | + FD554497B71E4F8FEDC9E5F0 /* MMCategory */ = { | ||
380 | + isa = PBXGroup; | ||
381 | + children = ( | ||
382 | + ); | ||
383 | + name = MMCategory; | ||
384 | + path = poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MMCategory; | ||
385 | + sourceTree = SOURCE_ROOT; | ||
386 | + }; | ||
387 | +/* End PBXGroup section */ | ||
388 | + | ||
389 | +/* Begin PBXNativeTarget section */ | ||
390 | + BB5F3C871C1811BC00DA339D /* Demo */ = { | ||
391 | + isa = PBXNativeTarget; | ||
392 | + buildConfigurationList = BB5F3CAB1C1811BC00DA339D /* Build configuration list for PBXNativeTarget "Demo" */; | ||
393 | + buildPhases = ( | ||
394 | + BB5F3C841C1811BC00DA339D /* Sources */, | ||
395 | + BB5F3C851C1811BC00DA339D /* Frameworks */, | ||
396 | + BB5F3C861C1811BC00DA339D /* Resources */, | ||
397 | + 84398BFB1C4C83EC0082D774 /* Embed Frameworks */, | ||
398 | + ); | ||
399 | + buildRules = ( | ||
400 | + ); | ||
401 | + dependencies = ( | ||
402 | + ); | ||
403 | + name = Demo; | ||
404 | + productName = Demo; | ||
405 | + productReference = BB5F3C881C1811BC00DA339D /* Demo.app */; | ||
406 | + productType = "com.apple.product-type.application"; | ||
407 | + }; | ||
408 | + BB5F3CA01C1811BC00DA339D /* DemoTests */ = { | ||
409 | + isa = PBXNativeTarget; | ||
410 | + buildConfigurationList = BB5F3CAE1C1811BC00DA339D /* Build configuration list for PBXNativeTarget "DemoTests" */; | ||
411 | + buildPhases = ( | ||
412 | + BB5F3C9D1C1811BC00DA339D /* Sources */, | ||
413 | + BB5F3C9E1C1811BC00DA339D /* Frameworks */, | ||
414 | + BB5F3C9F1C1811BC00DA339D /* Resources */, | ||
415 | + ); | ||
416 | + buildRules = ( | ||
417 | + ); | ||
418 | + dependencies = ( | ||
419 | + BB5F3CA31C1811BC00DA339D /* PBXTargetDependency */, | ||
420 | + ); | ||
421 | + name = DemoTests; | ||
422 | + productName = DemoTests; | ||
423 | + productReference = BB5F3CA11C1811BC00DA339D /* DemoTests.xctest */; | ||
424 | + productType = "com.apple.product-type.bundle.unit-test"; | ||
425 | + }; | ||
426 | +/* End PBXNativeTarget section */ | ||
427 | + | ||
428 | +/* Begin PBXProject section */ | ||
429 | + BB5F3C801C1811BC00DA339D /* Project object */ = { | ||
430 | + isa = PBXProject; | ||
431 | + attributes = { | ||
432 | + LastUpgradeCheck = 0640; | ||
433 | + ORGANIZATIONNAME = winFan; | ||
434 | + TargetAttributes = { | ||
435 | + BB5F3C871C1811BC00DA339D = { | ||
436 | + CreatedOnToolsVersion = 6.4; | ||
437 | + }; | ||
438 | + BB5F3CA01C1811BC00DA339D = { | ||
439 | + CreatedOnToolsVersion = 6.4; | ||
440 | + TestTargetID = BB5F3C871C1811BC00DA339D; | ||
441 | + }; | ||
442 | + }; | ||
443 | + }; | ||
444 | + buildConfigurationList = BB5F3C831C1811BC00DA339D /* Build configuration list for PBXProject "Demo_xipu" */; | ||
445 | + compatibilityVersion = "Xcode 3.2"; | ||
446 | + developmentRegion = English; | ||
447 | + hasScannedForEncodings = 0; | ||
448 | + knownRegions = ( | ||
449 | + en, | ||
450 | + Base, | ||
451 | + ); | ||
452 | + mainGroup = BB5F3C7F1C1811BC00DA339D; | ||
453 | + productRefGroup = BB5F3C891C1811BC00DA339D /* Products */; | ||
454 | + projectDirPath = ""; | ||
455 | + projectRoot = ""; | ||
456 | + targets = ( | ||
457 | + BB5F3C871C1811BC00DA339D /* Demo */, | ||
458 | + BB5F3CA01C1811BC00DA339D /* DemoTests */, | ||
459 | + ); | ||
460 | + }; | ||
461 | +/* End PBXProject section */ | ||
462 | + | ||
463 | +/* Begin PBXResourcesBuildPhase section */ | ||
464 | + BB5F3C861C1811BC00DA339D /* Resources */ = { | ||
465 | + isa = PBXResourcesBuildPhase; | ||
466 | + buildActionMask = 2147483647; | ||
467 | + files = ( | ||
468 | + BB5F3C971C1811BC00DA339D /* Main.storyboard in Resources */, | ||
469 | + BB5F3C9C1C1811BC00DA339D /* LaunchScreen.xib in Resources */, | ||
470 | + E3A648679F39E19D4DB52E5A /* pool_setting in Resources */, | ||
471 | + F69D4FC486A805D305FEDFA9 /* MGBSHudBundle.bundle in Resources */, | ||
472 | + 127444478785CA14E7328ED1 /* PieChart.xcassets in Resources */, | ||
473 | + 422C4A6EA9CA17F79D5EB241 /* XPResource.bundle in Resources */, | ||
474 | + ); | ||
475 | + runOnlyForDeploymentPostprocessing = 0; | ||
476 | + }; | ||
477 | + BB5F3C9F1C1811BC00DA339D /* Resources */ = { | ||
478 | + isa = PBXResourcesBuildPhase; | ||
479 | + buildActionMask = 2147483647; | ||
480 | + files = ( | ||
481 | + 64184F768F82486A1E3613B8 /* pool_setting in Resources */, | ||
482 | + 9188459BA6A0CA1391B1FBC6 /* MGBSHudBundle.bundle in Resources */, | ||
483 | + 2B8147E399B4D416BAA09CD3 /* PieChart.xcassets in Resources */, | ||
484 | + DFB2415285FE66C5C2252043 /* XPResource.bundle in Resources */, | ||
485 | + ); | ||
486 | + runOnlyForDeploymentPostprocessing = 0; | ||
487 | + }; | ||
488 | +/* End PBXResourcesBuildPhase section */ | ||
489 | + | ||
490 | +/* Begin PBXSourcesBuildPhase section */ | ||
491 | + BB5F3C841C1811BC00DA339D /* Sources */ = { | ||
492 | + isa = PBXSourcesBuildPhase; | ||
493 | + buildActionMask = 2147483647; | ||
494 | + files = ( | ||
495 | + 8484E4F51EE7E0DC00B402D1 /* AppDelegate.m in Sources */, | ||
496 | + 847EE5E21EE9007E003A4B7B /* MainViewController.m in Sources */, | ||
497 | + BB5F3C8E1C1811BC00DA339D /* main.m in Sources */, | ||
498 | + 8484E4F61EE7E0DC00B402D1 /* ViewController.m in Sources */, | ||
499 | + 3C2D4C2FB2D96D1F99C5A6C9 /* SDKInterface.m in Sources */, | ||
500 | + 13FD46848A3CE9D9E564946D /* fackCode.m in Sources */, | ||
501 | + 29B847B48A5485BBA979C37E /* WindowView.m in Sources */, | ||
502 | + A7AE42EF96A061B10279A235 /* UIView+extension.m in Sources */, | ||
503 | + FE8C4E4A977421AB7F93D60D /* XYRenderView.m in Sources */, | ||
504 | + 97734FA4943D07CDAA6ED1BA /* XYPieChartView.m in Sources */, | ||
505 | + 6F6D41F89A6F826A7E0B375A /* XYCommon.m in Sources */, | ||
506 | + 599C405BA8C060143D9D7888 /* XYRotatedView.m in Sources */, | ||
507 | + ); | ||
508 | + runOnlyForDeploymentPostprocessing = 0; | ||
509 | + }; | ||
510 | + BB5F3C9D1C1811BC00DA339D /* Sources */ = { | ||
511 | + isa = PBXSourcesBuildPhase; | ||
512 | + buildActionMask = 2147483647; | ||
513 | + files = ( | ||
514 | + BB5F3CA81C1811BC00DA339D /* DemoTests.m in Sources */, | ||
515 | + C07A4C128CE68CB25D747E88 /* SDKInterface.m in Sources */, | ||
516 | + 2B8547CA80D8BB38EA373D46 /* fackCode.m in Sources */, | ||
517 | + 267147A68AD62661516F573D /* WindowView.m in Sources */, | ||
518 | + 5FC24674978F969595C45038 /* UIView+extension.m in Sources */, | ||
519 | + 6F01485BB3F7DF232F9E1D13 /* XYRenderView.m in Sources */, | ||
520 | + 09AF4E77893C0BA8841245D0 /* XYPieChartView.m in Sources */, | ||
521 | + 1FC74435B2B0750A9DCEEB37 /* XYCommon.m in Sources */, | ||
522 | + DA8942D39DC50DCB14520E99 /* XYRotatedView.m in Sources */, | ||
523 | + ); | ||
524 | + runOnlyForDeploymentPostprocessing = 0; | ||
525 | + }; | ||
526 | +/* End PBXSourcesBuildPhase section */ | ||
527 | + | ||
528 | +/* Begin PBXTargetDependency section */ | ||
529 | + BB5F3CA31C1811BC00DA339D /* PBXTargetDependency */ = { | ||
530 | + isa = PBXTargetDependency; | ||
531 | + target = BB5F3C871C1811BC00DA339D /* Demo */; | ||
532 | + targetProxy = BB5F3CA21C1811BC00DA339D /* PBXContainerItemProxy */; | ||
533 | + }; | ||
534 | +/* End PBXTargetDependency section */ | ||
535 | + | ||
536 | +/* Begin PBXVariantGroup section */ | ||
537 | + BB5F3C951C1811BC00DA339D /* Main.storyboard */ = { | ||
538 | + isa = PBXVariantGroup; | ||
539 | + children = ( | ||
540 | + BB5F3C961C1811BC00DA339D /* Base */, | ||
541 | + ); | ||
542 | + name = Main.storyboard; | ||
543 | + sourceTree = "<group>"; | ||
544 | + }; | ||
545 | + BB5F3C9A1C1811BC00DA339D /* LaunchScreen.xib */ = { | ||
546 | + isa = PBXVariantGroup; | ||
547 | + children = ( | ||
548 | + BB5F3C9B1C1811BC00DA339D /* Base */, | ||
549 | + ); | ||
550 | + name = LaunchScreen.xib; | ||
551 | + sourceTree = "<group>"; | ||
552 | + }; | ||
553 | +/* End PBXVariantGroup section */ | ||
554 | + | ||
555 | +/* Begin XCBuildConfiguration section */ | ||
556 | + BB5F3CA91C1811BC00DA339D /* Debug */ = { | ||
557 | + isa = XCBuildConfiguration; | ||
558 | + buildSettings = { | ||
559 | + ALWAYS_SEARCH_USER_PATHS = NO; | ||
560 | + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = ""; | ||
561 | + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||
562 | + CLANG_CXX_LIBRARY = "libc++"; | ||
563 | + CLANG_ENABLE_MODULES = YES; | ||
564 | + CLANG_ENABLE_OBJC_ARC = YES; | ||
565 | + CLANG_WARN_BOOL_CONVERSION = YES; | ||
566 | + CLANG_WARN_CONSTANT_CONVERSION = YES; | ||
567 | + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||
568 | + CLANG_WARN_EMPTY_BODY = YES; | ||
569 | + CLANG_WARN_ENUM_CONVERSION = YES; | ||
570 | + CLANG_WARN_INT_CONVERSION = YES; | ||
571 | + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||
572 | + CLANG_WARN_UNREACHABLE_CODE = YES; | ||
573 | + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||
574 | + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||
575 | + COPY_PHASE_STRIP = NO; | ||
576 | + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||
577 | + ENABLE_BITCODE = NO; | ||
578 | + ENABLE_STRICT_OBJC_MSGSEND = YES; | ||
579 | + FRAMEWORK_SEARCH_PATHS = ( | ||
580 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
581 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MGBSHudFramework\"", | ||
582 | + ); | ||
583 | + GCC_C_LANGUAGE_STANDARD = gnu99; | ||
584 | + GCC_DYNAMIC_NO_PIC = NO; | ||
585 | + GCC_NO_COMMON_BLOCKS = YES; | ||
586 | + GCC_OPTIMIZATION_LEVEL = 0; | ||
587 | + GCC_PREPROCESSOR_DEFINITIONS = ( | ||
588 | + "DEBUG=1", | ||
589 | + "$(inherited)", | ||
590 | + ); | ||
591 | + GCC_SYMBOLS_PRIVATE_EXTERN = NO; | ||
592 | + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||
593 | + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||
594 | + GCC_WARN_UNDECLARED_SELECTOR = YES; | ||
595 | + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||
596 | + GCC_WARN_UNUSED_FUNCTION = YES; | ||
597 | + GCC_WARN_UNUSED_VARIABLE = YES; | ||
598 | + HEADER_SEARCH_PATHS = ( | ||
599 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
600 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode\"", | ||
601 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics\"", | ||
602 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MMCategory\"", | ||
603 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView\"", | ||
604 | + ); | ||
605 | + INFOPLIST_FILE = poolsdk_file/poolsdk_xipu/Info.plist; | ||
606 | + IPHONEOS_DEPLOYMENT_TARGET = 8.4; | ||
607 | + LIBRARY_SEARCH_PATHS = ( | ||
608 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
609 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics\"", | ||
610 | + ); | ||
611 | + MTL_ENABLE_DEBUG_INFO = YES; | ||
612 | + ONLY_ACTIVE_ARCH = YES; | ||
613 | + OTHER_LDFLAGS = "-ObjC"; | ||
614 | + PRODUCT_BUNDLE_IDENTIFIER = com.cangjianjianghu.cjjh; | ||
615 | + SDKROOT = iphoneos; | ||
616 | + }; | ||
617 | + name = Debug; | ||
618 | + }; | ||
619 | + BB5F3CAA1C1811BC00DA339D /* Release */ = { | ||
620 | + isa = XCBuildConfiguration; | ||
621 | + buildSettings = { | ||
622 | + ALWAYS_SEARCH_USER_PATHS = NO; | ||
623 | + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||
624 | + CLANG_CXX_LIBRARY = "libc++"; | ||
625 | + CLANG_ENABLE_MODULES = YES; | ||
626 | + CLANG_ENABLE_OBJC_ARC = YES; | ||
627 | + CLANG_WARN_BOOL_CONVERSION = YES; | ||
628 | + CLANG_WARN_CONSTANT_CONVERSION = YES; | ||
629 | + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||
630 | + CLANG_WARN_EMPTY_BODY = YES; | ||
631 | + CLANG_WARN_ENUM_CONVERSION = YES; | ||
632 | + CLANG_WARN_INT_CONVERSION = YES; | ||
633 | + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||
634 | + CLANG_WARN_UNREACHABLE_CODE = YES; | ||
635 | + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||
636 | + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||
637 | + COPY_PHASE_STRIP = NO; | ||
638 | + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||
639 | + ENABLE_BITCODE = NO; | ||
640 | + ENABLE_NS_ASSERTIONS = NO; | ||
641 | + ENABLE_STRICT_OBJC_MSGSEND = YES; | ||
642 | + FRAMEWORK_SEARCH_PATHS = ( | ||
643 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
644 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MGBSHudFramework\"", | ||
645 | + ); | ||
646 | + GCC_C_LANGUAGE_STANDARD = gnu99; | ||
647 | + GCC_NO_COMMON_BLOCKS = YES; | ||
648 | + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||
649 | + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||
650 | + GCC_WARN_UNDECLARED_SELECTOR = YES; | ||
651 | + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||
652 | + GCC_WARN_UNUSED_FUNCTION = YES; | ||
653 | + GCC_WARN_UNUSED_VARIABLE = YES; | ||
654 | + HEADER_SEARCH_PATHS = ( | ||
655 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
656 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode\"", | ||
657 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics\"", | ||
658 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MMCategory\"", | ||
659 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView\"", | ||
660 | + ); | ||
661 | + INFOPLIST_FILE = poolsdk_file/poolsdk_xipu/Info.plist; | ||
662 | + IPHONEOS_DEPLOYMENT_TARGET = 8.4; | ||
663 | + LIBRARY_SEARCH_PATHS = ( | ||
664 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
665 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics\"", | ||
666 | + ); | ||
667 | + MTL_ENABLE_DEBUG_INFO = NO; | ||
668 | + OTHER_LDFLAGS = "-ObjC"; | ||
669 | + PRODUCT_BUNDLE_IDENTIFIER = com.cangjianjianghu.cjjh; | ||
670 | + SDKROOT = iphoneos; | ||
671 | + VALIDATE_PRODUCT = YES; | ||
672 | + }; | ||
673 | + name = Release; | ||
674 | + }; | ||
675 | + BB5F3CAC1C1811BC00DA339D /* Debug */ = { | ||
676 | + isa = XCBuildConfiguration; | ||
677 | + buildSettings = { | ||
678 | + CODE_SIGN_IDENTITY = "iPhone Developer: Xu Cao (YQXG4Q6H57)"; | ||
679 | + DEAD_CODE_STRIPPING = NO; | ||
680 | + ENABLE_BITCODE = NO; | ||
681 | + FRAMEWORK_SEARCH_PATHS = ( | ||
682 | + "$(inherited)", | ||
683 | + "$(PROJECT_DIR)/Demo", | ||
684 | + "$(PROJECT_DIR)/poolsdk_file/poolsdk", | ||
685 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
686 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MGBSHudFramework\"", | ||
687 | + ); | ||
688 | + HEADER_SEARCH_PATHS = ( | ||
689 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
690 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode\"", | ||
691 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics\"", | ||
692 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MMCategory\"", | ||
693 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView\"", | ||
694 | + ); | ||
695 | + INFOPLIST_FILE = poolsdk_file/poolsdk_xipu/Info.plist; | ||
696 | + IPHONEOS_DEPLOYMENT_TARGET = 8.1; | ||
697 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | ||
698 | + LIBRARY_SEARCH_PATHS = ( | ||
699 | + "$(inherited)", | ||
700 | + "$(PROJECT_DIR)/Demo", | ||
701 | + "$(PROJECT_DIR)/poolsdk_file/poolsdk", | ||
702 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
703 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics\"", | ||
704 | + ); | ||
705 | + ONLY_ACTIVE_ARCH = NO; | ||
706 | + OTHER_LDFLAGS = "-ObjC"; | ||
707 | + PRODUCT_BUNDLE_IDENTIFIER = com.cangjianjianghu.cjjh; | ||
708 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
709 | + PROVISIONING_PROFILE = "ffdc584b-0e7d-46fc-ab64-d1cd9def2f2d"; | ||
710 | + TARGETED_DEVICE_FAMILY = 2; | ||
711 | + VALID_ARCHS = "arm64 armv7s"; | ||
712 | + }; | ||
713 | + name = Debug; | ||
714 | + }; | ||
715 | + BB5F3CAD1C1811BC00DA339D /* Release */ = { | ||
716 | + isa = XCBuildConfiguration; | ||
717 | + buildSettings = { | ||
718 | + CODE_SIGN_IDENTITY = "iPhone Developer: Xu Cao (YQXG4Q6H57)"; | ||
719 | + DEAD_CODE_STRIPPING = NO; | ||
720 | + ENABLE_BITCODE = NO; | ||
721 | + FRAMEWORK_SEARCH_PATHS = ( | ||
722 | + "$(inherited)", | ||
723 | + "$(PROJECT_DIR)/Demo", | ||
724 | + "$(PROJECT_DIR)/poolsdk_file/poolsdk", | ||
725 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
726 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MGBSHudFramework\"", | ||
727 | + ); | ||
728 | + HEADER_SEARCH_PATHS = ( | ||
729 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
730 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode\"", | ||
731 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics\"", | ||
732 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MMCategory\"", | ||
733 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView\"", | ||
734 | + ); | ||
735 | + INFOPLIST_FILE = poolsdk_file/poolsdk_xipu/Info.plist; | ||
736 | + IPHONEOS_DEPLOYMENT_TARGET = 8.1; | ||
737 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | ||
738 | + LIBRARY_SEARCH_PATHS = ( | ||
739 | + "$(inherited)", | ||
740 | + "$(PROJECT_DIR)/Demo", | ||
741 | + "$(PROJECT_DIR)/poolsdk_file/poolsdk", | ||
742 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
743 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics\"", | ||
744 | + ); | ||
745 | + ONLY_ACTIVE_ARCH = NO; | ||
746 | + OTHER_LDFLAGS = "-ObjC"; | ||
747 | + PRODUCT_BUNDLE_IDENTIFIER = com.cangjianjianghu.cjjh; | ||
748 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
749 | + PROVISIONING_PROFILE = "ffdc584b-0e7d-46fc-ab64-d1cd9def2f2d"; | ||
750 | + TARGETED_DEVICE_FAMILY = 2; | ||
751 | + VALID_ARCHS = "arm64 armv7s"; | ||
752 | + }; | ||
753 | + name = Release; | ||
754 | + }; | ||
755 | + BB5F3CAF1C1811BC00DA339D /* Debug */ = { | ||
756 | + isa = XCBuildConfiguration; | ||
757 | + buildSettings = { | ||
758 | + BUNDLE_LOADER = "$(TEST_HOST)"; | ||
759 | + ENABLE_BITCODE = NO; | ||
760 | + FRAMEWORK_SEARCH_PATHS = ( | ||
761 | + "$(SDKROOT)/Developer/Library/Frameworks", | ||
762 | + "$(inherited)", | ||
763 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
764 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MGBSHudFramework\"", | ||
765 | + ); | ||
766 | + GCC_PREPROCESSOR_DEFINITIONS = ( | ||
767 | + "DEBUG=1", | ||
768 | + "$(inherited)", | ||
769 | + ); | ||
770 | + HEADER_SEARCH_PATHS = ( | ||
771 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
772 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode\"", | ||
773 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics\"", | ||
774 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MMCategory\"", | ||
775 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView\"", | ||
776 | + ); | ||
777 | + INFOPLIST_FILE = poolsdk_file/poolsdk_xipu/Info.plist; | ||
778 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
779 | + LIBRARY_SEARCH_PATHS = ( | ||
780 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
781 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics\"", | ||
782 | + ); | ||
783 | + OTHER_LDFLAGS = "-ObjC"; | ||
784 | + PRODUCT_BUNDLE_IDENTIFIER = com.cangjianjianghu.cjjh; | ||
785 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
786 | + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Demo.app/Demo"; | ||
787 | + }; | ||
788 | + name = Debug; | ||
789 | + }; | ||
790 | + BB5F3CB01C1811BC00DA339D /* Release */ = { | ||
791 | + isa = XCBuildConfiguration; | ||
792 | + buildSettings = { | ||
793 | + BUNDLE_LOADER = "$(TEST_HOST)"; | ||
794 | + ENABLE_BITCODE = NO; | ||
795 | + FRAMEWORK_SEARCH_PATHS = ( | ||
796 | + "$(SDKROOT)/Developer/Library/Frameworks", | ||
797 | + "$(inherited)", | ||
798 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
799 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MGBSHudFramework\"", | ||
800 | + ); | ||
801 | + HEADER_SEARCH_PATHS = ( | ||
802 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
803 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode\"", | ||
804 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics\"", | ||
805 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/MMCategory\"", | ||
806 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/PieChartView\"", | ||
807 | + ); | ||
808 | + INFOPLIST_FILE = poolsdk_file/poolsdk_xipu/Info.plist; | ||
809 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
810 | + LIBRARY_SEARCH_PATHS = ( | ||
811 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK\"", | ||
812 | + "\"$(PROJECT_DIR)/poolsdk_file/poolsdk_xipu/SDK/ResourceCode/JGStatistics\"", | ||
813 | + ); | ||
814 | + OTHER_LDFLAGS = "-ObjC"; | ||
815 | + PRODUCT_BUNDLE_IDENTIFIER = com.cangjianjianghu.cjjh; | ||
816 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
817 | + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Demo.app/Demo"; | ||
818 | + }; | ||
819 | + name = Release; | ||
820 | + }; | ||
821 | +/* End XCBuildConfiguration section */ | ||
822 | + | ||
823 | +/* Begin XCConfigurationList section */ | ||
824 | + BB5F3C831C1811BC00DA339D /* Build configuration list for PBXProject "Demo_xipu" */ = { | ||
825 | + isa = XCConfigurationList; | ||
826 | + buildConfigurations = ( | ||
827 | + BB5F3CA91C1811BC00DA339D /* Debug */, | ||
828 | + BB5F3CAA1C1811BC00DA339D /* Release */, | ||
829 | + ); | ||
830 | + defaultConfigurationIsVisible = 0; | ||
831 | + defaultConfigurationName = Release; | ||
832 | + }; | ||
833 | + BB5F3CAB1C1811BC00DA339D /* Build configuration list for PBXNativeTarget "Demo" */ = { | ||
834 | + isa = XCConfigurationList; | ||
835 | + buildConfigurations = ( | ||
836 | + BB5F3CAC1C1811BC00DA339D /* Debug */, | ||
837 | + BB5F3CAD1C1811BC00DA339D /* Release */, | ||
838 | + ); | ||
839 | + defaultConfigurationIsVisible = 0; | ||
840 | + defaultConfigurationName = Release; | ||
841 | + }; | ||
842 | + BB5F3CAE1C1811BC00DA339D /* Build configuration list for PBXNativeTarget "DemoTests" */ = { | ||
843 | + isa = XCConfigurationList; | ||
844 | + buildConfigurations = ( | ||
845 | + BB5F3CAF1C1811BC00DA339D /* Debug */, | ||
846 | + BB5F3CB01C1811BC00DA339D /* Release */, | ||
847 | + ); | ||
848 | + defaultConfigurationIsVisible = 0; | ||
849 | + defaultConfigurationName = Release; | ||
850 | + }; | ||
851 | +/* End XCConfigurationList section */ | ||
852 | + }; | ||
853 | + rootObject = BB5F3C801C1811BC00DA339D /* Project object */; | ||
854 | +} |
1 | +{ | ||
2 | + "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "D1584AEF25B5C21395F515B62C90B71E0ACB26B2", | ||
3 | + "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { | ||
4 | + "5b13317c-0110-4367-8746-06bc6aadd3cd++2397" : { | ||
5 | + | ||
6 | + } | ||
7 | + }, | ||
8 | + "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { | ||
9 | + "D1584AEF25B5C21395F515B62C90B71E0ACB26B2" : 0, | ||
10 | + "5b13317c-0110-4367-8746-06bc6aadd3cd++2397" : 0 | ||
11 | + }, | ||
12 | + "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "8119CC7B-EDC1-4646-9378-8ECAC2EEB94B", | ||
13 | + "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { | ||
14 | + "D1584AEF25B5C21395F515B62C90B71E0ACB26B2" : "public_sdk_ios\/", | ||
15 | + "5b13317c-0110-4367-8746-06bc6aadd3cd++2397" : "youai_foolsdk_ios\/" | ||
16 | + }, | ||
17 | + "DVTSourceControlWorkspaceBlueprintNameKey" : "Demo", | ||
18 | + "DVTSourceControlWorkspaceBlueprintVersion" : 204, | ||
19 | + "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "PoolSdk_Demo\/Demo.xcodeproj", | ||
20 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ | ||
21 | + { | ||
22 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "svn:\/\/10.21.210.99", | ||
23 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Subversion", | ||
24 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "5b13317c-0110-4367-8746-06bc6aadd3cd++2397" | ||
25 | + }, | ||
26 | + { | ||
27 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "ssh:\/\/106.75.192.252:10022\/public_service\/public_sdk_ios.git", | ||
28 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", | ||
29 | + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "D1584AEF25B5C21395F515B62C90B71E0ACB26B2" | ||
30 | + } | ||
31 | + ] | ||
32 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Bucket | ||
3 | + type = "1" | ||
4 | + version = "2.0"> | ||
5 | + <Breakpoints> | ||
6 | + <BreakpointProxy | ||
7 | + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> | ||
8 | + <BreakpointContent | ||
9 | + shouldBeEnabled = "Yes" | ||
10 | + ignoreCount = "0" | ||
11 | + continueAfterRunningActions = "No" | ||
12 | + filePath = "../PoolSdk/PoolSdk/SDKInterface.m" | ||
13 | + timestampString = "471440051.171901" | ||
14 | + startingColumnNumber = "9223372036854775807" | ||
15 | + endingColumnNumber = "9223372036854775807" | ||
16 | + startingLineNumber = "77" | ||
17 | + endingLineNumber = "77" | ||
18 | + landmarkName = "-receiveLoginMessage:" | ||
19 | + landmarkType = "5"> | ||
20 | + </BreakpointContent> | ||
21 | + </BreakpointProxy> | ||
22 | + <BreakpointProxy | ||
23 | + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> | ||
24 | + <BreakpointContent | ||
25 | + shouldBeEnabled = "Yes" | ||
26 | + ignoreCount = "0" | ||
27 | + continueAfterRunningActions = "No" | ||
28 | + filePath = "../PoolSdk/PoolSdk/SDKInterface.m" | ||
29 | + timestampString = "471440051.171901" | ||
30 | + startingColumnNumber = "9223372036854775807" | ||
31 | + endingColumnNumber = "9223372036854775807" | ||
32 | + startingLineNumber = "43" | ||
33 | + endingLineNumber = "43" | ||
34 | + landmarkName = "-SDKloginSDK" | ||
35 | + landmarkType = "5"> | ||
36 | + </BreakpointContent> | ||
37 | + </BreakpointProxy> | ||
38 | + </Breakpoints> | ||
39 | +</Bucket> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Scheme | ||
3 | + LastUpgradeVersion = "0640" | ||
4 | + version = "1.3"> | ||
5 | + <BuildAction | ||
6 | + parallelizeBuildables = "YES" | ||
7 | + buildImplicitDependencies = "YES"> | ||
8 | + <BuildActionEntries> | ||
9 | + <BuildActionEntry | ||
10 | + buildForTesting = "YES" | ||
11 | + buildForRunning = "YES" | ||
12 | + buildForProfiling = "YES" | ||
13 | + buildForArchiving = "YES" | ||
14 | + buildForAnalyzing = "YES"> | ||
15 | + <BuildableReference | ||
16 | + BuildableIdentifier = "primary" | ||
17 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
18 | + BuildableName = "Demo.app" | ||
19 | + BlueprintName = "Demo" | ||
20 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
21 | + </BuildableReference> | ||
22 | + </BuildActionEntry> | ||
23 | + <BuildActionEntry | ||
24 | + buildForTesting = "YES" | ||
25 | + buildForRunning = "YES" | ||
26 | + buildForProfiling = "NO" | ||
27 | + buildForArchiving = "NO" | ||
28 | + buildForAnalyzing = "YES"> | ||
29 | + <BuildableReference | ||
30 | + BuildableIdentifier = "primary" | ||
31 | + BlueprintIdentifier = "BB5F3CA01C1811BC00DA339D" | ||
32 | + BuildableName = "DemoTests.xctest" | ||
33 | + BlueprintName = "DemoTests" | ||
34 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
35 | + </BuildableReference> | ||
36 | + </BuildActionEntry> | ||
37 | + </BuildActionEntries> | ||
38 | + </BuildAction> | ||
39 | + <TestAction | ||
40 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
41 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
42 | + shouldUseLaunchSchemeArgsEnv = "YES" | ||
43 | + buildConfiguration = "Debug"> | ||
44 | + <Testables> | ||
45 | + <TestableReference | ||
46 | + skipped = "NO"> | ||
47 | + <BuildableReference | ||
48 | + BuildableIdentifier = "primary" | ||
49 | + BlueprintIdentifier = "BB5F3CA01C1811BC00DA339D" | ||
50 | + BuildableName = "DemoTests.xctest" | ||
51 | + BlueprintName = "DemoTests" | ||
52 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
53 | + </BuildableReference> | ||
54 | + </TestableReference> | ||
55 | + </Testables> | ||
56 | + <MacroExpansion> | ||
57 | + <BuildableReference | ||
58 | + BuildableIdentifier = "primary" | ||
59 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
60 | + BuildableName = "Demo.app" | ||
61 | + BlueprintName = "Demo" | ||
62 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
63 | + </BuildableReference> | ||
64 | + </MacroExpansion> | ||
65 | + </TestAction> | ||
66 | + <LaunchAction | ||
67 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
68 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
69 | + launchStyle = "0" | ||
70 | + useCustomWorkingDirectory = "NO" | ||
71 | + buildConfiguration = "Debug" | ||
72 | + ignoresPersistentStateOnLaunch = "NO" | ||
73 | + debugDocumentVersioning = "YES" | ||
74 | + allowLocationSimulation = "YES"> | ||
75 | + <BuildableProductRunnable | ||
76 | + runnableDebuggingMode = "0"> | ||
77 | + <BuildableReference | ||
78 | + BuildableIdentifier = "primary" | ||
79 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
80 | + BuildableName = "Demo.app" | ||
81 | + BlueprintName = "Demo" | ||
82 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
83 | + </BuildableReference> | ||
84 | + </BuildableProductRunnable> | ||
85 | + <AdditionalOptions> | ||
86 | + </AdditionalOptions> | ||
87 | + </LaunchAction> | ||
88 | + <ProfileAction | ||
89 | + shouldUseLaunchSchemeArgsEnv = "YES" | ||
90 | + savedToolIdentifier = "" | ||
91 | + useCustomWorkingDirectory = "NO" | ||
92 | + buildConfiguration = "Release" | ||
93 | + debugDocumentVersioning = "YES"> | ||
94 | + <BuildableProductRunnable | ||
95 | + runnableDebuggingMode = "0"> | ||
96 | + <BuildableReference | ||
97 | + BuildableIdentifier = "primary" | ||
98 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
99 | + BuildableName = "Demo.app" | ||
100 | + BlueprintName = "Demo" | ||
101 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
102 | + </BuildableReference> | ||
103 | + </BuildableProductRunnable> | ||
104 | + </ProfileAction> | ||
105 | + <AnalyzeAction | ||
106 | + buildConfiguration = "Debug"> | ||
107 | + </AnalyzeAction> | ||
108 | + <ArchiveAction | ||
109 | + buildConfiguration = "Release" | ||
110 | + revealArchiveInOrganizer = "YES"> | ||
111 | + </ArchiveAction> | ||
112 | +</Scheme> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>SchemeUserState</key> | ||
6 | + <dict> | ||
7 | + <key>Demo.xcscheme</key> | ||
8 | + <dict> | ||
9 | + <key>orderHint</key> | ||
10 | + <integer>0</integer> | ||
11 | + </dict> | ||
12 | + </dict> | ||
13 | + <key>SuppressBuildableAutocreation</key> | ||
14 | + <dict> | ||
15 | + <key>BB5F3C871C1811BC00DA339D</key> | ||
16 | + <dict> | ||
17 | + <key>primary</key> | ||
18 | + <true/> | ||
19 | + </dict> | ||
20 | + <key>BB5F3CA01C1811BC00DA339D</key> | ||
21 | + <dict> | ||
22 | + <key>primary</key> | ||
23 | + <true/> | ||
24 | + </dict> | ||
25 | + </dict> | ||
26 | +</dict> | ||
27 | +</plist> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Bucket | ||
3 | + type = "1" | ||
4 | + version = "2.0"> | ||
5 | + <Breakpoints> | ||
6 | + <BreakpointProxy | ||
7 | + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> | ||
8 | + <BreakpointContent | ||
9 | + shouldBeEnabled = "No" | ||
10 | + ignoreCount = "0" | ||
11 | + continueAfterRunningActions = "No" | ||
12 | + filePath = "Demo/SDKInterface.h" | ||
13 | + timestampString = "474775745.083759" | ||
14 | + startingColumnNumber = "9223372036854775807" | ||
15 | + endingColumnNumber = "9223372036854775807" | ||
16 | + startingLineNumber = "9" | ||
17 | + endingLineNumber = "9" | ||
18 | + landmarkName = "@interface SDKInterface" | ||
19 | + landmarkType = "2"> | ||
20 | + </BreakpointContent> | ||
21 | + </BreakpointProxy> | ||
22 | + </Breakpoints> | ||
23 | +</Bucket> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Scheme | ||
3 | + LastUpgradeVersion = "0700" | ||
4 | + version = "1.3"> | ||
5 | + <BuildAction | ||
6 | + parallelizeBuildables = "YES" | ||
7 | + buildImplicitDependencies = "YES"> | ||
8 | + <BuildActionEntries> | ||
9 | + <BuildActionEntry | ||
10 | + buildForTesting = "YES" | ||
11 | + buildForRunning = "YES" | ||
12 | + buildForProfiling = "YES" | ||
13 | + buildForArchiving = "YES" | ||
14 | + buildForAnalyzing = "YES"> | ||
15 | + <BuildableReference | ||
16 | + BuildableIdentifier = "primary" | ||
17 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
18 | + BuildableName = "Demo.app" | ||
19 | + BlueprintName = "Demo" | ||
20 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
21 | + </BuildableReference> | ||
22 | + </BuildActionEntry> | ||
23 | + </BuildActionEntries> | ||
24 | + </BuildAction> | ||
25 | + <TestAction | ||
26 | + buildConfiguration = "Debug" | ||
27 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
28 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
29 | + shouldUseLaunchSchemeArgsEnv = "YES"> | ||
30 | + <Testables> | ||
31 | + <TestableReference | ||
32 | + skipped = "NO"> | ||
33 | + <BuildableReference | ||
34 | + BuildableIdentifier = "primary" | ||
35 | + BlueprintIdentifier = "BB5F3CA01C1811BC00DA339D" | ||
36 | + BuildableName = "DemoTests.xctest" | ||
37 | + BlueprintName = "DemoTests" | ||
38 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
39 | + </BuildableReference> | ||
40 | + </TestableReference> | ||
41 | + </Testables> | ||
42 | + <MacroExpansion> | ||
43 | + <BuildableReference | ||
44 | + BuildableIdentifier = "primary" | ||
45 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
46 | + BuildableName = "Demo.app" | ||
47 | + BlueprintName = "Demo" | ||
48 | + ReferencedContainer = "container:Demo_xipu.xcodeproj"> | ||
49 | + </BuildableReference> | ||
50 | + </MacroExpansion> | ||
51 | + <AdditionalOptions> | ||
52 | + </AdditionalOptions> | ||
53 | + </TestAction> | ||
54 | + <LaunchAction | ||
55 | + buildConfiguration = "Debug" | ||
56 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
57 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
58 | + launchStyle = "0" | ||
59 | + useCustomWorkingDirectory = "NO" | ||
60 | + ignoresPersistentStateOnLaunch = "NO" | ||
61 | + debugDocumentVersioning = "YES" | ||
62 | + debugServiceExtension = "internal" | ||
63 | + allowLocationSimulation = "YES"> | ||
64 | + <BuildableProductRunnable | ||
65 | + runnableDebuggingMode = "0"> | ||
66 | + <BuildableReference | ||
67 | + BuildableIdentifier = "primary" | ||
68 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
69 | + BuildableName = "Demo.app" | ||
70 | + BlueprintName = "Demo" | ||
71 | + ReferencedContainer = "container:Demo_xipu.xcodeproj"> | ||
72 | + </BuildableReference> | ||
73 | + </BuildableProductRunnable> | ||
74 | + <AdditionalOptions> | ||
75 | + </AdditionalOptions> | ||
76 | + </LaunchAction> | ||
77 | + <ProfileAction | ||
78 | + buildConfiguration = "Release" | ||
79 | + shouldUseLaunchSchemeArgsEnv = "YES" | ||
80 | + savedToolIdentifier = "" | ||
81 | + useCustomWorkingDirectory = "NO" | ||
82 | + debugDocumentVersioning = "YES"> | ||
83 | + <BuildableProductRunnable | ||
84 | + runnableDebuggingMode = "0"> | ||
85 | + <BuildableReference | ||
86 | + BuildableIdentifier = "primary" | ||
87 | + BlueprintIdentifier = "BB5F3C871C1811BC00DA339D" | ||
88 | + BuildableName = "Demo.app" | ||
89 | + BlueprintName = "Demo" | ||
90 | + ReferencedContainer = "container:Demo.xcodeproj"> | ||
91 | + </BuildableReference> | ||
92 | + </BuildableProductRunnable> | ||
93 | + </ProfileAction> | ||
94 | + <AnalyzeAction | ||
95 | + buildConfiguration = "Debug"> | ||
96 | + </AnalyzeAction> | ||
97 | + <ArchiveAction | ||
98 | + buildConfiguration = "Release" | ||
99 | + revealArchiveInOrganizer = "YES"> | ||
100 | + </ArchiveAction> | ||
101 | +</Scheme> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>SchemeUserState</key> | ||
6 | + <dict> | ||
7 | + <key>Demo.xcscheme</key> | ||
8 | + <dict> | ||
9 | + <key>orderHint</key> | ||
10 | + <integer>0</integer> | ||
11 | + </dict> | ||
12 | + </dict> | ||
13 | + <key>SuppressBuildableAutocreation</key> | ||
14 | + <dict> | ||
15 | + <key>BB5F3C871C1811BC00DA339D</key> | ||
16 | + <dict> | ||
17 | + <key>primary</key> | ||
18 | + <true/> | ||
19 | + </dict> | ||
20 | + <key>BB5F3CA01C1811BC00DA339D</key> | ||
21 | + <dict> | ||
22 | + <key>primary</key> | ||
23 | + <true/> | ||
24 | + </dict> | ||
25 | + </dict> | ||
26 | +</dict> | ||
27 | +</plist> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>keychain-access-groups</key> | ||
6 | + <array> | ||
7 | + <string>323G75TBBT.com.pfd.jiankefy</string> | ||
8 | + </array> | ||
9 | +</dict> | ||
10 | +</plist> |
1 | +import shutil | ||
2 | +import os | ||
3 | +import plistlib | ||
4 | + | ||
5 | +import config | ||
6 | +import json | ||
7 | +import packageProj | ||
8 | + | ||
9 | +from mod_pbxproj import XcodeProject | ||
10 | + | ||
11 | + | ||
12 | +gameProjName = config.gameProjName | ||
13 | +channelName = "play800" | ||
14 | +#copy dir xcodeproj | ||
15 | +copyNewDirName = gameProjName + '_' + channelName + '.xcodeproj' | ||
16 | +currentPath = os.path.abspath('.') | ||
17 | +currentPath += '/' + copyNewDirName | ||
18 | + | ||
19 | + | ||
20 | +if os.path.exists(currentPath): | ||
21 | + shutil.rmtree(currentPath) | ||
22 | + | ||
23 | +shutil.copytree(gameProjName + '.xcodeproj',currentPath) | ||
24 | + | ||
25 | +project = XcodeProject.Load(copyNewDirName + '/project.pbxproj') | ||
26 | + | ||
27 | +project.add_other_ldflags('-ObjC') | ||
28 | + | ||
29 | +channelRootPath = config.channelRootPath#'poolsdk_file' | ||
30 | + | ||
31 | +frameworksPath = '$(PROJECT_DIR)/' + channelRootPath + '/poolsdk_' + channelName + '/SDK' | ||
32 | +print(frameworksPath); | ||
33 | +#add header search path | ||
34 | +project.add_header_search_paths(frameworksPath, recursive=False) | ||
35 | +project.add_header_search_paths(frameworksPath + '/MBProgressHUD', recursive=False) | ||
36 | +#add framework search path | ||
37 | +project.add_framework_search_paths(frameworksPath, recursive=False) | ||
38 | +#add library search path | ||
39 | +project.add_library_search_paths(frameworksPath, recursive=False) | ||
40 | + | ||
41 | +#add poolsdk_xy dir all file into project | ||
42 | +project.remove_group_by_name('poolsdk') | ||
43 | +frameworkRelativePath = project.add_folder(channelRootPath + '/poolsdk_' + channelName + '/SDK') | ||
44 | + | ||
45 | +#ignore_unknown_type | ||
46 | +project.add_file_if_doesnt_exist('pool_setting',parent=frameworkRelativePath, weak=True,ignore_unknown_type=True) | ||
47 | + | ||
48 | + | ||
49 | +systemFrameworks = project.get_or_create_group('Frameworks') | ||
50 | +#add system framework | ||
51 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/StoreKit.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
52 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/AdSupport.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
53 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/QuartzCore.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
54 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/Foundation.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
55 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/UIKit.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
56 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/SystemConfiguration.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
57 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/CoreGraphics.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
58 | + | ||
59 | +#modify info.plist reference path | ||
60 | +project.add_single_valued_flag('INFOPLIST_FILE',channelRootPath + '/poolsdk_' + channelName + '/Info.plist') | ||
61 | + | ||
62 | +project.add_single_valued_flag('ENABLE_BITCODE', 'NO') | ||
63 | + | ||
64 | +readInfoPlistFilePath = channelRootPath + '/poolsdk/Info.plist' | ||
65 | +writeInfoFilePath = channelRootPath + '/poolsdk_' + channelName + '/Info.plist' | ||
66 | +infoContent = plistlib.readPlist(readInfoPlistFilePath) | ||
67 | + | ||
68 | +channelInfoPath = channelRootPath + '/poolsdk_' + channelName + '/Info_' + channelName + '.plist' | ||
69 | + | ||
70 | +#read pool_setting file | ||
71 | +settingFile = open(channelRootPath + '/poolsdk_' + channelName + '/SDK/pool_setting','rw') | ||
72 | +try: | ||
73 | + settingFileContent = settingFile.read( ) | ||
74 | +finally: | ||
75 | + settingFile.close( ) | ||
76 | +#json op | ||
77 | +jsonStr = json.loads(settingFileContent) | ||
78 | + | ||
79 | +#modify bundle id | ||
80 | +project.add_single_valued_flag('PRODUCT_BUNDLE_IDENTIFIER',jsonStr["appScheme"]) | ||
81 | + | ||
82 | +#set info.plist channel parame | ||
83 | +#absolutionInfoPath = os.path.abspath('.') + '/' + channelInfoPath | ||
84 | +#commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :yayawan_game_id '" + gameId + ' ' + absolutionInfoPath) | ||
85 | + | ||
86 | +#read channel info plist content | ||
87 | +channelInfoContent = plistlib.readPlist(channelInfoPath) | ||
88 | +#update and add info.plist content | ||
89 | +infoContent.update(channelInfoContent) | ||
90 | +#write | ||
91 | +plistlib.writePlist(infoContent,writeInfoFilePath) | ||
92 | + | ||
93 | +project.save() |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>CFBundleDevelopmentRegion</key> | ||
6 | + <string>en</string> | ||
7 | + <key>CFBundleExecutable</key> | ||
8 | + <string>$(EXECUTABLE_NAME)</string> | ||
9 | + <key>CFBundleIdentifier</key> | ||
10 | + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||
11 | + <key>CFBundleInfoDictionaryVersion</key> | ||
12 | + <string>6.0</string> | ||
13 | + <key>CFBundleName</key> | ||
14 | + <string>$(PRODUCT_NAME)</string> | ||
15 | + <key>CFBundlePackageType</key> | ||
16 | + <string>APPL</string> | ||
17 | + <key>CFBundleShortVersionString</key> | ||
18 | + <string>1.0</string> | ||
19 | + <key>CFBundleSignature</key> | ||
20 | + <string>????</string> | ||
21 | + <key>CFBundleURLTypes</key> | ||
22 | + <array> | ||
23 | + <dict> | ||
24 | + <key>CFBundleTypeRole</key> | ||
25 | + <string>Editor</string> | ||
26 | + <key>CFBundleURLSchemes</key> | ||
27 | + <array> | ||
28 | + <string>com.youai.sdk</string> | ||
29 | + </array> | ||
30 | + </dict> | ||
31 | + </array> | ||
32 | + <key>CFBundleVersion</key> | ||
33 | + <string>1</string> | ||
34 | + <key>LSRequiresIPhoneOS</key> | ||
35 | + <true/> | ||
36 | + <key>NSAppTransportSecurity</key> | ||
37 | + <dict> | ||
38 | + <key>NSAllowsArbitraryLoads</key> | ||
39 | + <true/> | ||
40 | + </dict> | ||
41 | + <key>UILaunchStoryboardName</key> | ||
42 | + <string>LaunchScreen</string> | ||
43 | + <key>UIMainStoryboardFile</key> | ||
44 | + <string>Main</string> | ||
45 | + <key>UIRequiredDeviceCapabilities</key> | ||
46 | + <array> | ||
47 | + <string>armv7</string> | ||
48 | + </array> | ||
49 | + <key>UISupportedInterfaceOrientations</key> | ||
50 | + <array> | ||
51 | + <string>UIInterfaceOrientationLandscapeLeft</string> | ||
52 | + <string>UIInterfaceOrientationLandscapeRight</string> | ||
53 | + </array> | ||
54 | +</dict> | ||
55 | +</plist> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>NSAppTransportSecurity</key> | ||
6 | + <dict> | ||
7 | + <key>NSAllowsArbitraryLoads</key> | ||
8 | + <true/> | ||
9 | + </dict> | ||
10 | +</dict> | ||
11 | +</plist> |
1 | +// | ||
2 | +// MBProgressHUD.h | ||
3 | +// Version 0.8 | ||
4 | +// Created by Matej Bukovinski on 2.4.09. | ||
5 | +// | ||
6 | + | ||
7 | +// This code is distributed under the terms and conditions of the MIT license. | ||
8 | + | ||
9 | +// Copyright (c) 2013 Matej Bukovinski | ||
10 | +// | ||
11 | +// Permission is hereby granted, free of charge, to any person obtaining a copy | ||
12 | +// of this software and associated documentation files (the "Software"), to deal | ||
13 | +// in the Software without restriction, including without limitation the rights | ||
14 | +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
15 | +// copies of the Software, and to permit persons to whom the Software is | ||
16 | +// furnished to do so, subject to the following conditions: | ||
17 | +// | ||
18 | +// The above copyright notice and this permission notice shall be included in | ||
19 | +// all copies or substantial portions of the Software. | ||
20 | +// | ||
21 | +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
22 | +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
23 | +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
24 | +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
25 | +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
26 | +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
27 | +// THE SOFTWARE. | ||
28 | + | ||
29 | +#import <Foundation/Foundation.h> | ||
30 | +#import <UIKit/UIKit.h> | ||
31 | +#import <CoreGraphics/CoreGraphics.h> | ||
32 | + | ||
33 | +@protocol MBProgressHUDDelegate; | ||
34 | + | ||
35 | + | ||
36 | +typedef enum { | ||
37 | + /** Progress is shown using an UIActivityIndicatorView. This is the default. */ | ||
38 | + MBProgressHUDModeIndeterminate, | ||
39 | + /** Progress is shown using a round, pie-chart like, progress view. */ | ||
40 | + MBProgressHUDModeDeterminate, | ||
41 | + /** Progress is shown using a horizontal progress bar */ | ||
42 | + MBProgressHUDModeDeterminateHorizontalBar, | ||
43 | + /** Progress is shown using a ring-shaped progress view. */ | ||
44 | + MBProgressHUDModeAnnularDeterminate, | ||
45 | + /** Shows a custom view */ | ||
46 | + MBProgressHUDModeCustomView, | ||
47 | + /** Shows only labels */ | ||
48 | + MBProgressHUDModeText | ||
49 | +} MBProgressHUDMode; | ||
50 | + | ||
51 | +typedef enum { | ||
52 | + /** Opacity animation */ | ||
53 | + MBProgressHUDAnimationFade, | ||
54 | + /** Opacity + scale animation */ | ||
55 | + MBProgressHUDAnimationZoom, | ||
56 | + MBProgressHUDAnimationZoomOut = MBProgressHUDAnimationZoom, | ||
57 | + MBProgressHUDAnimationZoomIn | ||
58 | +} MBProgressHUDAnimation; | ||
59 | + | ||
60 | + | ||
61 | +#ifndef MB_INSTANCETYPE | ||
62 | +#if __has_feature(objc_instancetype) | ||
63 | + #define MB_INSTANCETYPE instancetype | ||
64 | +#else | ||
65 | + #define MB_INSTANCETYPE id | ||
66 | +#endif | ||
67 | +#endif | ||
68 | + | ||
69 | +#ifndef MB_STRONG | ||
70 | +#if __has_feature(objc_arc) | ||
71 | + #define MB_STRONG strong | ||
72 | +#else | ||
73 | + #define MB_STRONG retain | ||
74 | +#endif | ||
75 | +#endif | ||
76 | + | ||
77 | +#ifndef MB_WEAK | ||
78 | +#if __has_feature(objc_arc_weak) | ||
79 | + #define MB_WEAK weak | ||
80 | +#elif __has_feature(objc_arc) | ||
81 | + #define MB_WEAK unsafe_unretained | ||
82 | +#else | ||
83 | + #define MB_WEAK assign | ||
84 | +#endif | ||
85 | +#endif | ||
86 | + | ||
87 | +#if NS_BLOCKS_AVAILABLE | ||
88 | +typedef void (^MBProgressHUDCompletionBlock)(); | ||
89 | +#endif | ||
90 | + | ||
91 | + | ||
92 | +/** | ||
93 | + * Displays a simple HUD window containing a progress indicator and two optional labels for short messages. | ||
94 | + * | ||
95 | + * This is a simple drop-in class for displaying a progress HUD view similar to Apple's private UIProgressHUD class. | ||
96 | + * The MBProgressHUD window spans over the entire space given to it by the initWithFrame constructor and catches all | ||
97 | + * user input on this region, thereby preventing the user operations on components below the view. The HUD itself is | ||
98 | + * drawn centered as a rounded semi-transparent view which resizes depending on the user specified content. | ||
99 | + * | ||
100 | + * This view supports four modes of operation: | ||
101 | + * - MBProgressHUDModeIndeterminate - shows a UIActivityIndicatorView | ||
102 | + * - MBProgressHUDModeDeterminate - shows a custom round progress indicator | ||
103 | + * - MBProgressHUDModeAnnularDeterminate - shows a custom annular progress indicator | ||
104 | + * - MBProgressHUDModeCustomView - shows an arbitrary, user specified view (@see customView) | ||
105 | + * | ||
106 | + * All three modes can have optional labels assigned: | ||
107 | + * - If the labelText property is set and non-empty then a label containing the provided content is placed below the | ||
108 | + * indicator view. | ||
109 | + * - If also the detailsLabelText property is set then another label is placed below the first label. | ||
110 | + */ | ||
111 | +@interface MBProgressHUD : UIView | ||
112 | + | ||
113 | +/** | ||
114 | + * Creates a new HUD, adds it to provided view and shows it. The counterpart to this method is hideHUDForView:animated:. | ||
115 | + * | ||
116 | + * @param view The view that the HUD will be added to | ||
117 | + * @param animated If set to YES the HUD will appear using the current animationType. If set to NO the HUD will not use | ||
118 | + * animations while appearing. | ||
119 | + * @return A reference to the created HUD. | ||
120 | + * | ||
121 | + * @see hideHUDForView:animated: | ||
122 | + * @see animationType | ||
123 | + */ | ||
124 | ++ (MB_INSTANCETYPE)showHUDAddedTo:(UIView *)view animated:(BOOL)animated; | ||
125 | + | ||
126 | +/** | ||
127 | + * Finds the top-most HUD subview and hides it. The counterpart to this method is showHUDAddedTo:animated:. | ||
128 | + * | ||
129 | + * @param view The view that is going to be searched for a HUD subview. | ||
130 | + * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use | ||
131 | + * animations while disappearing. | ||
132 | + * @return YES if a HUD was found and removed, NO otherwise. | ||
133 | + * | ||
134 | + * @see showHUDAddedTo:animated: | ||
135 | + * @see animationType | ||
136 | + */ | ||
137 | ++ (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated; | ||
138 | + | ||
139 | +/** | ||
140 | + * Finds all the HUD subviews and hides them. | ||
141 | + * | ||
142 | + * @param view The view that is going to be searched for HUD subviews. | ||
143 | + * @param animated If set to YES the HUDs will disappear using the current animationType. If set to NO the HUDs will not use | ||
144 | + * animations while disappearing. | ||
145 | + * @return the number of HUDs found and removed. | ||
146 | + * | ||
147 | + * @see hideHUDForView:animated: | ||
148 | + * @see animationType | ||
149 | + */ | ||
150 | ++ (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated; | ||
151 | + | ||
152 | +/** | ||
153 | + * Finds the top-most HUD subview and returns it. | ||
154 | + * | ||
155 | + * @param view The view that is going to be searched. | ||
156 | + * @return A reference to the last HUD subview discovered. | ||
157 | + */ | ||
158 | ++ (MB_INSTANCETYPE)HUDForView:(UIView *)view; | ||
159 | + | ||
160 | +/** | ||
161 | + * Finds all HUD subviews and returns them. | ||
162 | + * | ||
163 | + * @param view The view that is going to be searched. | ||
164 | + * @return All found HUD views (array of MBProgressHUD objects). | ||
165 | + */ | ||
166 | ++ (NSArray *)allHUDsForView:(UIView *)view; | ||
167 | + | ||
168 | +/** | ||
169 | + * A convenience constructor that initializes the HUD with the window's bounds. Calls the designated constructor with | ||
170 | + * window.bounds as the parameter. | ||
171 | + * | ||
172 | + * @param window The window instance that will provide the bounds for the HUD. Should be the same instance as | ||
173 | + * the HUD's superview (i.e., the window that the HUD will be added to). | ||
174 | + */ | ||
175 | +- (id)initWithWindow:(UIWindow *)window; | ||
176 | + | ||
177 | +/** | ||
178 | + * A convenience constructor that initializes the HUD with the view's bounds. Calls the designated constructor with | ||
179 | + * view.bounds as the parameter | ||
180 | + * | ||
181 | + * @param view The view instance that will provide the bounds for the HUD. Should be the same instance as | ||
182 | + * the HUD's superview (i.e., the view that the HUD will be added to). | ||
183 | + */ | ||
184 | +- (id)initWithView:(UIView *)view; | ||
185 | + | ||
186 | +/** | ||
187 | + * Display the HUD. You need to make sure that the main thread completes its run loop soon after this method call so | ||
188 | + * the user interface can be updated. Call this method when your task is already set-up to be executed in a new thread | ||
189 | + * (e.g., when using something like NSOperation or calling an asynchronous call like NSURLRequest). | ||
190 | + * | ||
191 | + * @param animated If set to YES the HUD will appear using the current animationType. If set to NO the HUD will not use | ||
192 | + * animations while appearing. | ||
193 | + * | ||
194 | + * @see animationType | ||
195 | + */ | ||
196 | +- (void)show:(BOOL)animated; | ||
197 | + | ||
198 | +/** | ||
199 | + * Hide the HUD. This still calls the hudWasHidden: delegate. This is the counterpart of the show: method. Use it to | ||
200 | + * hide the HUD when your task completes. | ||
201 | + * | ||
202 | + * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use | ||
203 | + * animations while disappearing. | ||
204 | + * | ||
205 | + * @see animationType | ||
206 | + */ | ||
207 | +- (void)hide:(BOOL)animated; | ||
208 | + | ||
209 | +/** | ||
210 | + * Hide the HUD after a delay. This still calls the hudWasHidden: delegate. This is the counterpart of the show: method. Use it to | ||
211 | + * hide the HUD when your task completes. | ||
212 | + * | ||
213 | + * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use | ||
214 | + * animations while disappearing. | ||
215 | + * @param delay Delay in seconds until the HUD is hidden. | ||
216 | + * | ||
217 | + * @see animationType | ||
218 | + */ | ||
219 | +- (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay; | ||
220 | + | ||
221 | +/** | ||
222 | + * Shows the HUD while a background task is executing in a new thread, then hides the HUD. | ||
223 | + * | ||
224 | + * This method also takes care of autorelease pools so your method does not have to be concerned with setting up a | ||
225 | + * pool. | ||
226 | + * | ||
227 | + * @param method The method to be executed while the HUD is shown. This method will be executed in a new thread. | ||
228 | + * @param target The object that the target method belongs to. | ||
229 | + * @param object An optional object to be passed to the method. | ||
230 | + * @param animated If set to YES the HUD will (dis)appear using the current animationType. If set to NO the HUD will not use | ||
231 | + * animations while (dis)appearing. | ||
232 | + */ | ||
233 | +- (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated; | ||
234 | + | ||
235 | +#if NS_BLOCKS_AVAILABLE | ||
236 | + | ||
237 | +/** | ||
238 | + * Shows the HUD while a block is executing on a background queue, then hides the HUD. | ||
239 | + * | ||
240 | + * @see showAnimated:whileExecutingBlock:onQueue:completionBlock: | ||
241 | + */ | ||
242 | +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block; | ||
243 | + | ||
244 | +/** | ||
245 | + * Shows the HUD while a block is executing on a background queue, then hides the HUD. | ||
246 | + * | ||
247 | + * @see showAnimated:whileExecutingBlock:onQueue:completionBlock: | ||
248 | + */ | ||
249 | +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(MBProgressHUDCompletionBlock)completion; | ||
250 | + | ||
251 | +/** | ||
252 | + * Shows the HUD while a block is executing on the specified dispatch queue, then hides the HUD. | ||
253 | + * | ||
254 | + * @see showAnimated:whileExecutingBlock:onQueue:completionBlock: | ||
255 | + */ | ||
256 | +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue; | ||
257 | + | ||
258 | +/** | ||
259 | + * Shows the HUD while a block is executing on the specified dispatch queue, executes completion block on the main queue, and then hides the HUD. | ||
260 | + * | ||
261 | + * @param animated If set to YES the HUD will (dis)appear using the current animationType. If set to NO the HUD will | ||
262 | + * not use animations while (dis)appearing. | ||
263 | + * @param block The block to be executed while the HUD is shown. | ||
264 | + * @param queue The dispatch queue on which the block should be executed. | ||
265 | + * @param completion The block to be executed on completion. | ||
266 | + * | ||
267 | + * @see completionBlock | ||
268 | + */ | ||
269 | +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue | ||
270 | + completionBlock:(MBProgressHUDCompletionBlock)completion; | ||
271 | + | ||
272 | +/** | ||
273 | + * A block that gets called after the HUD was completely hidden. | ||
274 | + */ | ||
275 | +@property (copy) MBProgressHUDCompletionBlock completionBlock; | ||
276 | + | ||
277 | +#endif | ||
278 | + | ||
279 | +/** | ||
280 | + * MBProgressHUD operation mode. The default is MBProgressHUDModeIndeterminate. | ||
281 | + * | ||
282 | + * @see MBProgressHUDMode | ||
283 | + */ | ||
284 | +@property (assign) MBProgressHUDMode mode; | ||
285 | + | ||
286 | +/** | ||
287 | + * The animation type that should be used when the HUD is shown and hidden. | ||
288 | + * | ||
289 | + * @see MBProgressHUDAnimation | ||
290 | + */ | ||
291 | +@property (assign) MBProgressHUDAnimation animationType; | ||
292 | + | ||
293 | +/** | ||
294 | + * The UIView (e.g., a UIImageView) to be shown when the HUD is in MBProgressHUDModeCustomView. | ||
295 | + * For best results use a 37 by 37 pixel view (so the bounds match the built in indicator bounds). | ||
296 | + */ | ||
297 | +@property (MB_STRONG) UIView *customView; | ||
298 | + | ||
299 | +/** | ||
300 | + * The HUD delegate object. | ||
301 | + * | ||
302 | + * @see MBProgressHUDDelegate | ||
303 | + */ | ||
304 | +@property (MB_WEAK) id<MBProgressHUDDelegate> delegate; | ||
305 | + | ||
306 | +/** | ||
307 | + * An optional short message to be displayed below the activity indicator. The HUD is automatically resized to fit | ||
308 | + * the entire text. If the text is too long it will get clipped by displaying "..." at the end. If left unchanged or | ||
309 | + * set to @"", then no message is displayed. | ||
310 | + */ | ||
311 | +@property (copy) NSString *labelText; | ||
312 | + | ||
313 | +/** | ||
314 | + * An optional details message displayed below the labelText message. This message is displayed only if the labelText | ||
315 | + * property is also set and is different from an empty string (@""). The details text can span multiple lines. | ||
316 | + */ | ||
317 | +@property (copy) NSString *detailsLabelText; | ||
318 | + | ||
319 | +/** | ||
320 | + * The opacity of the HUD window. Defaults to 0.8 (80% opacity). | ||
321 | + */ | ||
322 | +@property (assign) float opacity; | ||
323 | + | ||
324 | +/** | ||
325 | + * The color of the HUD window. Defaults to black. If this property is set, color is set using | ||
326 | + * this UIColor and the opacity property is not used. using retain because performing copy on | ||
327 | + * UIColor base colors (like [UIColor greenColor]) cause problems with the copyZone. | ||
328 | + */ | ||
329 | +@property (MB_STRONG) UIColor *color; | ||
330 | + | ||
331 | +/** | ||
332 | + * The x-axis offset of the HUD relative to the centre of the superview. | ||
333 | + */ | ||
334 | +@property (assign) float xOffset; | ||
335 | + | ||
336 | +/** | ||
337 | + * The y-axis offset of the HUD relative to the centre of the superview. | ||
338 | + */ | ||
339 | +@property (assign) float yOffset; | ||
340 | + | ||
341 | +/** | ||
342 | + * The amount of space between the HUD edge and the HUD elements (labels, indicators or custom views). | ||
343 | + * Defaults to 20.0 | ||
344 | + */ | ||
345 | +@property (assign) float margin; | ||
346 | + | ||
347 | +/** | ||
348 | + * The corner radius for th HUD | ||
349 | + * Defaults to 10.0 | ||
350 | + */ | ||
351 | +@property (assign) float cornerRadius; | ||
352 | + | ||
353 | +/** | ||
354 | + * Cover the HUD background view with a radial gradient. | ||
355 | + */ | ||
356 | +@property (assign) BOOL dimBackground; | ||
357 | + | ||
358 | +/* | ||
359 | + * Grace period is the time (in seconds) that the invoked method may be run without | ||
360 | + * showing the HUD. If the task finishes before the grace time runs out, the HUD will | ||
361 | + * not be shown at all. | ||
362 | + * This may be used to prevent HUD display for very short tasks. | ||
363 | + * Defaults to 0 (no grace time). | ||
364 | + * Grace time functionality is only supported when the task status is known! | ||
365 | + * @see taskInProgress | ||
366 | + */ | ||
367 | +@property (assign) float graceTime; | ||
368 | + | ||
369 | +/** | ||
370 | + * The minimum time (in seconds) that the HUD is shown. | ||
371 | + * This avoids the problem of the HUD being shown and than instantly hidden. | ||
372 | + * Defaults to 0 (no minimum show time). | ||
373 | + */ | ||
374 | +@property (assign) float minShowTime; | ||
375 | + | ||
376 | +/** | ||
377 | + * Indicates that the executed operation is in progress. Needed for correct graceTime operation. | ||
378 | + * If you don't set a graceTime (different than 0.0) this does nothing. | ||
379 | + * This property is automatically set when using showWhileExecuting:onTarget:withObject:animated:. | ||
380 | + * When threading is done outside of the HUD (i.e., when the show: and hide: methods are used directly), | ||
381 | + * you need to set this property when your task starts and completes in order to have normal graceTime | ||
382 | + * functionality. | ||
383 | + */ | ||
384 | +@property (assign) BOOL taskInProgress; | ||
385 | + | ||
386 | +/** | ||
387 | + * Removes the HUD from its parent view when hidden. | ||
388 | + * Defaults to NO. | ||
389 | + */ | ||
390 | +@property (assign) BOOL removeFromSuperViewOnHide; | ||
391 | + | ||
392 | +/** | ||
393 | + * Font to be used for the main label. Set this property if the default is not adequate. | ||
394 | + */ | ||
395 | +@property (MB_STRONG) UIFont* labelFont; | ||
396 | + | ||
397 | +/** | ||
398 | + * Color to be used for the main label. Set this property if the default is not adequate. | ||
399 | + */ | ||
400 | +@property (MB_STRONG) UIColor* labelColor; | ||
401 | + | ||
402 | +/** | ||
403 | + * Font to be used for the details label. Set this property if the default is not adequate. | ||
404 | + */ | ||
405 | +@property (MB_STRONG) UIFont* detailsLabelFont; | ||
406 | + | ||
407 | +/** | ||
408 | + * Color to be used for the details label. Set this property if the default is not adequate. | ||
409 | + */ | ||
410 | +@property (MB_STRONG) UIColor* detailsLabelColor; | ||
411 | + | ||
412 | +/** | ||
413 | + * The progress of the progress indicator, from 0.0 to 1.0. Defaults to 0.0. | ||
414 | + */ | ||
415 | +@property (assign) float progress; | ||
416 | + | ||
417 | +/** | ||
418 | + * The minimum size of the HUD bezel. Defaults to CGSizeZero (no minimum size). | ||
419 | + */ | ||
420 | +@property (assign) CGSize minSize; | ||
421 | + | ||
422 | +/** | ||
423 | + * Force the HUD dimensions to be equal if possible. | ||
424 | + */ | ||
425 | +@property (assign, getter = isSquare) BOOL square; | ||
426 | + | ||
427 | +@end | ||
428 | + | ||
429 | + | ||
430 | +@protocol MBProgressHUDDelegate <NSObject> | ||
431 | + | ||
432 | +@optional | ||
433 | + | ||
434 | +/** | ||
435 | + * Called after the HUD was fully hidden from the screen. | ||
436 | + */ | ||
437 | +- (void)hudWasHidden:(MBProgressHUD *)hud; | ||
438 | + | ||
439 | +@end | ||
440 | + | ||
441 | + | ||
442 | +/** | ||
443 | + * A progress view for showing definite progress by filling up a circle (pie chart). | ||
444 | + */ | ||
445 | +@interface MBRoundProgressView : UIView | ||
446 | + | ||
447 | +/** | ||
448 | + * Progress (0.0 to 1.0) | ||
449 | + */ | ||
450 | +@property (nonatomic, assign) float progress; | ||
451 | + | ||
452 | +/** | ||
453 | + * Indicator progress color. | ||
454 | + * Defaults to white [UIColor whiteColor] | ||
455 | + */ | ||
456 | +@property (nonatomic, MB_STRONG) UIColor *progressTintColor; | ||
457 | + | ||
458 | +/** | ||
459 | + * Indicator background (non-progress) color. | ||
460 | + * Defaults to translucent white (alpha 0.1) | ||
461 | + */ | ||
462 | +@property (nonatomic, MB_STRONG) UIColor *backgroundTintColor; | ||
463 | + | ||
464 | +/* | ||
465 | + * Display mode - NO = round or YES = annular. Defaults to round. | ||
466 | + */ | ||
467 | +@property (nonatomic, assign, getter = isAnnular) BOOL annular; | ||
468 | + | ||
469 | +@end | ||
470 | + | ||
471 | + | ||
472 | +/** | ||
473 | + * A flat bar progress view. | ||
474 | + */ | ||
475 | +@interface MBBarProgressView : UIView | ||
476 | + | ||
477 | +/** | ||
478 | + * Progress (0.0 to 1.0) | ||
479 | + */ | ||
480 | +@property (nonatomic, assign) float progress; | ||
481 | + | ||
482 | +/** | ||
483 | + * Bar border line color. | ||
484 | + * Defaults to white [UIColor whiteColor]. | ||
485 | + */ | ||
486 | +@property (nonatomic, MB_STRONG) UIColor *lineColor; | ||
487 | + | ||
488 | +/** | ||
489 | + * Bar background color. | ||
490 | + * Defaults to clear [UIColor clearColor]; | ||
491 | + */ | ||
492 | +@property (nonatomic, MB_STRONG) UIColor *progressRemainingColor; | ||
493 | + | ||
494 | +/** | ||
495 | + * Bar progress color. | ||
496 | + * Defaults to white [UIColor whiteColor]. | ||
497 | + */ | ||
498 | +@property (nonatomic, MB_STRONG) UIColor *progressColor; | ||
499 | + | ||
500 | +@end |
1 | +// | ||
2 | +// MBProgressHUD.m | ||
3 | +// Version 0.8 | ||
4 | +// Created by Matej Bukovinski on 2.4.09. | ||
5 | +// | ||
6 | + | ||
7 | +#import "MBProgressHUD.h" | ||
8 | +#import <tgmath.h> | ||
9 | + | ||
10 | + | ||
11 | +#if __has_feature(objc_arc) | ||
12 | + #define MB_AUTORELEASE(exp) exp | ||
13 | + #define MB_RELEASE(exp) exp | ||
14 | + #define MB_RETAIN(exp) exp | ||
15 | +#else | ||
16 | + #define MB_AUTORELEASE(exp) [exp autorelease] | ||
17 | + #define MB_RELEASE(exp) [exp release] | ||
18 | + #define MB_RETAIN(exp) [exp retain] | ||
19 | +#endif | ||
20 | + | ||
21 | +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000 | ||
22 | + #define MBLabelAlignmentCenter NSTextAlignmentCenter | ||
23 | +#else | ||
24 | + #define MBLabelAlignmentCenter UITextAlignmentCenter | ||
25 | +#endif | ||
26 | + | ||
27 | +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 | ||
28 | + #define MB_TEXTSIZE(text, font) [text length] > 0 ? [text \ | ||
29 | + sizeWithAttributes:@{NSFontAttributeName:font}] : CGSizeZero; | ||
30 | +#else | ||
31 | + #define MB_TEXTSIZE(text, font) [text length] > 0 ? [text sizeWithFont:font] : CGSizeZero; | ||
32 | +#endif | ||
33 | + | ||
34 | +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 | ||
35 | + #define MB_MULTILINE_TEXTSIZE(text, font, maxSize, mode) [text length] > 0 ? [text \ | ||
36 | + boundingRectWithSize:maxSize options:(NSStringDrawingUsesLineFragmentOrigin) \ | ||
37 | + attributes:@{NSFontAttributeName:font} context:nil].size : CGSizeZero; | ||
38 | +#else | ||
39 | + #define MB_MULTILINE_TEXTSIZE(text, font, maxSize, mode) [text length] > 0 ? [text \ | ||
40 | + sizeWithFont:font constrainedToSize:maxSize lineBreakMode:mode] : CGSizeZero; | ||
41 | +#endif | ||
42 | + | ||
43 | + | ||
44 | +static const CGFloat kPadding = 4.f; | ||
45 | +static const CGFloat kLabelFontSize = 16.f; | ||
46 | +static const CGFloat kDetailsLabelFontSize = 12.f; | ||
47 | + | ||
48 | + | ||
49 | +@interface MBProgressHUD () | ||
50 | + | ||
51 | +- (void)setupLabels; | ||
52 | +- (void)registerForKVO; | ||
53 | +- (void)unregisterFromKVO; | ||
54 | +- (NSArray *)observableKeypaths; | ||
55 | +- (void)registerForNotifications; | ||
56 | +- (void)unregisterFromNotifications; | ||
57 | +- (void)updateUIForKeypath:(NSString *)keyPath; | ||
58 | +- (void)hideUsingAnimation:(BOOL)animated; | ||
59 | +- (void)showUsingAnimation:(BOOL)animated; | ||
60 | +- (void)done; | ||
61 | +- (void)updateIndicators; | ||
62 | +- (void)handleGraceTimer:(NSTimer *)theTimer; | ||
63 | +- (void)handleMinShowTimer:(NSTimer *)theTimer; | ||
64 | +- (void)setTransformForCurrentOrientation:(BOOL)animated; | ||
65 | +- (void)cleanUp; | ||
66 | +- (void)launchExecution; | ||
67 | +- (void)deviceOrientationDidChange:(NSNotification *)notification; | ||
68 | +- (void)hideDelayed:(NSNumber *)animated; | ||
69 | + | ||
70 | +@property (atomic, MB_STRONG) UIView *indicator; | ||
71 | +@property (atomic, MB_STRONG) NSTimer *graceTimer; | ||
72 | +@property (atomic, MB_STRONG) NSTimer *minShowTimer; | ||
73 | +@property (atomic, MB_STRONG) NSDate *showStarted; | ||
74 | +@property (atomic, assign) CGSize size; | ||
75 | + | ||
76 | +@end | ||
77 | + | ||
78 | + | ||
79 | +@implementation MBProgressHUD { | ||
80 | + BOOL useAnimation; | ||
81 | + SEL methodForExecution; | ||
82 | + id targetForExecution; | ||
83 | + id objectForExecution; | ||
84 | + UILabel *label; | ||
85 | + UILabel *detailsLabel; | ||
86 | + BOOL isFinished; | ||
87 | + CGAffineTransform rotationTransform; | ||
88 | +} | ||
89 | + | ||
90 | +#pragma mark - Properties | ||
91 | + | ||
92 | +@synthesize animationType; | ||
93 | +@synthesize delegate; | ||
94 | +@synthesize opacity; | ||
95 | +@synthesize color; | ||
96 | +@synthesize labelFont; | ||
97 | +@synthesize labelColor; | ||
98 | +@synthesize detailsLabelFont; | ||
99 | +@synthesize detailsLabelColor; | ||
100 | +@synthesize indicator; | ||
101 | +@synthesize xOffset; | ||
102 | +@synthesize yOffset; | ||
103 | +@synthesize minSize; | ||
104 | +@synthesize square; | ||
105 | +@synthesize margin; | ||
106 | +@synthesize dimBackground; | ||
107 | +@synthesize graceTime; | ||
108 | +@synthesize minShowTime; | ||
109 | +@synthesize graceTimer; | ||
110 | +@synthesize minShowTimer; | ||
111 | +@synthesize taskInProgress; | ||
112 | +@synthesize removeFromSuperViewOnHide; | ||
113 | +@synthesize customView; | ||
114 | +@synthesize showStarted; | ||
115 | +@synthesize mode; | ||
116 | +@synthesize labelText; | ||
117 | +@synthesize detailsLabelText; | ||
118 | +@synthesize progress; | ||
119 | +@synthesize size; | ||
120 | +#if NS_BLOCKS_AVAILABLE | ||
121 | +@synthesize completionBlock; | ||
122 | +#endif | ||
123 | + | ||
124 | +#pragma mark - Class methods | ||
125 | + | ||
126 | ++ (MB_INSTANCETYPE)showHUDAddedTo:(UIView *)view animated:(BOOL)animated { | ||
127 | + MBProgressHUD *hud = [[self alloc] initWithView:view]; | ||
128 | + [view addSubview:hud]; | ||
129 | + [hud show:animated]; | ||
130 | + return MB_AUTORELEASE(hud); | ||
131 | +} | ||
132 | + | ||
133 | ++ (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated { | ||
134 | + MBProgressHUD *hud = [self HUDForView:view]; | ||
135 | + if (hud != nil) { | ||
136 | + hud.removeFromSuperViewOnHide = YES; | ||
137 | + [hud hide:animated]; | ||
138 | + return YES; | ||
139 | + } | ||
140 | + return NO; | ||
141 | +} | ||
142 | + | ||
143 | ++ (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated { | ||
144 | + NSArray *huds = [MBProgressHUD allHUDsForView:view]; | ||
145 | + for (MBProgressHUD *hud in huds) { | ||
146 | + hud.removeFromSuperViewOnHide = YES; | ||
147 | + [hud hide:animated]; | ||
148 | + } | ||
149 | + return [huds count]; | ||
150 | +} | ||
151 | + | ||
152 | ++ (MB_INSTANCETYPE)HUDForView:(UIView *)view { | ||
153 | + NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator]; | ||
154 | + for (UIView *subview in subviewsEnum) { | ||
155 | + if ([subview isKindOfClass:self]) { | ||
156 | + return (MBProgressHUD *)subview; | ||
157 | + } | ||
158 | + } | ||
159 | + return nil; | ||
160 | +} | ||
161 | + | ||
162 | ++ (NSArray *)allHUDsForView:(UIView *)view { | ||
163 | + NSMutableArray *huds = [NSMutableArray array]; | ||
164 | + NSArray *subviews = view.subviews; | ||
165 | + for (UIView *aView in subviews) { | ||
166 | + if ([aView isKindOfClass:self]) { | ||
167 | + [huds addObject:aView]; | ||
168 | + } | ||
169 | + } | ||
170 | + return [NSArray arrayWithArray:huds]; | ||
171 | +} | ||
172 | + | ||
173 | +#pragma mark - Lifecycle | ||
174 | + | ||
175 | +- (id)initWithFrame:(CGRect)frame { | ||
176 | + self = [super initWithFrame:frame]; | ||
177 | + if (self) { | ||
178 | + // Set default values for properties | ||
179 | + self.animationType = MBProgressHUDAnimationFade; | ||
180 | + self.mode = MBProgressHUDModeIndeterminate; | ||
181 | + self.labelText = nil; | ||
182 | + self.detailsLabelText = nil; | ||
183 | + self.opacity = 0.8f; | ||
184 | + self.color = nil; | ||
185 | + self.labelFont = [UIFont boldSystemFontOfSize:kLabelFontSize]; | ||
186 | + self.labelColor = [UIColor whiteColor]; | ||
187 | + self.detailsLabelFont = [UIFont boldSystemFontOfSize:kDetailsLabelFontSize]; | ||
188 | + self.detailsLabelColor = [UIColor whiteColor]; | ||
189 | + self.xOffset = 0.0f; | ||
190 | + self.yOffset = 0.0f; | ||
191 | + self.dimBackground = NO; | ||
192 | + self.margin = 20.0f; | ||
193 | + self.cornerRadius = 10.0f; | ||
194 | + self.graceTime = 0.0f; | ||
195 | + self.minShowTime = 0.0f; | ||
196 | + self.removeFromSuperViewOnHide = NO; | ||
197 | + self.minSize = CGSizeZero; | ||
198 | + self.square = NO; | ||
199 | + self.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | ||
200 | + | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; | ||
201 | + | ||
202 | + // Transparent background | ||
203 | + self.opaque = NO; | ||
204 | + self.backgroundColor = [UIColor clearColor]; | ||
205 | + // Make it invisible for now | ||
206 | + self.alpha = 0.0f; | ||
207 | + | ||
208 | + taskInProgress = NO; | ||
209 | + rotationTransform = CGAffineTransformIdentity; | ||
210 | + | ||
211 | + [self setupLabels]; | ||
212 | + [self updateIndicators]; | ||
213 | + [self registerForKVO]; | ||
214 | + [self registerForNotifications]; | ||
215 | + } | ||
216 | + return self; | ||
217 | +} | ||
218 | + | ||
219 | +- (id)initWithView:(UIView *)view { | ||
220 | + NSAssert(view, @"View must not be nil."); | ||
221 | + return [self initWithFrame:view.bounds]; | ||
222 | +} | ||
223 | + | ||
224 | +- (id)initWithWindow:(UIWindow *)window { | ||
225 | + return [self initWithView:window]; | ||
226 | +} | ||
227 | + | ||
228 | +- (void)dealloc { | ||
229 | + [self unregisterFromNotifications]; | ||
230 | + [self unregisterFromKVO]; | ||
231 | +#if !__has_feature(objc_arc) | ||
232 | + [color release]; | ||
233 | + [indicator release]; | ||
234 | + [label release]; | ||
235 | + [detailsLabel release]; | ||
236 | + [labelText release]; | ||
237 | + [detailsLabelText release]; | ||
238 | + [graceTimer release]; | ||
239 | + [minShowTimer release]; | ||
240 | + [showStarted release]; | ||
241 | + [customView release]; | ||
242 | +#if NS_BLOCKS_AVAILABLE | ||
243 | + [completionBlock release]; | ||
244 | +#endif | ||
245 | + [super dealloc]; | ||
246 | +#endif | ||
247 | +} | ||
248 | + | ||
249 | +#pragma mark - Show & hide | ||
250 | + | ||
251 | +- (void)show:(BOOL)animated { | ||
252 | + useAnimation = animated; | ||
253 | + // If the grace time is set postpone the HUD display | ||
254 | + if (self.graceTime > 0.0) { | ||
255 | + self.graceTimer = [NSTimer scheduledTimerWithTimeInterval:self.graceTime target:self | ||
256 | + selector:@selector(handleGraceTimer:) userInfo:nil repeats:NO]; | ||
257 | + } | ||
258 | + // ... otherwise show the HUD imediately | ||
259 | + else { | ||
260 | + [self setNeedsDisplay]; | ||
261 | + [self showUsingAnimation:useAnimation]; | ||
262 | + } | ||
263 | +} | ||
264 | + | ||
265 | +- (void)hide:(BOOL)animated { | ||
266 | + useAnimation = animated; | ||
267 | + // If the minShow time is set, calculate how long the hud was shown, | ||
268 | + // and pospone the hiding operation if necessary | ||
269 | + if (self.minShowTime > 0.0 && showStarted) { | ||
270 | + NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:showStarted]; | ||
271 | + if (interv < self.minShowTime) { | ||
272 | + self.minShowTimer = [NSTimer scheduledTimerWithTimeInterval:(self.minShowTime - interv) target:self | ||
273 | + selector:@selector(handleMinShowTimer:) userInfo:nil repeats:NO]; | ||
274 | + return; | ||
275 | + } | ||
276 | + } | ||
277 | + // ... otherwise hide the HUD immediately | ||
278 | + [self hideUsingAnimation:useAnimation]; | ||
279 | +} | ||
280 | + | ||
281 | +- (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay { | ||
282 | + [self performSelector:@selector(hideDelayed:) withObject:[NSNumber numberWithBool:animated] afterDelay:delay]; | ||
283 | +} | ||
284 | + | ||
285 | +- (void)hideDelayed:(NSNumber *)animated { | ||
286 | + [self hide:[animated boolValue]]; | ||
287 | +} | ||
288 | + | ||
289 | +#pragma mark - Timer callbacks | ||
290 | + | ||
291 | +- (void)handleGraceTimer:(NSTimer *)theTimer { | ||
292 | + // Show the HUD only if the task is still running | ||
293 | + if (taskInProgress) { | ||
294 | + [self setNeedsDisplay]; | ||
295 | + [self showUsingAnimation:useAnimation]; | ||
296 | + } | ||
297 | +} | ||
298 | + | ||
299 | +- (void)handleMinShowTimer:(NSTimer *)theTimer { | ||
300 | + [self hideUsingAnimation:useAnimation]; | ||
301 | +} | ||
302 | + | ||
303 | +#pragma mark - View Hierrarchy | ||
304 | + | ||
305 | +- (void)didMoveToSuperview { | ||
306 | + // We need to take care of rotation ourselfs if we're adding the HUD to a window | ||
307 | + if ([self.superview isKindOfClass:[UIWindow class]]) { | ||
308 | + [self setTransformForCurrentOrientation:NO]; | ||
309 | + } | ||
310 | +} | ||
311 | + | ||
312 | +#pragma mark - Internal show & hide operations | ||
313 | + | ||
314 | +- (void)showUsingAnimation:(BOOL)animated { | ||
315 | + if (animated && animationType == MBProgressHUDAnimationZoomIn) { | ||
316 | + self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); | ||
317 | + } else if (animated && animationType == MBProgressHUDAnimationZoomOut) { | ||
318 | + self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); | ||
319 | + } | ||
320 | + self.showStarted = [NSDate date]; | ||
321 | + // Fade in | ||
322 | + if (animated) { | ||
323 | + [UIView beginAnimations:nil context:NULL]; | ||
324 | + [UIView setAnimationDuration:0.30]; | ||
325 | + self.alpha = 1.0f; | ||
326 | + if (animationType == MBProgressHUDAnimationZoomIn || animationType == MBProgressHUDAnimationZoomOut) { | ||
327 | + self.transform = rotationTransform; | ||
328 | + } | ||
329 | + [UIView commitAnimations]; | ||
330 | + } | ||
331 | + else { | ||
332 | + self.alpha = 1.0f; | ||
333 | + } | ||
334 | +} | ||
335 | + | ||
336 | +- (void)hideUsingAnimation:(BOOL)animated { | ||
337 | + // Fade out | ||
338 | + if (animated && showStarted) { | ||
339 | + [UIView beginAnimations:nil context:NULL]; | ||
340 | + [UIView setAnimationDuration:0.30]; | ||
341 | + [UIView setAnimationDelegate:self]; | ||
342 | + [UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)]; | ||
343 | + // 0.02 prevents the hud from passing through touches during the animation the hud will get completely hidden | ||
344 | + // in the done method | ||
345 | + if (animationType == MBProgressHUDAnimationZoomIn) { | ||
346 | + self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); | ||
347 | + } else if (animationType == MBProgressHUDAnimationZoomOut) { | ||
348 | + self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); | ||
349 | + } | ||
350 | + | ||
351 | + self.alpha = 0.02f; | ||
352 | + [UIView commitAnimations]; | ||
353 | + } | ||
354 | + else { | ||
355 | + self.alpha = 0.0f; | ||
356 | + [self done]; | ||
357 | + } | ||
358 | + self.showStarted = nil; | ||
359 | +} | ||
360 | + | ||
361 | +- (void)animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void*)context { | ||
362 | + [self done]; | ||
363 | +} | ||
364 | + | ||
365 | +- (void)done { | ||
366 | + isFinished = YES; | ||
367 | + self.alpha = 0.0f; | ||
368 | + if (removeFromSuperViewOnHide) { | ||
369 | + [self removeFromSuperview]; | ||
370 | + } | ||
371 | +#if NS_BLOCKS_AVAILABLE | ||
372 | + if (self.completionBlock) { | ||
373 | + self.completionBlock(); | ||
374 | + self.completionBlock = NULL; | ||
375 | + } | ||
376 | +#endif | ||
377 | + if ([delegate respondsToSelector:@selector(hudWasHidden:)]) { | ||
378 | + [delegate performSelector:@selector(hudWasHidden:) withObject:self]; | ||
379 | + } | ||
380 | +} | ||
381 | + | ||
382 | +#pragma mark - Threading | ||
383 | + | ||
384 | +- (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated { | ||
385 | + methodForExecution = method; | ||
386 | + targetForExecution = MB_RETAIN(target); | ||
387 | + objectForExecution = MB_RETAIN(object); | ||
388 | + // Launch execution in new thread | ||
389 | + self.taskInProgress = YES; | ||
390 | + [NSThread detachNewThreadSelector:@selector(launchExecution) toTarget:self withObject:nil]; | ||
391 | + // Show HUD view | ||
392 | + [self show:animated]; | ||
393 | +} | ||
394 | + | ||
395 | +#if NS_BLOCKS_AVAILABLE | ||
396 | + | ||
397 | +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block { | ||
398 | + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); | ||
399 | + [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; | ||
400 | +} | ||
401 | + | ||
402 | +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(void (^)())completion { | ||
403 | + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); | ||
404 | + [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:completion]; | ||
405 | +} | ||
406 | + | ||
407 | +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue { | ||
408 | + [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; | ||
409 | +} | ||
410 | + | ||
411 | +- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue | ||
412 | + completionBlock:(MBProgressHUDCompletionBlock)completion { | ||
413 | + self.taskInProgress = YES; | ||
414 | + self.completionBlock = completion; | ||
415 | + dispatch_async(queue, ^(void) { | ||
416 | + block(); | ||
417 | + dispatch_async(dispatch_get_main_queue(), ^(void) { | ||
418 | + [self cleanUp]; | ||
419 | + }); | ||
420 | + }); | ||
421 | + [self show:animated]; | ||
422 | +} | ||
423 | + | ||
424 | +#endif | ||
425 | + | ||
426 | +- (void)launchExecution { | ||
427 | + @autoreleasepool { | ||
428 | +#pragma clang diagnostic push | ||
429 | +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" | ||
430 | + // Start executing the requested task | ||
431 | + [targetForExecution performSelector:methodForExecution withObject:objectForExecution]; | ||
432 | +#pragma clang diagnostic pop | ||
433 | + // Task completed, update view in main thread (note: view operations should | ||
434 | + // be done only in the main thread) | ||
435 | + [self performSelectorOnMainThread:@selector(cleanUp) withObject:nil waitUntilDone:NO]; | ||
436 | + } | ||
437 | +} | ||
438 | + | ||
439 | +- (void)cleanUp { | ||
440 | + taskInProgress = NO; | ||
441 | +#if !__has_feature(objc_arc) | ||
442 | + [targetForExecution release]; | ||
443 | + [objectForExecution release]; | ||
444 | +#else | ||
445 | + targetForExecution = nil; | ||
446 | + objectForExecution = nil; | ||
447 | +#endif | ||
448 | + [self hide:useAnimation]; | ||
449 | +} | ||
450 | + | ||
451 | +#pragma mark - UI | ||
452 | + | ||
453 | +- (void)setupLabels { | ||
454 | + label = [[UILabel alloc] initWithFrame:self.bounds]; | ||
455 | + label.adjustsFontSizeToFitWidth = NO; | ||
456 | + label.textAlignment = MBLabelAlignmentCenter; | ||
457 | + label.opaque = NO; | ||
458 | + label.backgroundColor = [UIColor clearColor]; | ||
459 | + label.textColor = self.labelColor; | ||
460 | + label.font = self.labelFont; | ||
461 | + label.text = self.labelText; | ||
462 | + [self addSubview:label]; | ||
463 | + | ||
464 | + detailsLabel = [[UILabel alloc] initWithFrame:self.bounds]; | ||
465 | + detailsLabel.font = self.detailsLabelFont; | ||
466 | + detailsLabel.adjustsFontSizeToFitWidth = NO; | ||
467 | + detailsLabel.textAlignment = MBLabelAlignmentCenter; | ||
468 | + detailsLabel.opaque = NO; | ||
469 | + detailsLabel.backgroundColor = [UIColor clearColor]; | ||
470 | + detailsLabel.textColor = self.detailsLabelColor; | ||
471 | + detailsLabel.numberOfLines = 0; | ||
472 | + detailsLabel.font = self.detailsLabelFont; | ||
473 | + detailsLabel.text = self.detailsLabelText; | ||
474 | + [self addSubview:detailsLabel]; | ||
475 | +} | ||
476 | + | ||
477 | +- (void)updateIndicators { | ||
478 | + | ||
479 | + BOOL isActivityIndicator = [indicator isKindOfClass:[UIActivityIndicatorView class]]; | ||
480 | + BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]]; | ||
481 | + | ||
482 | + if (mode == MBProgressHUDModeIndeterminate && !isActivityIndicator) { | ||
483 | + // Update to indeterminate indicator | ||
484 | + [indicator removeFromSuperview]; | ||
485 | + self.indicator = MB_AUTORELEASE([[UIActivityIndicatorView alloc] | ||
486 | + initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]); | ||
487 | + [(UIActivityIndicatorView *)indicator startAnimating]; | ||
488 | + [self addSubview:indicator]; | ||
489 | + } | ||
490 | + else if (mode == MBProgressHUDModeDeterminateHorizontalBar) { | ||
491 | + // Update to bar determinate indicator | ||
492 | + [indicator removeFromSuperview]; | ||
493 | + self.indicator = MB_AUTORELEASE([[MBBarProgressView alloc] init]); | ||
494 | + [self addSubview:indicator]; | ||
495 | + } | ||
496 | + else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) { | ||
497 | + if (!isRoundIndicator) { | ||
498 | + // Update to determinante indicator | ||
499 | + [indicator removeFromSuperview]; | ||
500 | + self.indicator = MB_AUTORELEASE([[MBRoundProgressView alloc] init]); | ||
501 | + [self addSubview:indicator]; | ||
502 | + } | ||
503 | + if (mode == MBProgressHUDModeAnnularDeterminate) { | ||
504 | + [(MBRoundProgressView *)indicator setAnnular:YES]; | ||
505 | + } | ||
506 | + } | ||
507 | + else if (mode == MBProgressHUDModeCustomView && customView != indicator) { | ||
508 | + // Update custom view indicator | ||
509 | + [indicator removeFromSuperview]; | ||
510 | + self.indicator = customView; | ||
511 | + [self addSubview:indicator]; | ||
512 | + } else if (mode == MBProgressHUDModeText) { | ||
513 | + [indicator removeFromSuperview]; | ||
514 | + self.indicator = nil; | ||
515 | + } | ||
516 | +} | ||
517 | + | ||
518 | +#pragma mark - Layout | ||
519 | + | ||
520 | +- (void)layoutSubviews { | ||
521 | + | ||
522 | + // Entirely cover the parent view | ||
523 | + UIView *parent = self.superview; | ||
524 | + if (parent) { | ||
525 | + self.frame = parent.bounds; | ||
526 | + } | ||
527 | + CGRect bounds = self.bounds; | ||
528 | + | ||
529 | + // Determine the total widt and height needed | ||
530 | + CGFloat maxWidth = bounds.size.width - 4 * margin; | ||
531 | + CGSize totalSize = CGSizeZero; | ||
532 | + | ||
533 | + CGRect indicatorF = indicator.bounds; | ||
534 | + indicatorF.size.width = MIN(indicatorF.size.width, maxWidth); | ||
535 | + totalSize.width = MAX(totalSize.width, indicatorF.size.width); | ||
536 | + totalSize.height += indicatorF.size.height; | ||
537 | + | ||
538 | + CGSize labelSize = MB_TEXTSIZE(label.text, label.font); | ||
539 | + labelSize.width = MIN(labelSize.width, maxWidth); | ||
540 | + totalSize.width = MAX(totalSize.width, labelSize.width); | ||
541 | + totalSize.height += labelSize.height; | ||
542 | + if (labelSize.height > 0.f && indicatorF.size.height > 0.f) { | ||
543 | + totalSize.height += kPadding; | ||
544 | + } | ||
545 | + | ||
546 | + CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin; | ||
547 | + CGSize maxSize = CGSizeMake(maxWidth, remainingHeight); | ||
548 | + CGSize detailsLabelSize = MB_MULTILINE_TEXTSIZE(detailsLabel.text, detailsLabel.font, maxSize, detailsLabel.lineBreakMode); | ||
549 | + totalSize.width = MAX(totalSize.width, detailsLabelSize.width); | ||
550 | + totalSize.height += detailsLabelSize.height; | ||
551 | + if (detailsLabelSize.height > 0.f && (indicatorF.size.height > 0.f || labelSize.height > 0.f)) { | ||
552 | + totalSize.height += kPadding; | ||
553 | + } | ||
554 | + | ||
555 | + totalSize.width += 2 * margin; | ||
556 | + totalSize.height += 2 * margin; | ||
557 | + | ||
558 | + // Position elements | ||
559 | + CGFloat yPos = round(((bounds.size.height - totalSize.height) / 2)) + margin + yOffset; | ||
560 | + CGFloat xPos = xOffset; | ||
561 | + indicatorF.origin.y = yPos; | ||
562 | + indicatorF.origin.x = round((bounds.size.width - indicatorF.size.width) / 2) + xPos; | ||
563 | + indicator.frame = indicatorF; | ||
564 | + yPos += indicatorF.size.height; | ||
565 | + | ||
566 | + if (labelSize.height > 0.f && indicatorF.size.height > 0.f) { | ||
567 | + yPos += kPadding; | ||
568 | + } | ||
569 | + CGRect labelF; | ||
570 | + labelF.origin.y = yPos; | ||
571 | + labelF.origin.x = round((bounds.size.width - labelSize.width) / 2) + xPos; | ||
572 | + labelF.size = labelSize; | ||
573 | + label.frame = labelF; | ||
574 | + yPos += labelF.size.height; | ||
575 | + | ||
576 | + if (detailsLabelSize.height > 0.f && (indicatorF.size.height > 0.f || labelSize.height > 0.f)) { | ||
577 | + yPos += kPadding; | ||
578 | + } | ||
579 | + CGRect detailsLabelF; | ||
580 | + detailsLabelF.origin.y = yPos; | ||
581 | + detailsLabelF.origin.x = round((bounds.size.width - detailsLabelSize.width) / 2) + xPos; | ||
582 | + detailsLabelF.size = detailsLabelSize; | ||
583 | + detailsLabel.frame = detailsLabelF; | ||
584 | + | ||
585 | + // Enforce minsize and quare rules | ||
586 | + if (square) { | ||
587 | + CGFloat max = MAX(totalSize.width, totalSize.height); | ||
588 | + if (max <= bounds.size.width - 2 * margin) { | ||
589 | + totalSize.width = max; | ||
590 | + } | ||
591 | + if (max <= bounds.size.height - 2 * margin) { | ||
592 | + totalSize.height = max; | ||
593 | + } | ||
594 | + } | ||
595 | + if (totalSize.width < minSize.width) { | ||
596 | + totalSize.width = minSize.width; | ||
597 | + } | ||
598 | + if (totalSize.height < minSize.height) { | ||
599 | + totalSize.height = minSize.height; | ||
600 | + } | ||
601 | + | ||
602 | + self.size = totalSize; | ||
603 | +} | ||
604 | + | ||
605 | +#pragma mark BG Drawing | ||
606 | + | ||
607 | +- (void)drawRect:(CGRect)rect { | ||
608 | + | ||
609 | + CGContextRef context = UIGraphicsGetCurrentContext(); | ||
610 | + UIGraphicsPushContext(context); | ||
611 | + | ||
612 | + if (self.dimBackground) { | ||
613 | + //Gradient colours | ||
614 | + size_t gradLocationsNum = 2; | ||
615 | + CGFloat gradLocations[2] = {0.0f, 1.0f}; | ||
616 | + CGFloat gradColors[8] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.75f}; | ||
617 | + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); | ||
618 | + CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradColors, gradLocations, gradLocationsNum); | ||
619 | + CGColorSpaceRelease(colorSpace); | ||
620 | + //Gradient center | ||
621 | + CGPoint gradCenter= CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); | ||
622 | + //Gradient radius | ||
623 | + float gradRadius = MIN(self.bounds.size.width , self.bounds.size.height) ; | ||
624 | + //Gradient draw | ||
625 | + CGContextDrawRadialGradient (context, gradient, gradCenter, | ||
626 | + 0, gradCenter, gradRadius, | ||
627 | + kCGGradientDrawsAfterEndLocation); | ||
628 | + CGGradientRelease(gradient); | ||
629 | + } | ||
630 | + | ||
631 | + // Set background rect color | ||
632 | + if (self.color) { | ||
633 | + CGContextSetFillColorWithColor(context, self.color.CGColor); | ||
634 | + } else { | ||
635 | + CGContextSetGrayFillColor(context, 0.0f, self.opacity); | ||
636 | + } | ||
637 | + | ||
638 | + | ||
639 | + // Center HUD | ||
640 | + CGRect allRect = self.bounds; | ||
641 | + // Draw rounded HUD backgroud rect | ||
642 | + CGRect boxRect = CGRectMake(round((allRect.size.width - size.width) / 2) + self.xOffset, | ||
643 | + round((allRect.size.height - size.height) / 2) + self.yOffset, size.width, size.height); | ||
644 | + float radius = self.cornerRadius; | ||
645 | + CGContextBeginPath(context); | ||
646 | + CGContextMoveToPoint(context, CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect)); | ||
647 | + CGContextAddArc(context, CGRectGetMaxX(boxRect) - radius, CGRectGetMinY(boxRect) + radius, radius, 3 * (float)M_PI / 2, 0, 0); | ||
648 | + CGContextAddArc(context, CGRectGetMaxX(boxRect) - radius, CGRectGetMaxY(boxRect) - radius, radius, 0, (float)M_PI / 2, 0); | ||
649 | + CGContextAddArc(context, CGRectGetMinX(boxRect) + radius, CGRectGetMaxY(boxRect) - radius, radius, (float)M_PI / 2, (float)M_PI, 0); | ||
650 | + CGContextAddArc(context, CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect) + radius, radius, (float)M_PI, 3 * (float)M_PI / 2, 0); | ||
651 | + CGContextClosePath(context); | ||
652 | + CGContextFillPath(context); | ||
653 | + | ||
654 | + UIGraphicsPopContext(); | ||
655 | +} | ||
656 | + | ||
657 | +#pragma mark - KVO | ||
658 | + | ||
659 | +- (void)registerForKVO { | ||
660 | + for (NSString *keyPath in [self observableKeypaths]) { | ||
661 | + [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL]; | ||
662 | + } | ||
663 | +} | ||
664 | + | ||
665 | +- (void)unregisterFromKVO { | ||
666 | + for (NSString *keyPath in [self observableKeypaths]) { | ||
667 | + [self removeObserver:self forKeyPath:keyPath]; | ||
668 | + } | ||
669 | +} | ||
670 | + | ||
671 | +- (NSArray *)observableKeypaths { | ||
672 | + return [NSArray arrayWithObjects:@"mode", @"customView", @"labelText", @"labelFont", @"labelColor", | ||
673 | + @"detailsLabelText", @"detailsLabelFont", @"detailsLabelColor", @"progress", nil]; | ||
674 | +} | ||
675 | + | ||
676 | +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { | ||
677 | + if (![NSThread isMainThread]) { | ||
678 | + [self performSelectorOnMainThread:@selector(updateUIForKeypath:) withObject:keyPath waitUntilDone:NO]; | ||
679 | + } else { | ||
680 | + [self updateUIForKeypath:keyPath]; | ||
681 | + } | ||
682 | +} | ||
683 | + | ||
684 | +- (void)updateUIForKeypath:(NSString *)keyPath { | ||
685 | + if ([keyPath isEqualToString:@"mode"] || [keyPath isEqualToString:@"customView"]) { | ||
686 | + [self updateIndicators]; | ||
687 | + } else if ([keyPath isEqualToString:@"labelText"]) { | ||
688 | + label.text = self.labelText; | ||
689 | + } else if ([keyPath isEqualToString:@"labelFont"]) { | ||
690 | + label.font = self.labelFont; | ||
691 | + } else if ([keyPath isEqualToString:@"labelColor"]) { | ||
692 | + label.textColor = self.labelColor; | ||
693 | + } else if ([keyPath isEqualToString:@"detailsLabelText"]) { | ||
694 | + detailsLabel.text = self.detailsLabelText; | ||
695 | + } else if ([keyPath isEqualToString:@"detailsLabelFont"]) { | ||
696 | + detailsLabel.font = self.detailsLabelFont; | ||
697 | + } else if ([keyPath isEqualToString:@"detailsLabelColor"]) { | ||
698 | + detailsLabel.textColor = self.detailsLabelColor; | ||
699 | + } else if ([keyPath isEqualToString:@"progress"]) { | ||
700 | + if ([indicator respondsToSelector:@selector(setProgress:)]) { | ||
701 | + [(id)indicator setProgress:progress]; | ||
702 | + } | ||
703 | + return; | ||
704 | + } | ||
705 | + [self setNeedsLayout]; | ||
706 | + [self setNeedsDisplay]; | ||
707 | +} | ||
708 | + | ||
709 | +#pragma mark - Notifications | ||
710 | + | ||
711 | +- (void)registerForNotifications { | ||
712 | + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; | ||
713 | + [nc addObserver:self selector:@selector(deviceOrientationDidChange:) | ||
714 | + name:UIDeviceOrientationDidChangeNotification object:nil]; | ||
715 | +} | ||
716 | + | ||
717 | +- (void)unregisterFromNotifications { | ||
718 | + [[NSNotificationCenter defaultCenter] removeObserver:self]; | ||
719 | +} | ||
720 | + | ||
721 | +- (void)deviceOrientationDidChange:(NSNotification *)notification { | ||
722 | + UIView *superview = self.superview; | ||
723 | + if (!superview) { | ||
724 | + return; | ||
725 | + } else if ([superview isKindOfClass:[UIWindow class]]) { | ||
726 | + [self setTransformForCurrentOrientation:YES]; | ||
727 | + } else { | ||
728 | + self.frame = self.superview.bounds; | ||
729 | + [self setNeedsDisplay]; | ||
730 | + } | ||
731 | +} | ||
732 | + | ||
733 | +- (void)setTransformForCurrentOrientation:(BOOL)animated { | ||
734 | + // Stay in sync with the superview | ||
735 | + if (self.superview) { | ||
736 | + self.bounds = self.superview.bounds; | ||
737 | + [self setNeedsDisplay]; | ||
738 | + } | ||
739 | + | ||
740 | + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; | ||
741 | + CGFloat radians = 0; | ||
742 | + if (UIInterfaceOrientationIsLandscape(orientation)) { | ||
743 | + if (orientation == UIInterfaceOrientationLandscapeLeft) { radians = -(CGFloat)M_PI_2; } | ||
744 | + else { radians = (CGFloat)M_PI_2; } | ||
745 | + // Window coordinates differ! | ||
746 | + self.bounds = CGRectMake(0, 0, self.bounds.size.height, self.bounds.size.width); | ||
747 | + } else { | ||
748 | + if (orientation == UIInterfaceOrientationPortraitUpsideDown) { radians = (CGFloat)M_PI; } | ||
749 | + else { radians = 0; } | ||
750 | + } | ||
751 | + rotationTransform = CGAffineTransformMakeRotation(radians); | ||
752 | + | ||
753 | + if (animated) { | ||
754 | + [UIView beginAnimations:nil context:nil]; | ||
755 | + } | ||
756 | + [self setTransform:rotationTransform]; | ||
757 | + if (animated) { | ||
758 | + [UIView commitAnimations]; | ||
759 | + } | ||
760 | +} | ||
761 | + | ||
762 | +@end | ||
763 | + | ||
764 | + | ||
765 | +@implementation MBRoundProgressView | ||
766 | + | ||
767 | +#pragma mark - Lifecycle | ||
768 | + | ||
769 | +- (id)init { | ||
770 | + return [self initWithFrame:CGRectMake(0.f, 0.f, 37.f, 37.f)]; | ||
771 | +} | ||
772 | + | ||
773 | +- (id)initWithFrame:(CGRect)frame { | ||
774 | + self = [super initWithFrame:frame]; | ||
775 | + if (self) { | ||
776 | + self.backgroundColor = [UIColor clearColor]; | ||
777 | + self.opaque = NO; | ||
778 | + _progress = 0.f; | ||
779 | + _annular = NO; | ||
780 | + _progressTintColor = [[UIColor alloc] initWithWhite:1.f alpha:1.f]; | ||
781 | + _backgroundTintColor = [[UIColor alloc] initWithWhite:1.f alpha:.1f]; | ||
782 | + [self registerForKVO]; | ||
783 | + } | ||
784 | + return self; | ||
785 | +} | ||
786 | + | ||
787 | +- (void)dealloc { | ||
788 | + [self unregisterFromKVO]; | ||
789 | +#if !__has_feature(objc_arc) | ||
790 | + [_progressTintColor release]; | ||
791 | + [_backgroundTintColor release]; | ||
792 | + [super dealloc]; | ||
793 | +#endif | ||
794 | +} | ||
795 | + | ||
796 | +#pragma mark - Drawing | ||
797 | + | ||
798 | +- (void)drawRect:(CGRect)rect { | ||
799 | + | ||
800 | + CGRect allRect = self.bounds; | ||
801 | + CGRect circleRect = CGRectInset(allRect, 2.0f, 2.0f); | ||
802 | + CGContextRef context = UIGraphicsGetCurrentContext(); | ||
803 | + | ||
804 | + if (_annular) { | ||
805 | + // Draw background | ||
806 | + CGFloat lineWidth = 5.f; | ||
807 | + UIBezierPath *processBackgroundPath = [UIBezierPath bezierPath]; | ||
808 | + processBackgroundPath.lineWidth = lineWidth; | ||
809 | + processBackgroundPath.lineCapStyle = kCGLineCapRound; | ||
810 | + CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); | ||
811 | + CGFloat radius = (self.bounds.size.width - lineWidth)/2; | ||
812 | + CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees | ||
813 | + CGFloat endAngle = (2 * (float)M_PI) + startAngle; | ||
814 | + [processBackgroundPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; | ||
815 | + [_backgroundTintColor set]; | ||
816 | + [processBackgroundPath stroke]; | ||
817 | + // Draw progress | ||
818 | + UIBezierPath *processPath = [UIBezierPath bezierPath]; | ||
819 | + processPath.lineCapStyle = kCGLineCapRound; | ||
820 | + processPath.lineWidth = lineWidth; | ||
821 | + endAngle = (self.progress * 2 * (float)M_PI) + startAngle; | ||
822 | + [processPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; | ||
823 | + [_progressTintColor set]; | ||
824 | + [processPath stroke]; | ||
825 | + } else { | ||
826 | + // Draw background | ||
827 | + [_progressTintColor setStroke]; | ||
828 | + [_backgroundTintColor setFill]; | ||
829 | + CGContextSetLineWidth(context, 2.0f); | ||
830 | + CGContextFillEllipseInRect(context, circleRect); | ||
831 | + CGContextStrokeEllipseInRect(context, circleRect); | ||
832 | + // Draw progress | ||
833 | + CGPoint center = CGPointMake(allRect.size.width / 2, allRect.size.height / 2); | ||
834 | + CGFloat radius = (allRect.size.width - 4) / 2; | ||
835 | + CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees | ||
836 | + CGFloat endAngle = (self.progress * 2 * (float)M_PI) + startAngle; | ||
837 | + CGContextSetRGBFillColor(context, 1.0f, 1.0f, 1.0f, 1.0f); // white | ||
838 | + CGContextMoveToPoint(context, center.x, center.y); | ||
839 | + CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0); | ||
840 | + CGContextClosePath(context); | ||
841 | + CGContextFillPath(context); | ||
842 | + } | ||
843 | +} | ||
844 | + | ||
845 | +#pragma mark - KVO | ||
846 | + | ||
847 | +- (void)registerForKVO { | ||
848 | + for (NSString *keyPath in [self observableKeypaths]) { | ||
849 | + [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL]; | ||
850 | + } | ||
851 | +} | ||
852 | + | ||
853 | +- (void)unregisterFromKVO { | ||
854 | + for (NSString *keyPath in [self observableKeypaths]) { | ||
855 | + [self removeObserver:self forKeyPath:keyPath]; | ||
856 | + } | ||
857 | +} | ||
858 | + | ||
859 | +- (NSArray *)observableKeypaths { | ||
860 | + return [NSArray arrayWithObjects:@"progressTintColor", @"backgroundTintColor", @"progress", @"annular", nil]; | ||
861 | +} | ||
862 | + | ||
863 | +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { | ||
864 | + [self setNeedsDisplay]; | ||
865 | +} | ||
866 | + | ||
867 | +@end | ||
868 | + | ||
869 | + | ||
870 | +@implementation MBBarProgressView | ||
871 | + | ||
872 | +#pragma mark - Lifecycle | ||
873 | + | ||
874 | +- (id)init { | ||
875 | + return [self initWithFrame:CGRectMake(.0f, .0f, 120.0f, 20.0f)]; | ||
876 | +} | ||
877 | + | ||
878 | +- (id)initWithFrame:(CGRect)frame { | ||
879 | + self = [super initWithFrame:frame]; | ||
880 | + if (self) { | ||
881 | + _progress = 0.f; | ||
882 | + _lineColor = [UIColor whiteColor]; | ||
883 | + _progressColor = [UIColor whiteColor]; | ||
884 | + _progressRemainingColor = [UIColor clearColor]; | ||
885 | + self.backgroundColor = [UIColor clearColor]; | ||
886 | + self.opaque = NO; | ||
887 | + [self registerForKVO]; | ||
888 | + } | ||
889 | + return self; | ||
890 | +} | ||
891 | + | ||
892 | +- (void)dealloc { | ||
893 | + [self unregisterFromKVO]; | ||
894 | +#if !__has_feature(objc_arc) | ||
895 | + [_lineColor release]; | ||
896 | + [_progressColor release]; | ||
897 | + [_progressRemainingColor release]; | ||
898 | + [super dealloc]; | ||
899 | +#endif | ||
900 | +} | ||
901 | + | ||
902 | +#pragma mark - Drawing | ||
903 | + | ||
904 | +- (void)drawRect:(CGRect)rect { | ||
905 | + CGContextRef context = UIGraphicsGetCurrentContext(); | ||
906 | + | ||
907 | + // setup properties | ||
908 | + CGContextSetLineWidth(context, 2); | ||
909 | + CGContextSetStrokeColorWithColor(context,[_lineColor CGColor]); | ||
910 | + CGContextSetFillColorWithColor(context, [_progressRemainingColor CGColor]); | ||
911 | + | ||
912 | + // draw line border | ||
913 | + float radius = (rect.size.height / 2) - 2; | ||
914 | + CGContextMoveToPoint(context, 2, rect.size.height/2); | ||
915 | + CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius); | ||
916 | + CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2); | ||
917 | + CGContextAddArcToPoint(context, rect.size.width - 2, 2, rect.size.width - 2, rect.size.height / 2, radius); | ||
918 | + CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius); | ||
919 | + CGContextAddLineToPoint(context, radius + 2, rect.size.height - 2); | ||
920 | + CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius); | ||
921 | + CGContextFillPath(context); | ||
922 | + | ||
923 | + // draw progress background | ||
924 | + CGContextMoveToPoint(context, 2, rect.size.height/2); | ||
925 | + CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius); | ||
926 | + CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2); | ||
927 | + CGContextAddArcToPoint(context, rect.size.width - 2, 2, rect.size.width - 2, rect.size.height / 2, radius); | ||
928 | + CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius); | ||
929 | + CGContextAddLineToPoint(context, radius + 2, rect.size.height - 2); | ||
930 | + CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius); | ||
931 | + CGContextStrokePath(context); | ||
932 | + | ||
933 | + // setup to draw progress color | ||
934 | + CGContextSetFillColorWithColor(context, [_progressColor CGColor]); | ||
935 | + radius = radius - 2; | ||
936 | + float amount = self.progress * rect.size.width; | ||
937 | + | ||
938 | + // if progress is in the middle area | ||
939 | + if (amount >= radius + 4 && amount <= (rect.size.width - radius - 4)) { | ||
940 | + // top | ||
941 | + CGContextMoveToPoint(context, 4, rect.size.height/2); | ||
942 | + CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); | ||
943 | + CGContextAddLineToPoint(context, amount, 4); | ||
944 | + CGContextAddLineToPoint(context, amount, radius + 4); | ||
945 | + | ||
946 | + // bottom | ||
947 | + CGContextMoveToPoint(context, 4, rect.size.height/2); | ||
948 | + CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); | ||
949 | + CGContextAddLineToPoint(context, amount, rect.size.height - 4); | ||
950 | + CGContextAddLineToPoint(context, amount, radius + 4); | ||
951 | + | ||
952 | + CGContextFillPath(context); | ||
953 | + } | ||
954 | + | ||
955 | + // progress is in the right arc | ||
956 | + else if (amount > radius + 4) { | ||
957 | + float x = amount - (rect.size.width - radius - 4); | ||
958 | + | ||
959 | + // top | ||
960 | + CGContextMoveToPoint(context, 4, rect.size.height/2); | ||
961 | + CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); | ||
962 | + CGContextAddLineToPoint(context, rect.size.width - radius - 4, 4); | ||
963 | + float angle = -acos(x/radius); | ||
964 | + if (isnan(angle)) angle = 0; | ||
965 | + CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, M_PI, angle, 0); | ||
966 | + CGContextAddLineToPoint(context, amount, rect.size.height/2); | ||
967 | + | ||
968 | + // bottom | ||
969 | + CGContextMoveToPoint(context, 4, rect.size.height/2); | ||
970 | + CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); | ||
971 | + CGContextAddLineToPoint(context, rect.size.width - radius - 4, rect.size.height - 4); | ||
972 | + angle = acos(x/radius); | ||
973 | + if (isnan(angle)) angle = 0; | ||
974 | + CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, -M_PI, angle, 1); | ||
975 | + CGContextAddLineToPoint(context, amount, rect.size.height/2); | ||
976 | + | ||
977 | + CGContextFillPath(context); | ||
978 | + } | ||
979 | + | ||
980 | + // progress is in the left arc | ||
981 | + else if (amount < radius + 4 && amount > 0) { | ||
982 | + // top | ||
983 | + CGContextMoveToPoint(context, 4, rect.size.height/2); | ||
984 | + CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); | ||
985 | + CGContextAddLineToPoint(context, radius + 4, rect.size.height/2); | ||
986 | + | ||
987 | + // bottom | ||
988 | + CGContextMoveToPoint(context, 4, rect.size.height/2); | ||
989 | + CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); | ||
990 | + CGContextAddLineToPoint(context, radius + 4, rect.size.height/2); | ||
991 | + | ||
992 | + CGContextFillPath(context); | ||
993 | + } | ||
994 | +} | ||
995 | + | ||
996 | +#pragma mark - KVO | ||
997 | + | ||
998 | +- (void)registerForKVO { | ||
999 | + for (NSString *keyPath in [self observableKeypaths]) { | ||
1000 | + [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL]; | ||
1001 | + } | ||
1002 | +} | ||
1003 | + | ||
1004 | +- (void)unregisterFromKVO { | ||
1005 | + for (NSString *keyPath in [self observableKeypaths]) { | ||
1006 | + [self removeObserver:self forKeyPath:keyPath]; | ||
1007 | + } | ||
1008 | +} | ||
1009 | + | ||
1010 | +- (NSArray *)observableKeypaths { | ||
1011 | + return [NSArray arrayWithObjects:@"lineColor", @"progressRemainingColor", @"progressColor", @"progress", nil]; | ||
1012 | +} | ||
1013 | + | ||
1014 | +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { | ||
1015 | + [self setNeedsDisplay]; | ||
1016 | +} | ||
1017 | + | ||
1018 | +@end |
1 | + | ||
2 | +// | ||
3 | +// PPInterface.h | ||
4 | +// PoolSdk | ||
5 | +// | ||
6 | +// Created by winFan on 11/23/15. | ||
7 | +// Copyright (c) 2015 winFan. All rights reserved. | ||
8 | +// | ||
9 | + | ||
10 | +#import <PoolSdk/PoolSdk2.h> | ||
11 | +#import <WSSDK/WSPlatformManager.h> | ||
12 | + | ||
13 | +@interface SDKInterface : Interface<WSPlatformDelegate,WSPlatformPayDelegate> | ||
14 | + | ||
15 | +@end |
1 | +// | ||
2 | +// UnionInterface.m | ||
3 | +// PoolSdk | ||
4 | +// | ||
5 | +// Created by winFan on 11/23/15. | ||
6 | +// Copyright (c) 2015 winFan. All rights reserved. | ||
7 | +// | ||
8 | +#include "SDKInterface.h" | ||
9 | +#import <UIKit/UIKit.h> | ||
10 | +#import <WSSDK/WSUserParser.h> | ||
11 | + | ||
12 | + | ||
13 | +@interface SDKInterface(){ | ||
14 | + NSString *gold; | ||
15 | +} | ||
16 | + | ||
17 | +@end | ||
18 | + | ||
19 | +@implementation SDKInterface : Interface | ||
20 | + | ||
21 | +/** | ||
22 | + 初始化SDK | ||
23 | +*/ | ||
24 | +- (void)SDKinit:(UIViewController *) control | ||
25 | +{ | ||
26 | + //必须继承 | ||
27 | + [super SDKinit:control]; | ||
28 | + | ||
29 | + PoolConfig *config = [PoolConfig getInstance]; | ||
30 | + NSString *site = [config getValueByKey:@"site"]; | ||
31 | + NSString *key = [config getValueByKey:@"key"]; | ||
32 | + NSString *aid = [config getValueByKey:@"aid"]; | ||
33 | + NSString *cid = [config getValueByKey:@"cid"]; | ||
34 | + | ||
35 | + [[WSPlatformManager sharedPlatform] startWithSite:site key:key aid:aid cid:cid]; | ||
36 | + [[WSPlatformManager sharedPlatform] setDelegate:self]; | ||
37 | + [[WSPlatformManager sharedPlatform] setPaydelegate:self]; | ||
38 | + | ||
39 | + [[PoolChecker getInstance] sendNotice:PoolSDKNotificationInitSDK notiName:@"InitSuccess" statusCode:POOLSDK_NO_ERROR description:@"initSuccess" extendData:nil]; | ||
40 | +} | ||
41 | + | ||
42 | +/** | ||
43 | + 登录SDK | ||
44 | + */ | ||
45 | +- (void)SDKloginSDK | ||
46 | +{ | ||
47 | + NSLog(@"调用了LoginSDK"); | ||
48 | + [[WSPlatformManager sharedPlatform] onLogin]; | ||
49 | +} | ||
50 | + | ||
51 | +/* | ||
52 | + *登录验证请求方法模版 | ||
53 | + */ | ||
54 | +- (void)loginCheck | ||
55 | +{ | ||
56 | + PoolLoginInfo *loginInfo = [[PoolLoginInfo alloc]init]; | ||
57 | + loginInfo.openId = [WSUserParser parseUid];//渠道userId | ||
58 | + loginInfo.timestamp = [self getCurrentTimestamp]; | ||
59 | + loginInfo.sign = [WSUserParser parseSessionId];//渠道SDK的token | ||
60 | + dispatch_async(dispatch_get_global_queue(0, 0), ^{ | ||
61 | + [[PoolChecker getInstance]startCheck:loginInfo];//登录验证请求 | ||
62 | + }); | ||
63 | +} | ||
64 | + | ||
65 | + | ||
66 | +- (void)SDKreport:(PoolReportInfo *)reportInfo | ||
67 | +{ | ||
68 | + NSLog(@"reportInfo"); | ||
69 | + if ([REPORT_CREATEROLE isEqualToString:[reportInfo reportType]]) { | ||
70 | + | ||
71 | + }else if ([[reportInfo reportType] isEqualToString:REPORT_ENTER]) { | ||
72 | + gold = [[NSString alloc] initWithFormat:@"%@",[reportInfo diamond]]; | ||
73 | + | ||
74 | + NSDictionary *userDict = @{ | ||
75 | + @"sid":[reportInfo serverId], | ||
76 | + @"roleid":[reportInfo playerId], | ||
77 | + @"rolename":[reportInfo playerName], | ||
78 | + @"level":[reportInfo playerLevel], | ||
79 | + @"gold":gold, | ||
80 | + }; | ||
81 | + | ||
82 | + [[WSPlatformManager sharedPlatform] gameLoginSuccessUserInfo:userDict]; | ||
83 | + [[WSPlatformManager sharedPlatform] showTheRollingView]; | ||
84 | + } | ||
85 | +} | ||
86 | + | ||
87 | +/** | ||
88 | + @return 商品名称 | ||
89 | + */ | ||
90 | +- (NSString*)getProductNameByAmount:(NSString*)products amount:(NSString*)amount | ||
91 | +{ | ||
92 | + NSData* jsonData = [NSJSONSerialization dataWithJSONObject:products options:NSJSONWritingPrettyPrinted error:nil]; | ||
93 | + if(jsonData){ | ||
94 | + NSDictionary* productList = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil]; | ||
95 | + if(productList){ | ||
96 | + NSEnumerator* keysList = [productList keyEnumerator]; | ||
97 | + id keyValue; | ||
98 | + while (keyValue = [keysList nextObject]) | ||
99 | + { | ||
100 | + NSString* appleAmount = [[productList objectForKey:keyValue] objectForKey:@"amount"]; | ||
101 | + if(appleAmount.intValue == amount.intValue){ | ||
102 | + NSString* productName = [[productList objectForKey:keyValue] objectForKey:@"name"]; | ||
103 | + return productName; | ||
104 | + } | ||
105 | + } | ||
106 | + } | ||
107 | + } | ||
108 | + NSLog(@"get product name error amount:%@",amount); | ||
109 | + return @"元宝"; | ||
110 | +} | ||
111 | + | ||
112 | +/** | ||
113 | + @return 商品ID | ||
114 | + */ | ||
115 | +- (NSString*)getProductIdByAmount:(NSString*)products amount:(NSString*)amount | ||
116 | +{ | ||
117 | + NSData* jsonData = [NSJSONSerialization dataWithJSONObject:products options:NSJSONWritingPrettyPrinted error:nil]; | ||
118 | + if(jsonData){ | ||
119 | + NSDictionary* productList = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil]; | ||
120 | + if(productList){ | ||
121 | + NSEnumerator* keysList = [productList keyEnumerator]; | ||
122 | + id keyValue; | ||
123 | + while (keyValue = [keysList nextObject]) | ||
124 | + { | ||
125 | + NSLog(@"i found %@",keyValue); | ||
126 | + NSString* appleAmount = [[productList objectForKey:keyValue] objectForKey:@"amount"]; | ||
127 | + NSLog(@"appleAmount:%@ amount:%@",appleAmount,amount); | ||
128 | + if(appleAmount.intValue == amount.intValue){ | ||
129 | + return keyValue; | ||
130 | + } | ||
131 | + } | ||
132 | + } | ||
133 | + } | ||
134 | + return @"unknow"; | ||
135 | +} | ||
136 | + | ||
137 | +- (void)receiveCreateOrder:(NSNotification *)notification | ||
138 | +{ | ||
139 | + NSLog(@"创建订单成功"); | ||
140 | + PoolPayInfo *payInfo = [notification object]; | ||
141 | + | ||
142 | + NSString *productId = [self getProductIdByAmount:[payInfo products] amount:[payInfo postAmount]]; | ||
143 | + | ||
144 | + NSDictionary *params = @{ | ||
145 | + @"cp_order_id":[payInfo queryId], | ||
146 | + @"roleid":[payInfo playerId], | ||
147 | + @"rolename":[payInfo playerName], | ||
148 | + @"serverid":[payInfo serverId], | ||
149 | + @"money":[payInfo postAmount], | ||
150 | + @"gold":gold, | ||
151 | + @"productid":productId, | ||
152 | + @"product_name":[payInfo productDesc], | ||
153 | + @"ext":[payInfo queryId], | ||
154 | + @"test":@"0", | ||
155 | + }; | ||
156 | + | ||
157 | + [[WSPlatformManager sharedPlatform] payWithOrderInfo:params]; | ||
158 | +} | ||
159 | + | ||
160 | + | ||
161 | +/** | ||
162 | + * @brief 成功 | ||
163 | + */ | ||
164 | +- (void)WSPlatformDidSuccess:(CBType)type | ||
165 | +{ | ||
166 | + //检查是否有用户存在 | ||
167 | + if (type != 20) { | ||
168 | + if ([[WSPlatformManager sharedPlatform] isUserExists]) { | ||
169 | + [self loginCheck]; | ||
170 | + } | ||
171 | + } | ||
172 | +} | ||
173 | + | ||
174 | +/** | ||
175 | + * 购买成功 | ||
176 | + */ | ||
177 | +- (void)WSPlatformPaySuccess:(NSInteger)Type | ||
178 | +{ | ||
179 | + NSLog(@"WSPlatformPaySuccess:%ld",(long)Type); | ||
180 | +} | ||
181 | + | ||
182 | +/** | ||
183 | + * 购买失败 | ||
184 | + */ | ||
185 | +- (void)WSPlatformPayFailure:(NSString *)errorMsg | ||
186 | +{ | ||
187 | + NSLog(@"WSPlatformPayFailure:%@",errorMsg); | ||
188 | +} | ||
189 | + | ||
190 | +-(NSString*)getCurrentTimestamp{ | ||
191 | + // 时间戳转时间 | ||
192 | + NSTimeInterval interval = [[NSDate date] timeIntervalSince1970] * 1000; | ||
193 | + NSString* timeStr = [[NSString alloc]initWithFormat:@"%.f",interval]; | ||
194 | + return timeStr; | ||
195 | +} | ||
196 | + | ||
197 | +@end | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | + | ||
2 | +#import <Foundation/Foundation.h> | ||
3 | + | ||
4 | +//回调类型 | ||
5 | +#define CBType NSUInteger | ||
6 | + | ||
7 | +typedef void (^TapCompletionBlock)(NSInteger index); | ||
8 | + | ||
9 | +//回调的类型值 | ||
10 | +typedef NS_ENUM(NSUInteger, CallbackType) { | ||
11 | + telRegDidSuccess = 1, // 手机注册成功 | ||
12 | + loginDidSuccess = 2, // 登录成功 | ||
13 | + registerDidSuccess = 3, // 注册成功 | ||
14 | + bindAccountDidSuccess = 4, // 绑定账号成功 | ||
15 | + bindTelephoneDidSuccess = 5, // 绑定手机成功 | ||
16 | + tmpLoginDidSuccess = 6, // 临时账号登录成功 | ||
17 | + dufultRegDidFailure = 7, // 临时账号注册失败 | ||
18 | + switchAccout = 8, // 切换账号 | ||
19 | + telResetPwdDidSuccess = 9, // 手机重置密码成功 | ||
20 | + modifyPwdDidSuccess = 10, // 修改密码成功 | ||
21 | + | ||
22 | +}; | ||
23 | + | ||
24 | +@protocol WSPlatformDelegate, WSPlatformPayDelegate; | ||
25 | +@interface WSPlatformManager : NSObject { | ||
26 | +@private | ||
27 | + NSString *_aid; | ||
28 | + NSString *_site; | ||
29 | + NSString *_key; | ||
30 | + NSString *_sid; | ||
31 | + NSString *_sdkVersion; | ||
32 | +} | ||
33 | +@property (nonatomic, weak) id <WSPlatformDelegate> delegate; | ||
34 | +@property (nonatomic, weak) id <WSPlatformPayDelegate> paydelegate; | ||
35 | +//区服 | ||
36 | +@property (nonatomic, copy) NSString *sid; | ||
37 | +//SDK版本号 | ||
38 | +@property (nonatomic, readonly) NSString *sdkVersion; | ||
39 | +//广告id | ||
40 | +@property (nonatomic, copy, readonly) NSString *aid; | ||
41 | +//商家对应标识 | ||
42 | +@property (nonatomic, copy, readonly) NSString *site; | ||
43 | +//密钥 | ||
44 | +@property (nonatomic, copy, readonly) NSString *key; | ||
45 | +//归属id | ||
46 | +@property (nonatomic, copy, readonly) NSString *cid; | ||
47 | + | ||
48 | +// 点击按钮Block | ||
49 | +@property (nonatomic, copy) TapCompletionBlock tapBlock; | ||
50 | + | ||
51 | +/** | ||
52 | + * @brief: 平台实例 | ||
53 | + */ | ||
54 | ++ (WSPlatformManager *)sharedPlatform; | ||
55 | + | ||
56 | + | ||
57 | +/** | ||
58 | + * @brief: 登录 | ||
59 | + */ | ||
60 | +- (void)onLogin; | ||
61 | + | ||
62 | +/** | ||
63 | + * @brief: 切换账号 | ||
64 | + */ | ||
65 | +- (void)switchAccount; | ||
66 | + | ||
67 | +/** | ||
68 | + * @brief: 是否有用户存在 | ||
69 | + */ | ||
70 | +- (BOOL)isUserExists; | ||
71 | + | ||
72 | +/** | ||
73 | + * @brief: 是否有用户存在 | ||
74 | + */ | ||
75 | +- (BOOL)isTempAccout; | ||
76 | + | ||
77 | +/** | ||
78 | + * SDK参数设置 | ||
79 | + * @param site -> 商家对应标识 | ||
80 | + * @param key -> 密钥 | ||
81 | + * @param aid -> 广告id | ||
82 | + */ | ||
83 | +- (void)startWithSite:(NSString *)site key:(NSString *)key aid:(NSString *)aid cid:(NSString *)cid; | ||
84 | + | ||
85 | +// 下订单 zhi fu | ||
86 | +- (void)payWithOrderInfo:(NSDictionary *)orderInfo; | ||
87 | + | ||
88 | +// 登陆成功 上传用户信息 | ||
89 | +- (void)gameLoginSuccessUserInfo:(NSDictionary *)userInfo; | ||
90 | + | ||
91 | +// 定时展示功能 | ||
92 | +- (void)showTheRollingView; | ||
93 | + | ||
94 | +// 临时账号登录(没有登陆界面) | ||
95 | +- (void)tempUserLogin; | ||
96 | + | ||
97 | +@end | ||
98 | + | ||
99 | +@protocol WSPlatformDelegate <NSObject> | ||
100 | + | ||
101 | +@optional | ||
102 | +/** | ||
103 | + * @brief 成功 | ||
104 | + */ | ||
105 | +- (void)WSPlatformDidSuccess:(CBType)type; | ||
106 | + | ||
107 | +@end | ||
108 | + | ||
109 | +@protocol WSPlatformPayDelegate <NSObject> | ||
110 | + | ||
111 | +/** | ||
112 | + * 购买成功 | ||
113 | + */ | ||
114 | +- (void)WSPlatformPaySuccess:(NSInteger)Type; | ||
115 | + | ||
116 | +/** | ||
117 | + * 购买失败 | ||
118 | + */ | ||
119 | +- (void)WSPlatformPayFailure:(NSString *)errorMsg; | ||
120 | + | ||
121 | +/** | ||
122 | + * 支 付过程中关闭支 付页面 | ||
123 | + */ | ||
124 | +@optional | ||
125 | +- (void)WSPlatformPayViewClose; | ||
126 | + | ||
127 | + | ||
128 | + | ||
129 | +@end |
1 | + | ||
2 | +#import <Foundation/Foundation.h> | ||
3 | + | ||
4 | +@interface WSUserParser : NSObject | ||
5 | + | ||
6 | +/** | ||
7 | + * @ 获取用户uid | ||
8 | + */ | ||
9 | ++ (NSString *)parseUid; | ||
10 | + | ||
11 | +/** | ||
12 | + * @ 获取用户account | ||
13 | + */ | ||
14 | ++ (NSString *)parseAccount; | ||
15 | + | ||
16 | +/** | ||
17 | + * @ 获取用户sessionId | ||
18 | + */ | ||
19 | ++ (NSString *)parseSessionId; | ||
20 | + | ||
21 | +/** | ||
22 | + * @ 判断当前账户是否为临时账户 | ||
23 | + * @ 1为临时账户 | ||
24 | + * @ 0为正式注册账户 | ||
25 | + */ | ||
26 | ++ (BOOL)parseTempAccount; | ||
27 | + | ||
28 | +@end | ||
29 | + |

1.23 KB

1.46 KB

1.14 KB

1.46 KB

1.09 KB

1.22 KB

257 Bytes

416 Bytes

545 Bytes

979 Bytes

1.53 KB

2.13 KB

1.37 KB

1.77 KB
1 | + 为保障您的权益,请详细阅读本服务条款所有内容。并同意遵守以下所有服务条款之会员规范。 | ||
2 | + | ||
3 | +1.(认知与接受条款) | ||
4 | + 当您注册成为本网站会员后,即可使用我们公司所提供之各项会员服务(以下简称本服务),且表示您已阅读、了解并同意接受本服务条款之所有内容。当会员使用本服务时,即表示除了同意遵守本服务条款外,还同意接受我们公司对本网站会员之规范(包括游戏规则、客服中心内容、公告事项 各别服务之规范等)并遵守相关法律规定。 | ||
5 | + 若您未满二十岁,除应符合上述规定外,并应于您的家长(法定代理人或监护人)阅读、了解并同意本服务条款之所有内容及其后修改变更后,方得使用或继续使用本服务。 | ||
6 | + | ||
7 | +2.(会员服务条款之增订及修改) | ||
8 | + 我们公司保留增订及修改本会员条款之权利,本条款如有增订或修改时,我们公司将于网站首页公告修改之事实,对会员不 另作个别通知。如您不同意修改的内容,请勿继续使用本服务,如果您于公告后继续使用本服务,则视为您已接受并同意该修订条款。 | ||
9 | + | ||
10 | +3.(服务介绍) | ||
11 | + 本网站所提供的包含游戏、休闲、社群等各项服务,陆续提供更多其他网络服务供会员使用。接受本服务之会员必须自行配备上网所需之各项计算机设备,以及负担「因特网连接费用」、「电话费用」等电信相关费用。 | ||
12 | + | ||
13 | +4.(会员责任与义务) | ||
14 | +a.您同意于注册时登录您本人正确、完整且符合真实之个人资料。您所登录之数据若事后有所变更时,应随时于在线更新。当所登录的个人资料,或原登录之数据已不符合真实而未更新,或有任何误导之嫌,我们公司将保留随时终止您会员资格及使用本服务之权利。 | ||
15 | +b.1.会员不得利用本服务进行任何商业行为。 | ||
16 | +b.2.除了遵守本服务条款外,您同意遵守因特网国际使用惯例与礼节之相关规定。 | ||
17 | +b.3.会员不得利用本服务传送、发表涉及辱骂、毁谤、不雅、淫秽、攻击性之文章或图片。 | ||
18 | +b.4.会员同意必须充分尊重知识产权,禁止发表侵害他人各项知识产权或其他权利之文字、图片或任何形式之档案。 | ||
19 | +c.1.您了解当您成为本网站会员后,开始使用本服务,其所有权仍属我们公司所有及其所约定之人所有,会员仅得依本服务条款之约定使用,不得出租、出借、移转或让与给其他之三人使用。 | ||
20 | +c.2.会员有义务妥善保管本网站账号、密码及其他相关之会员数据,并为此组账号登录系统后所进行之一切活动、行为责负。 | ||
21 | +c.3.若会员发现账号或密码遭人非法使用或有任何异常破坏使用安全之情形时,应立即通知我们公司。但若是因您的保管疏忽,而导致账号、密码遭他人非法使用时,我们公司将不负责处理。 | ||
22 | + | ||
23 | +5.(会员充值责任限制) | ||
24 | + 本网站会员使用本服务付费项目时所使用之充值点数,您了解当点数充值入本网站或是转入本服务付费项目后,无法取消、更改、退费或转入其他本网站里。若您使用虚伪不正之方式进行「充值」,我们公司保留随时终止您会员资格及使用本服务之权利,并将追究相关法律责任。 | ||
25 | + | ||
26 | +6.(服务之终止与变更) | ||
27 | + 会员若有下列任一情形时,我们公司有权随时终止或变更任一会员账号之服务,且无需事先通知会员。就终止或更改会员使用本服务所可能产生之困扰、不便或损害,本服务对任何会员或第三人均不负任何责任。 | ||
28 | +1.会员登录不实数据进行注册。 | ||
29 | +2.使用中文、英文及数字以外之字符及不雅文字作为本服务之名称。 | ||
30 | +3.冒用他人名义申请本服务之账号。 | ||
31 | +4.使用虚伪不正当之方式进行充值。 | ||
32 | +5.违反本服务条款时。 | ||
33 | +6.违反公共安全、公共秩序与善良风俗之行为时。 | ||
34 | +7.违反现行法律之行为时。 | ||
35 | + | ||
36 | +7.(服务暂停或中断) | ||
37 | + 于下列情形任一情形发生时,我们公司有权暂停或中断本服务之全部或一部,对因此而产生之困扰、不便或损害,本服务对任何会员或第三人均不负任何责任。 | ||
38 | +1.对本服务之相关软硬件设备与电子通信设备进行维修保养及施工时。 | ||
39 | +2.发生突发性之软硬件设备与电子通信设备故障时。 | ||
40 | +3.因天灾等不可抗力之因素致使本服务无法提供服务时。 | ||
41 | +4.在紧急情况下为维护其他会员或第三人的人身、数据之完整安全。如因使用者违反法令或本服务条款或因不可归责于我们公司之事由而造成本服务之全部或一部暂停或中断时,暂停或中断期间之费用仍依正常标准计费。 | ||
42 | + | ||
43 | +8.(服务变更权利) | ||
44 | + 我们公司将保留新增、修改或删除本服务之全部或一部之权利,且不另行个别通知,会员不得因此而要求任何补偿或赔偿。 | ||
45 | + | ||
46 | +9.(责任范围) | ||
47 | + 本服务依我们公司既有之规划提供对于特定使用者之特殊需求,我们公司不担保本服务将完全符合您的需求。 | ||
48 | + 本服务可能因自身、其他第三方或相关电信业者网络系统软硬件设备之故障或失灵;或人为操作上之疏失而造成中断、暂时无法使用、迟延、数据传输或储存上之错误;或遭第三人侵入系统篡改或伪造变造数据等。我们公司就以上情形不保证各项服务之稳定、安全、无误、及不中断。会员需明白使用本服务 之所有风险及可能致生之任何损害,不得因此而要求任何补偿或赔偿。 | ||
49 | + | ||
50 | +10.(会员数据处理与隐私权保护) | ||
51 | + 对于会员所登录或留存之个人资料,您同意我们公司得于合理之范围内保存、搜集、处理、传递及使用会员个人资料或其衍生之相关电磁录,以提供会员其他信息服务,或作成会员统计数据、进行关于网络行为之调查或研究或为任何之合法使用。 | ||
52 | + 对于会员所登录或留存之个人资料,我们公司在未获会员同意之前,不对外揭露会员之姓名、地址、电子邮件地址及其他依法受保护之个人资料,但下列情况不在此限: | ||
53 | +1.受司法、警察或其他有权机关基于法定程序之要求时。 | ||
54 | +2.于维护公益或保护我们公司或他人权益时。 | ||
55 | +3.因会员之行为违反法令或本服务条款之规定时。 | ||
56 | +4.在紧急情况下为维护其他会员或第三人之人身、交易内容、游戏历程、个人资料之完整安全时。 | ||
57 | + | ||
58 | +11.(知识产权) | ||
59 | + 此网站上之所有著作及数据,其著作权、专利权、商标、营业秘密、其他知识产权,所有权或其他权利,均为我们公司或其权利人所有,除事先 经我们公司或其各别权利人之合法授权外,会员不得擅自以重制、传输、改作、编辑或以其他任何形式、基于任何目的加以使用,违者应自行负 所有相关法律责任。 | ||
60 | + | ||
61 | +12.(个别条款之效力) | ||
62 | + 本同意书所定之任何会员条款之全部或部分无效时,不影响其他条款之效力。 | ||
63 | + | ||
64 | +13.(准据法) | ||
65 | + 本服务条款之解释及适用,以及会员因使用本服务而与我们公司间所生之权利义务关系,应依中国法律解释适用之(不含涉外民事法律适用法或其他类似法规)。 | ||
66 | + | ||
67 | +14.(管辖法院) | ||
68 | + 因本服务条款而生之争议,均同意以我们公司所在地的人民法院为第一审管辖法院。 | ||
... | \ No newline at end of file | ... | \ No newline at end of file |

880 Bytes

203 Bytes

322 Bytes

3.36 KB

2.04 KB

3.15 KB
1 | +{"gameId": "244ae3383d979a761ad2795b8c6dae43", | ||
2 | +"payorderurl": "http://183.136.223.85:9020/paycheck/create", | ||
3 | +"usertype": 215, | ||
4 | +"sdkSimpleName": "play800_ios", "screenOrientation": "2", | ||
5 | +"gamechannelid": "", "custom": "{}", | ||
6 | +"sdkVersionCode": "V4_0_0", "channel_id": "qyj01", | ||
7 | +"loginCheckUrl": "http://183.136.223.85:9010/logincheck/check", | ||
8 | +"appScheme": "com.hubing.qyj01", "c2": "", "c1": "", | ||
9 | +"client_secret": "39cbc57210de3b1762c4bbf87908fe23", | ||
10 | +"paycheckurl": "http://183.136.223.85:9020/paycheck/confirm", | ||
11 | + | ||
12 | +"site":"mhtx_ios", | ||
13 | +"key":"b7af49fb44dfcd8be9e4e5553c580093", | ||
14 | +"aid":"91007715568111428", | ||
15 | +"cid":"1", | ||
16 | + | ||
17 | +"gameSimpleName": "fytx_test"} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>CFBundleDevelopmentRegion</key> | ||
6 | + <string>en</string> | ||
7 | + <key>CFBundleExecutable</key> | ||
8 | + <string>$(EXECUTABLE_NAME)</string> | ||
9 | + <key>CFBundleIdentifier</key> | ||
10 | + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||
11 | + <key>CFBundleInfoDictionaryVersion</key> | ||
12 | + <string>6.0</string> | ||
13 | + <key>CFBundleName</key> | ||
14 | + <string>$(PRODUCT_NAME)</string> | ||
15 | + <key>CFBundlePackageType</key> | ||
16 | + <string>APPL</string> | ||
17 | + <key>CFBundleShortVersionString</key> | ||
18 | + <string>1.0</string> | ||
19 | + <key>CFBundleSignature</key> | ||
20 | + <string>????</string> | ||
21 | + <key>CFBundleURLTypes</key> | ||
22 | + <array> | ||
23 | + <dict> | ||
24 | + <key>CFBundleTypeRole</key> | ||
25 | + <string>Editor</string> | ||
26 | + <key>CFBundleURLSchemes</key> | ||
27 | + <array> | ||
28 | + <string>com.youai.sdk</string> | ||
29 | + </array> | ||
30 | + </dict> | ||
31 | + </array> | ||
32 | + <key>CFBundleVersion</key> | ||
33 | + <string>1</string> | ||
34 | + <key>LSRequiresIPhoneOS</key> | ||
35 | + <true/> | ||
36 | + <key>NSAppTransportSecurity</key> | ||
37 | + <dict> | ||
38 | + <key>NSAllowsArbitraryLoads</key> | ||
39 | + <true/> | ||
40 | + </dict> | ||
41 | + <key>UILaunchStoryboardName</key> | ||
42 | + <string>LaunchScreen</string> | ||
43 | + <key>UIMainStoryboardFile</key> | ||
44 | + <string>Main</string> | ||
45 | + <key>UIRequiredDeviceCapabilities</key> | ||
46 | + <array> | ||
47 | + <string>armv7</string> | ||
48 | + </array> | ||
49 | + <key>UISupportedInterfaceOrientations</key> | ||
50 | + <array> | ||
51 | + <string>UIInterfaceOrientationLandscapeLeft</string> | ||
52 | + <string>UIInterfaceOrientationLandscapeRight</string> | ||
53 | + </array> | ||
54 | +</dict> | ||
55 | +</plist> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>NSAppTransportSecurity</key> | ||
6 | + <dict> | ||
7 | + <key>NSAllowsArbitraryLoads</key> | ||
8 | + <true/> | ||
9 | + </dict> | ||
10 | +</dict> | ||
11 | +</plist> |
1 | +// | ||
2 | +// AppleIap.h | ||
3 | +// Demo_youdian | ||
4 | +// | ||
5 | +// Created by 许 on 17/6/20. | ||
6 | +// Copyright © 2017年 winFan. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | + | ||
11 | +@interface AppleIap : NSObject | ||
12 | + | ||
13 | + | ||
14 | +-(void)applePay:(NSString*)products amount:(NSString*)amount queryId:(NSString*)queryId; | ||
15 | + | ||
16 | +@end |
1 | +// | ||
2 | +// AppleIap.m | ||
3 | +// Demo_youdian | ||
4 | +// | ||
5 | +// Created by 许 on 17/6/20. | ||
6 | +// Copyright © 2017年 winFan. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import "AppleIap.h" | ||
10 | + | ||
11 | +#import "IAPShare.h" | ||
12 | +#import <PoolSdk/PoolSdk2.h> | ||
13 | + | ||
14 | +@implementation AppleIap | ||
15 | + | ||
16 | +/** | ||
17 | + @return 商品ID | ||
18 | + */ | ||
19 | +- (NSString*)getProductIdByAmount:(NSString*)products amount:(NSString*)amount | ||
20 | +{ | ||
21 | + NSData* jsonData = [NSJSONSerialization dataWithJSONObject:products options:NSJSONWritingPrettyPrinted error:nil]; | ||
22 | + if(jsonData){ | ||
23 | + NSDictionary* productList = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil]; | ||
24 | + if(productList){ | ||
25 | + NSEnumerator* keysList = [productList keyEnumerator]; | ||
26 | + id keyValue; | ||
27 | + while (keyValue = [keysList nextObject]) | ||
28 | + { | ||
29 | + NSString* appleAmount = [[productList objectForKey:keyValue] objectForKey:@"amount"]; | ||
30 | + if(appleAmount.intValue == amount.intValue){ | ||
31 | + NSLog(@"appleAmount:%@ amount:%@",appleAmount,amount); | ||
32 | + return keyValue; | ||
33 | + } | ||
34 | + } | ||
35 | + } | ||
36 | + } | ||
37 | + NSLog(@"amount get productId error amount:%@",amount); | ||
38 | + return nil; | ||
39 | +} | ||
40 | + | ||
41 | + | ||
42 | +-(void)applePay:(NSString *)products amount:(NSString *)amount queryId:(NSString *)queryId | ||
43 | +{ | ||
44 | + //内购ID | ||
45 | + NSString* productId = [self getProductIdByAmount:products amount:amount]; | ||
46 | + if(productId){ | ||
47 | + [self ipaPay:productId queryId:queryId]; | ||
48 | + }else{ | ||
49 | + NSLog(@"get apple product id error"); | ||
50 | + } | ||
51 | +} | ||
52 | + | ||
53 | +/** | ||
54 | + 苹果支付结果回调 | ||
55 | + */ | ||
56 | + | ||
57 | +- (void)applePayCallBack:(NSString*)receiptStr queryId:(NSString*)queryId | ||
58 | +{ | ||
59 | + //NSDictionary* payResultDic = notification.object; | ||
60 | + //NSString* receiptStr = [payResultDic objectForKey:@"payResult"]; | ||
61 | + //NSString* queryId = [payResultDic objectForKey:@"query_id"]; | ||
62 | + NSLog(@"applePayCallBack"); | ||
63 | + NSDictionary* receiptDic = [NSDictionary dictionaryWithObjectsAndKeys:receiptStr,@"receipt",queryId,@"query_id", nil]; | ||
64 | + NSString* result = [[NetCenter getInstance] httpPostSyn:[PoolUtils createPayUrl] :receiptDic]; | ||
65 | + | ||
66 | + if([@"success" isEqualToString:result]){//确认订单成功 | ||
67 | + }else{//失败 | ||
68 | + NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; | ||
69 | + NSMutableArray* queryIdArray = [userDefaults objectForKey:@"queryIds"]; | ||
70 | + | ||
71 | + NSMutableArray* tempQueryIdArray = [[NSMutableArray alloc] initWithCapacity:10]; | ||
72 | + | ||
73 | + if (queryIdArray) { | ||
74 | + }else{ | ||
75 | + queryIdArray = [[NSMutableArray alloc]initWithCapacity:10]; | ||
76 | + } | ||
77 | + | ||
78 | + for (NSString* arrayQueryId in queryIdArray) { | ||
79 | + [tempQueryIdArray addObject:arrayQueryId]; | ||
80 | + } | ||
81 | + | ||
82 | + [tempQueryIdArray addObject:queryId]; | ||
83 | + [userDefaults setObject:tempQueryIdArray forKey:@"queryIds"]; | ||
84 | + [userDefaults setObject:receiptStr forKey:queryId]; | ||
85 | + [userDefaults synchronize]; | ||
86 | + } | ||
87 | +} | ||
88 | + | ||
89 | + | ||
90 | + | ||
91 | +- (void)initIpa:(NSString*)productId{ | ||
92 | + if(![IAPShare sharedHelper].iap){ | ||
93 | + NSLog(@"iap init"); | ||
94 | + } | ||
95 | + | ||
96 | + NSSet* dataSet = [[NSSet alloc]initWithObjects:productId, nil]; | ||
97 | + [IAPShare sharedHelper].iap = [[IAPHelper alloc] initWithProductIdentifiers:dataSet]; | ||
98 | +} | ||
99 | + | ||
100 | + | ||
101 | +- (void)ipaPay:(NSString*) productId queryId:(NSString*)queryId{ | ||
102 | + @synchronized([PoolSdk shareSDK]) { | ||
103 | + if([PoolSdk shareSDK].isApplePaying) { | ||
104 | + NSLog(@"apple paying"); | ||
105 | + return; | ||
106 | + }; | ||
107 | + [PoolSdk shareSDK].isApplePaying = true; | ||
108 | + } | ||
109 | + NSLog(@"productId:%@",productId); | ||
110 | + [self initIpa:productId]; | ||
111 | + [[IAPShare sharedHelper].iap requestProductsWithCompletion:^(SKProductsRequest* request,SKProductsResponse* response) | ||
112 | + { | ||
113 | + NSLog(@"response"); | ||
114 | + if(response && response > 0 ) { | ||
115 | + NSLog(@"response %lu",(unsigned long)[[IAPShare sharedHelper].iap.products count]); | ||
116 | + if([[IAPShare sharedHelper].iap.products count] > 0){ | ||
117 | + NSLog(@"product count 1"); | ||
118 | + SKProduct* product =[[IAPShare sharedHelper].iap.products objectAtIndex:0]; | ||
119 | + NSString* queryIdStr = queryId; | ||
120 | + [[IAPShare sharedHelper].iap buyProduct:product | ||
121 | + onCompletion:^(SKPaymentTransaction* trans){ | ||
122 | + [PoolSdk shareSDK].isApplePaying = false; | ||
123 | + NSLog(@"buy product callback"); | ||
124 | + | ||
125 | + if(trans.error) | ||
126 | + { | ||
127 | + NSLog(@"Fail %@",[trans.error localizedDescription]); | ||
128 | + } | ||
129 | + else if(trans.transactionState == SKPaymentTransactionStatePurchased) { | ||
130 | + | ||
131 | + NSData* receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]]; | ||
132 | + | ||
133 | + NSString* receiptStr = [receiptData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; | ||
134 | + | ||
135 | + receiptStr = [receiptStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; | ||
136 | + | ||
137 | + [self applePayCallBack:receiptStr queryId:queryIdStr]; | ||
138 | + } | ||
139 | + else if(trans.transactionState == SKPaymentTransactionStateFailed) { | ||
140 | + NSLog(@"Fail"); | ||
141 | + } | ||
142 | + }]; | ||
143 | + }else{ | ||
144 | + [PoolSdk shareSDK].isApplePaying = false; | ||
145 | + } | ||
146 | + }else{ | ||
147 | + [PoolSdk shareSDK].isApplePaying = false; | ||
148 | + } | ||
149 | + }]; | ||
150 | +} | ||
151 | + | ||
152 | +@end |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>CFBundleExecutable</key> | ||
6 | + <string>$(EXECUTABLE_NAME)</string> | ||
7 | + <key>CFBundleIdentifier</key> | ||
8 | + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||
9 | + <key>CFBundleInfoDictionaryVersion</key> | ||
10 | + <string>6.0</string> | ||
11 | + <key>CFBundleName</key> | ||
12 | + <string>$(PRODUCT_NAME)</string> | ||
13 | + <key>CFBundlePackageType</key> | ||
14 | + <string>APPL</string> | ||
15 | + <key>CFBundleShortVersionString</key> | ||
16 | + <string>1.0</string> | ||
17 | + <key>CFBundleSignature</key> | ||
18 | + <string>????</string> | ||
19 | + <key>CFBundleVersion</key> | ||
20 | + <string>1</string> | ||
21 | + <key>LSApplicationQueriesSchemes</key> | ||
22 | + <array> | ||
23 | + <string>weixin</string> | ||
24 | + <string>alipay</string> | ||
25 | + </array> | ||
26 | + <key>LSRequiresIPhoneOS</key> | ||
27 | + <true/> | ||
28 | + <key>NSAppTransportSecurity</key> | ||
29 | + <dict> | ||
30 | + <key>NSAllowsArbitraryLoads</key> | ||
31 | + <true/> | ||
32 | + </dict> | ||
33 | + <key>UILaunchStoryboardName</key> | ||
34 | + <string>LaunchScreen</string> | ||
35 | + <key>UIMainStoryboardFile</key> | ||
36 | + <string>Main</string> | ||
37 | + <key>UIRequiredDeviceCapabilities</key> | ||
38 | + <array> | ||
39 | + <string>armv7</string> | ||
40 | + </array> | ||
41 | + <key>UISupportedInterfaceOrientations</key> | ||
42 | + <array> | ||
43 | + <string>UIInterfaceOrientationLandscapeLeft</string> | ||
44 | + <string>UIInterfaceOrientationLandscapeRight</string> | ||
45 | + </array> | ||
46 | +</dict> | ||
47 | +</plist> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>keychain-access-groups</key> | ||
6 | + <array> | ||
7 | + <string>323G75TBBT.com.pfd.jiankefy</string> | ||
8 | + </array> | ||
9 | +</dict> | ||
10 | +</plist> |

4.55 KB

4.9 KB

5.36 KB

822 Bytes

10.6 KB

348 Bytes

348 Bytes

3.45 KB

3.52 KB

3.61 KB

3.27 KB

3.35 KB

2.3 KB

2.42 KB

3.45 KB

16 KB

2.97 KB

4.68 KB

4.77 KB

1.44 KB

1.44 KB

918 Bytes

1003 Bytes

1.12 KB

1.18 KB

1.17 KB

1.08 KB

1.12 KB

4.34 KB

4.45 KB

4.09 KB

3.12 KB

3.12 KB

3.92 KB

3.91 KB

2.73 KB

3.05 KB

3.11 KB

3.84 KB

3.97 KB

1.43 KB

1.43 KB

10.4 KB

894 Bytes

1.01 KB

1.11 KB

1.12 KB

4.01 KB

4.07 KB

3.04 KB

3.5 KB

3.49 KB

3.25 KB

3.25 KB

323 Bytes

5.02 KB

5.02 KB

3.75 KB

3.71 KB

1.96 KB

1.9 KB

2.3 KB

2.23 KB

1.41 KB

1.42 KB

4.09 KB

4 KB

2.71 KB

3.24 KB

3.24 KB

19 KB
1 | +Versions/Current/Headers | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +Versions/Current/QYGameSDK | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +// | ||
2 | +// GZQYAmountCollectionViewCell.h | ||
3 | +// GameSDK | ||
4 | +// | ||
5 | +// Created by qianyou on 16/1/7. | ||
6 | +// Copyright © 2016年 qianyou. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <UIKit/UIKit.h> | ||
10 | + | ||
11 | +@interface GZQYAmountCollectionViewCell : UICollectionViewCell | ||
12 | + | ||
13 | +@property (weak, nonatomic) IBOutlet UIImageView *cellBGImageView; | ||
14 | + | ||
15 | + | ||
16 | +@property (weak, nonatomic) IBOutlet UILabel *cellAmountLabel; | ||
17 | + | ||
18 | +@end |
1 | +// | ||
2 | +// GZQYNetworkOperator.h | ||
3 | +// GameSDK | ||
4 | +// | ||
5 | +// Created by qianyou on 15/8/20. | ||
6 | +// Copyright (c) 2015年 qianyou. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | +#import "GZQYTypedef.h" | ||
11 | + | ||
12 | +@interface GZQYNetworkOperator : NSObject | ||
13 | + | ||
14 | ++(instancetype)defaultOperator; | ||
15 | + | ||
16 | +-(void)postWithData:(NSMutableDictionary *)data | ||
17 | + module:(NSString *)module | ||
18 | + action:(NSString *)action | ||
19 | + completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler; | ||
20 | + | ||
21 | +-(void)getWithURL:(NSString *)head data:(NSMutableDictionary *)data callback:(NewNetWorkBlock)callback; | ||
22 | + | ||
23 | +@end |
1 | +// | ||
2 | +// GZQYSDKManager.h | ||
3 | +// GameSDK | ||
4 | +// | ||
5 | +// Created by qianyou on 15/9/11. | ||
6 | +// Copyright (c) 2015年 qianyou. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | +#import "GZQYUserInfo.h" | ||
11 | +#import "GZQYTypeDef.h" | ||
12 | +#import <UIKit/UIKit.h> | ||
13 | + | ||
14 | + | ||
15 | +@interface GZQYSDKManager : NSObject <UIAlertViewDelegate> | ||
16 | + | ||
17 | +//-(void)showLoginViewWithCode:(int)resquestCode callback:(Callback)callback; | ||
18 | + | ||
19 | ++(instancetype)defaultManager; | ||
20 | + | ||
21 | +-(void)initSDK; | ||
22 | + | ||
23 | +-(void)showLoginViewWithSuperView:(UIView *)view; | ||
24 | + | ||
25 | +-(void)showPaymentViewWithAmount:(NSInteger) amount info:(NSString *)info; | ||
26 | + | ||
27 | +-(void)showFloatView:(UIView *)view; | ||
28 | + | ||
29 | +-(void)setServerWithServerid:(NSString *)serverid servername:(NSString *)servername; | ||
30 | + | ||
31 | +-(void)setRoleWithID:(NSString *)roleid name:(NSString *)name; | ||
32 | + | ||
33 | +-(void)setRank:(NSString *)rank; | ||
34 | + | ||
35 | +-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url; | ||
36 | + | ||
37 | +-(BOOL)handleApplication :(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation; | ||
38 | + | ||
39 | +@end |
1 | +// | ||
2 | +// GZQYTypeDef.h | ||
3 | +// GameSDK | ||
4 | +// | ||
5 | +// Created by qianyou on 15/9/7. | ||
6 | +// Copyright (c) 2015年 qianyou. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | +#import "Order.h" | ||
11 | + | ||
12 | +static const int RESPONSE_ERROR = 100; | ||
13 | + | ||
14 | +static const int HTTP_ERROR = 101; | ||
15 | + | ||
16 | +static const int RESPONSE_OK = 200; | ||
17 | + | ||
18 | +static const int OK = 200; | ||
19 | + | ||
20 | +static const int QQ = 0; | ||
21 | + | ||
22 | +static const int QZONE = 1; | ||
23 | + | ||
24 | +static const int RESPONSE_FAIL = 301; | ||
25 | + | ||
26 | +static NSString *const URL_WECHAT_HEADER = @"https://api.weixin.qq.com"; | ||
27 | + | ||
28 | +static NSString *const URL_WECHAT_ACCESS_TOKEN = @"/sns/oauth2/access_token"; | ||
29 | + | ||
30 | +static NSString *const URL_WECHAT_REFRESH_TOKEN = @"/sns/oauth2/refresh_token"; | ||
31 | + | ||
32 | +static NSString *const URL_WECHAT_AUTH = @"/sns/auth"; | ||
33 | + | ||
34 | +static NSString *const URL_WECHAT_USERINFO = @"/sns/userinfo"; | ||
35 | + | ||
36 | +static NSString * LOGIN_NOTIFICATION = @"login_notification"; | ||
37 | + | ||
38 | +static NSString * PAY_NOTIFICATION = @"pay_notification"; | ||
39 | + | ||
40 | +static NSString * SUCCESS = @"success"; | ||
41 | + | ||
42 | +typedef void(^NetWorkBlock)(NSURLResponse *, NSData *, NSError *); | ||
43 | + | ||
44 | +typedef void(^NewNetWorkBlock)(NSData * _Nullable, NSURLResponse * _Nullable, NSError * _Nullable); | ||
45 | + | ||
46 | +typedef void(^ResponseBlock)(int, NSMutableDictionary *); | ||
47 | + | ||
48 | +typedef void(^LoginBlock)(int, NSMutableDictionary *); | ||
49 | + | ||
50 | +typedef void(^ResponseArrayBlock)(int, NSMutableArray *); | ||
51 | + | ||
52 | +typedef void(^OrderBlock)(Order *); | ||
53 | + | ||
54 | +@interface GZQYTypeDef : NSObject | ||
55 | + | ||
56 | + | ||
57 | + | ||
58 | +//static const int RESPONSE_OK = 200; | ||
59 | + | ||
60 | +@end |
1 | +// | ||
2 | +// User.h | ||
3 | +// GameSDK | ||
4 | +// | ||
5 | +// Created by qianyou on 15/9/11. | ||
6 | +// Copyright (c) 2015年 qianyou. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | + | ||
11 | +@interface GZQYUserInfo : NSObject | ||
12 | + | ||
13 | +@property (strong, nonatomic, readonly) NSString *userName; | ||
14 | + | ||
15 | +@property (strong, nonatomic, readonly) NSString *userId; | ||
16 | + | ||
17 | +@property (strong, nonatomic, readonly) NSString *nickname; | ||
18 | + | ||
19 | +@property (strong, nonatomic, readonly) NSString *sex; | ||
20 | + | ||
21 | +@property (strong, nonatomic, readonly) NSString *logintime; | ||
22 | + | ||
23 | +@property (strong, nonatomic, readonly) NSString *sign; | ||
24 | + | ||
25 | +@property (strong, nonatomic, readonly) NSString *openidChannel; | ||
26 | + | ||
27 | +@property (strong, nonatomic, readonly) NSString *openUID; | ||
28 | + | ||
29 | ++(instancetype)instance; | ||
30 | + | ||
31 | +-(NSMutableDictionary *)dictionaryWithUserInfo; | ||
32 | + | ||
33 | +-(NSMutableDictionary *)dictionaryWithUser; | ||
34 | + | ||
35 | +@end |
1 | +// | ||
2 | +// Order.h | ||
3 | +// MyAlipaySample | ||
4 | +// | ||
5 | +// Created by qianyou on 15/9/6. | ||
6 | +// Copyright (c) 2015年 qianyou. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | + | ||
11 | +@interface Order : NSObject | ||
12 | + | ||
13 | +@property(nonatomic, copy) NSString * partner; | ||
14 | +@property(nonatomic, copy) NSString * seller; | ||
15 | +@property(nonatomic, copy) NSString * tradeNO; | ||
16 | +@property(nonatomic, copy) NSString * productName; | ||
17 | +@property(nonatomic, copy) NSString * productDescription; | ||
18 | +@property(nonatomic, copy) NSString * amount; | ||
19 | +@property(nonatomic, copy) NSString * notifyURL; | ||
20 | + | ||
21 | +@property(nonatomic, copy) NSString * service; | ||
22 | +@property(nonatomic, copy) NSString * paymentType; | ||
23 | +@property(nonatomic, copy) NSString * inputCharset; | ||
24 | +@property(nonatomic, copy) NSString * itBPay; | ||
25 | +@property(nonatomic, copy) NSString * showUrl; | ||
26 | + | ||
27 | + | ||
28 | +@property(nonatomic, copy) NSString * rsaDate;//可选 | ||
29 | +@property(nonatomic, copy) NSString * appID;//可选 | ||
30 | +@property(nonatomic, copy) NSString * extern_token; | ||
31 | +@property(nonatomic, copy) NSString * msg; | ||
32 | + | ||
33 | +//======================微信专用参数=================== | ||
34 | +@property (nonatomic, copy)NSString * appid; | ||
35 | +@property (nonatomic, copy)NSString * noncestr; | ||
36 | +@property (nonatomic, copy)NSString * package; | ||
37 | +@property (nonatomic, copy)NSString * partnerid; | ||
38 | +@property (nonatomic, copy)NSString * prepayid; | ||
39 | +@property (nonatomic, copy)NSString * timestamp; | ||
40 | +@property (nonatomic, copy)NSString * sign; | ||
41 | +//================================================== | ||
42 | + | ||
43 | +@property(nonatomic, readonly) NSString * privateKey; | ||
44 | + | ||
45 | +@property(nonatomic, readonly) NSMutableDictionary * extraParams; | ||
46 | + | ||
47 | +-(instancetype)initWithData:(NSDictionary *)data; | ||
48 | + | ||
49 | + | ||
50 | +@end |
1 | +// | ||
2 | +// WechatAuthSDK.h | ||
3 | +// WechatAuthSDK | ||
4 | +// | ||
5 | +// Created by 李凯 on 13-11-29. | ||
6 | +// Copyright (c) 2013年 Tencent. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | +#import <UIKit/UIKit.h> | ||
11 | + | ||
12 | +enum AuthErrCode { | ||
13 | + WechatAuth_Err_Ok = 0, //Auth成功 | ||
14 | + WechatAuth_Err_NormalErr = -1, //普通错误 | ||
15 | + WechatAuth_Err_NetworkErr = -2, //网络错误 | ||
16 | + WechatAuth_Err_GetQrcodeFailed = -3, //获取二维码失败 | ||
17 | + WechatAuth_Err_Cancel = -4, //用户取消授权 | ||
18 | + WechatAuth_Err_Timeout = -5, //超时 | ||
19 | +}; | ||
20 | + | ||
21 | +@protocol WechatAuthAPIDelegate<NSObject> | ||
22 | +@optional | ||
23 | + | ||
24 | +- (void)onAuthGotQrcode:(UIImage *)image; //得到二维码 | ||
25 | +- (void)onQrcodeScanned; //二维码被扫描 | ||
26 | +- (void)onAuthFinish:(int)errCode AuthCode:(NSString *)authCode; //成功登录 | ||
27 | + | ||
28 | +@end | ||
29 | + | ||
30 | +@interface WechatAuthSDK : NSObject{ | ||
31 | + NSString *_sdkVersion; | ||
32 | + __weak id<WechatAuthAPIDelegate> _delegate; | ||
33 | +} | ||
34 | + | ||
35 | +@property(nonatomic, weak) id<WechatAuthAPIDelegate> delegate; | ||
36 | +@property(nonatomic, readonly) NSString *sdkVersion; //authSDK版本号 | ||
37 | + | ||
38 | +/*! @brief 发送登录请求,等待WechatAuthAPIDelegate回调 | ||
39 | + * | ||
40 | + * @param appId 微信开发者ID | ||
41 | + * @param nonceStr 一个随机的尽量不重复的字符串,用来使得每次的signature不同 | ||
42 | + * @param timeStamp 时间戳 | ||
43 | + * @param scope 应用授权作用域,拥有多个作用域用逗号(,)分隔 | ||
44 | + * @param signature 签名 | ||
45 | + * @param schemeData 会在扫码后拼在scheme后 | ||
46 | + * @return 成功返回YES,失败返回NO | ||
47 | + 注:该实现只保证同时只有一个Auth在运行,Auth未完成或未Stop再次调用Auth接口时会返回NO。 | ||
48 | + */ | ||
49 | + | ||
50 | +- (BOOL)Auth:(NSString *)appId | ||
51 | + nonceStr:(NSString *)nonceStr | ||
52 | + timeStamp:(NSString*)timeStamp | ||
53 | + scope:(NSString *)scope | ||
54 | + signature:(NSString *)signature | ||
55 | + schemeData:(NSString *)schemeData; | ||
56 | + | ||
57 | + | ||
58 | +/*! @brief 暂停登录请求 | ||
59 | + * | ||
60 | + * @return 成功返回YES,失败返回NO。 | ||
61 | + */ | ||
62 | +- (BOOL)StopAuth; | ||
63 | + | ||
64 | +@end |
1 | +A | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +// | ||
2 | +// NewTtack.h | ||
3 | +// NewTtack | ||
4 | +// | ||
5 | +// Created by yun on 16/1/11. | ||
6 | +// Copyright © 2016年 yun. All rights reserved. | ||
7 | +// | ||
8 | +#define TRACK_VERSION @"3.0.4" | ||
9 | + | ||
10 | +#import <Foundation/Foundation.h> | ||
11 | +#import <UIKit/UIKit.h> | ||
12 | + | ||
13 | + | ||
14 | +/* | ||
15 | + 热云移动广告效果监测 平台 api 请选择对应的api进行使用 | ||
16 | + */ | ||
17 | +NS_ASSUME_NONNULL_BEGIN | ||
18 | +@interface ReYunChannel : NSObject | ||
19 | +//开启打印日志 正式上线包请关掉 | ||
20 | ++(void) setPrintLog :(BOOL)print; | ||
21 | +// 开启数据统计 | ||
22 | ++ (void)initWithappKey:(NSString *)appKey withChannelId:(NSString *)channelId; | ||
23 | +//注册成功后调用 | ||
24 | ++ (void)setRegisterWithAccountID:(NSString *)account; | ||
25 | +//登陆成功后调用 | ||
26 | ++ (void)setLoginWithAccountID:(NSString *)account; | ||
27 | +//开始付费时 调用(人民币单位是元) | ||
28 | ++(void)setryzfStart:(NSString *)transactionId ryzfType:(NSString*)ryzfType currentType:(NSString*)currencyType currencyAmount:(float)currencyAmount; | ||
29 | +// 支付完成,付费分析,记录玩家充值的金额(人民币单位是元) | ||
30 | ++(void)setryzf:(NSString *)transactionId ryzfType:(NSString*)ryzfType currentType:(NSString*)currencyType currencyAmount:(float)currencyAmount; | ||
31 | +//自定义事件 | ||
32 | ++(void)setEvent:(NSString *)eventName; | ||
33 | +//获取设备信息 | ||
34 | ++(NSString*)getDeviceId; | ||
35 | + | ||
36 | ++(BOOL)RYApplication:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<NSString *,id> *)options; | ||
37 | +@end | ||
38 | +NS_ASSUME_NONNULL_END |
1 | +// | ||
2 | +// UnionInterface.m | ||
3 | +// PoolSdk | ||
4 | +// | ||
5 | +// Created by winFan on 11/23/15. | ||
6 | +// Copyright (c) 2015 winFan. All rights reserved. | ||
7 | +// | ||
8 | +#include "SDKInterface.h" | ||
9 | +#import <UIKit/UIKit.h> | ||
10 | +#import <QYGameSDK/GZQYSDKManager.h> | ||
11 | +#import "qyUtils.h" | ||
12 | +#import "AppleIap.h" | ||
13 | +#import "ReYunTrack.h" | ||
14 | + | ||
15 | +@implementation SDKInterface : Interface | ||
16 | + | ||
17 | +/** | ||
18 | + 初始化SDK | ||
19 | +*/ | ||
20 | +- (void)SDKinit:(UIViewController *) control | ||
21 | +{ | ||
22 | + //必须继承 | ||
23 | + [super SDKinit:control]; | ||
24 | + | ||
25 | + PoolConfig *config = [PoolConfig getInstance]; | ||
26 | + NSString *reyunAppKey = [config getValueByKey:@"reyunAppKey"]; | ||
27 | + | ||
28 | + [ReYunChannel initWithappKey:reyunAppKey withChannelId:@"_default_"]; | ||
29 | + | ||
30 | + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginResponse:) name:LOGIN_NOTIFICATION object:Nil]; | ||
31 | + | ||
32 | + | ||
33 | +} | ||
34 | + | ||
35 | +/** | ||
36 | + 登录SDK | ||
37 | + */ | ||
38 | +- (void)SDKloginSDK | ||
39 | +{ | ||
40 | + NSLog(@"调用了LoginSDK"); | ||
41 | + [[GZQYSDKManager defaultManager] showLoginViewWithSuperView:self.controller.view]; | ||
42 | +} | ||
43 | + | ||
44 | +-(void)loginResponse:(NSNotification *)notification | ||
45 | +{ | ||
46 | + NSDictionary *userinfo = notification.userInfo; | ||
47 | + //是否登录成功 | ||
48 | + NSString *tag = userinfo[@"tag"]; | ||
49 | + if ([SUCCESS isEqualToString:tag]) { | ||
50 | + GZQYUserInfo *user = userinfo[@"userinfo"]; | ||
51 | + //处理登录成功后逻辑 | ||
52 | + [self loginCheck:user]; | ||
53 | + }else{ | ||
54 | + [[PoolChecker getInstance] sendNotice:PoolSDKNotificationLogin notiName:@"loginFail" | ||
55 | + statusCode:POOLSDK_ERROR_LOGIN_FAILED description:@"loginFail" extendData:nil]; | ||
56 | + } | ||
57 | +} | ||
58 | + | ||
59 | + | ||
60 | +- (NSString*)dictionaryToJson:(NSDictionary *)dic | ||
61 | +{ | ||
62 | + NSError *parseError = nil; | ||
63 | + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&parseError]; | ||
64 | + NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; | ||
65 | + jsonStr = [jsonStr stringByReplacingOccurrencesOfString:@" " withString:@""]; | ||
66 | + jsonStr = [jsonStr stringByReplacingOccurrencesOfString:@"\n" withString:@""]; | ||
67 | + return jsonStr; | ||
68 | +} | ||
69 | + | ||
70 | +/* | ||
71 | + *登录验证请求方法模版 | ||
72 | + */ | ||
73 | +- (void)loginCheck:(GZQYUserInfo *) qyUserInfo | ||
74 | +{ | ||
75 | + PoolLoginInfo *loginInfo = [[PoolLoginInfo alloc]init]; | ||
76 | + loginInfo.openId = [qyUserInfo userId];//渠道userId | ||
77 | + loginInfo.timestamp = [qyUserInfo logintime]; | ||
78 | + loginInfo.sign = [qyUserInfo sign];//渠道SDK的token | ||
79 | + | ||
80 | + NSMutableDictionary *userDic = [[NSMutableDictionary alloc]init]; | ||
81 | + [userDic setObject:[qyUserInfo userId] forKey:@"userid"]; | ||
82 | + [userDic setObject:[qyUserInfo openUID] forKey:@"openuid"]; | ||
83 | + [userDic setObject:[qyUserInfo logintime] forKey:@"logintime"]; | ||
84 | + [userDic setObject:[qyUserInfo nickname] forKey:@"nickname"]; | ||
85 | + [userDic setObject:[qyUserInfo sex] forKey:@"sex"]; | ||
86 | + [userDic setObject:[qyUserInfo sign] forKey:@"sign"]; | ||
87 | + | ||
88 | + NSString *otherJson = [self dictionaryToJson:userDic]; | ||
89 | + otherJson = [otherJson stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]; | ||
90 | + loginInfo.other = otherJson; | ||
91 | + | ||
92 | + dispatch_async(dispatch_get_global_queue(0, 0), ^{ | ||
93 | + [[PoolChecker getInstance]startCheck:loginInfo];//登录验证请求 | ||
94 | + }); | ||
95 | + [[GZQYSDKManager defaultManager] showFloatView:self.controller.view]; | ||
96 | +} | ||
97 | + | ||
98 | + | ||
99 | +- (void)SDKreport:(PoolReportInfo *)reportInfo | ||
100 | +{ | ||
101 | + NSLog(@"reportInfo"); | ||
102 | + if ([REPORT_CREATEROLE isEqualToString:[reportInfo reportType]]) { | ||
103 | + [ReYunChannel setRegisterWithAccountID:[reportInfo playerId]]; | ||
104 | + }else if ([[reportInfo reportType] isEqualToString:REPORT_ENTER]) { | ||
105 | + [[GZQYSDKManager defaultManager] setServerWithServerid:[reportInfo serverId] servername:[reportInfo serverName]]; | ||
106 | + [[GZQYSDKManager defaultManager] setRoleWithID:[reportInfo playerId] name:[reportInfo playerName]]; | ||
107 | + [ReYunChannel setLoginWithAccountID:[reportInfo playerId]]; | ||
108 | + } | ||
109 | +} | ||
110 | + | ||
111 | +/** | ||
112 | + @return 商品名称 | ||
113 | + */ | ||
114 | +- (NSString*)getProductNameByAmount:(NSString*)products amount:(NSString*)amount | ||
115 | +{ | ||
116 | + NSData* jsonData = [NSJSONSerialization dataWithJSONObject:products options:NSJSONWritingPrettyPrinted error:nil]; | ||
117 | + if(jsonData){ | ||
118 | + NSDictionary* productList = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil]; | ||
119 | + if(productList){ | ||
120 | + NSEnumerator* keysList = [productList keyEnumerator]; | ||
121 | + id keyValue; | ||
122 | + while (keyValue = [keysList nextObject]) | ||
123 | + { | ||
124 | + NSString* appleAmount = [[productList objectForKey:keyValue] objectForKey:@"amount"]; | ||
125 | + if(appleAmount.intValue == amount.intValue){ | ||
126 | + NSString* productName = [[productList objectForKey:keyValue] objectForKey:@"name"]; | ||
127 | + return productName; | ||
128 | + } | ||
129 | + } | ||
130 | + } | ||
131 | + } | ||
132 | + NSLog(@"get product name error amount:%@",amount); | ||
133 | + return @"元宝"; | ||
134 | +} | ||
135 | + | ||
136 | +/** | ||
137 | + @return 商品ID | ||
138 | + */ | ||
139 | +- (NSString*)getProductIdByAmount:(NSString*)products amount:(NSString*)amount | ||
140 | +{ | ||
141 | + NSData* jsonData = [NSJSONSerialization dataWithJSONObject:products options:NSJSONWritingPrettyPrinted error:nil]; | ||
142 | + if(jsonData){ | ||
143 | + NSDictionary* productList = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil]; | ||
144 | + if(productList){ | ||
145 | + NSEnumerator* keysList = [productList keyEnumerator]; | ||
146 | + id keyValue; | ||
147 | + while (keyValue = [keysList nextObject]) | ||
148 | + { | ||
149 | + NSLog(@"i found %@",keyValue); | ||
150 | + NSString* appleAmount = [[productList objectForKey:keyValue] objectForKey:@"amount"]; | ||
151 | + NSLog(@"appleAmount:%@ amount:%@",appleAmount,amount); | ||
152 | + if(appleAmount.intValue == amount.intValue){ | ||
153 | + return keyValue; | ||
154 | + } | ||
155 | + } | ||
156 | + } | ||
157 | + } | ||
158 | + return @"unknow"; | ||
159 | +} | ||
160 | + | ||
161 | +- (void)receiveCreateOrder:(NSNotification *)notification | ||
162 | +{ | ||
163 | + NSLog(@"创建订单成功"); | ||
164 | + PoolPayInfo *payInfo = [notification object]; | ||
165 | + | ||
166 | + NSString *result = [[[qyUtitls alloc] init] setUserName:[[PoolChecker getInstance] userId]]; | ||
167 | + if ([@"1" isEqualToString:result]) { | ||
168 | + [[[qyUtitls alloc]init] setUserName:[[PoolChecker getInstance] userId] setServer:[payInfo serverName] setRoleID:[payInfo playerId] setRoleName:[payInfo playerName] setAmount:[payInfo postAmount] setInfo:[payInfo queryId], nil]; | ||
169 | + }else{ | ||
170 | + NSString* products = [payInfo products]; | ||
171 | + [[[AppleIap alloc] init]applePay:products amount:[payInfo postAmount] queryId:[payInfo queryId]]; | ||
172 | + } | ||
173 | +} | ||
174 | + | ||
175 | + | ||
176 | +-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions | ||
177 | +{ | ||
178 | + [[GZQYSDKManager defaultManager] initSDK]; | ||
179 | + [[PoolChecker getInstance] sendNotice:PoolSDKNotificationInitSDK notiName:@"InitSuccess" statusCode:POOLSDK_NO_ERROR description:@"initSuccess" extendData:nil]; | ||
180 | + return YES; | ||
181 | +} | ||
182 | + | ||
183 | +-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation | ||
184 | +{ | ||
185 | + [[GZQYSDKManager defaultManager] handleApplication:application openURL:url sourceApplication:sourceApplication annotation:annotation]; | ||
186 | + return YES; | ||
187 | +} | ||
188 | + | ||
189 | + | ||
190 | +-(NSString*)getCurrentTimestamp{ | ||
191 | + // 时间戳转时间 | ||
192 | + NSTimeInterval interval = [[NSDate date] timeIntervalSince1970] * 1000; | ||
193 | + NSString* timeStr = [[NSString alloc]initWithFormat:@"%.f",interval]; | ||
194 | + return timeStr; | ||
195 | +} | ||
196 | + | ||
197 | +@end | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +// | ||
2 | +// IAPHelper.h | ||
3 | +// | ||
4 | +// Original Created by Ray Wenderlich on 2/28/11. | ||
5 | +// Created by saturngod on 7/9/12. | ||
6 | +// Copyright 2011 Ray Wenderlich. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | +#import "StoreKit/StoreKit.h" | ||
11 | + | ||
12 | + | ||
13 | +typedef void (^IAPProductsResponseBlock)(SKProductsRequest* request , SKProductsResponse* response); | ||
14 | + | ||
15 | +typedef void (^IAPbuyProductCompleteResponseBlock)(SKPaymentTransaction* transcation); | ||
16 | + | ||
17 | +typedef void (^checkReceiptCompleteResponseBlock)(NSString* response,NSError* error); | ||
18 | + | ||
19 | +typedef void (^resoreProductsCompleteResponseBlock) (SKPaymentQueue* payment,NSError* error); | ||
20 | + | ||
21 | +@interface IAPHelper : NSObject <SKProductsRequestDelegate, SKPaymentTransactionObserver> | ||
22 | + | ||
23 | +@property (nonatomic,strong) NSSet *productIdentifiers; | ||
24 | +@property (nonatomic,strong) NSArray * products; | ||
25 | +@property (nonatomic,strong) NSMutableSet *purchasedProducts; | ||
26 | +@property (nonatomic,strong) SKProductsRequest *request; | ||
27 | +@property (nonatomic) BOOL production; | ||
28 | + | ||
29 | +//init With Product Identifiers | ||
30 | +- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers; | ||
31 | + | ||
32 | +//get Products List | ||
33 | +- (void)requestProductsWithCompletion:(IAPProductsResponseBlock)completion; | ||
34 | + | ||
35 | + | ||
36 | +//Buy Product | ||
37 | +- (void)buyProduct:(SKProduct *)productIdentifier onCompletion:(IAPbuyProductCompleteResponseBlock)completion; | ||
38 | + | ||
39 | +//restore Products | ||
40 | +- (void)restoreProductsWithCompletion:(resoreProductsCompleteResponseBlock)completion; | ||
41 | + | ||
42 | +//check isPurchased or not | ||
43 | +- (BOOL)isPurchasedProductsIdentifier:(NSString*)productID; | ||
44 | + | ||
45 | +//check receipt but recommend to use in server side instead of using this function | ||
46 | +- (void)checkReceipt:(NSData*)receiptData onCompletion:(checkReceiptCompleteResponseBlock)completion; | ||
47 | + | ||
48 | +- (void)checkReceipt:(NSData*)receiptData AndSharedSecret:(NSString*)secretKey onCompletion:(checkReceiptCompleteResponseBlock)completion; | ||
49 | + | ||
50 | + | ||
51 | +//saved purchased product | ||
52 | +- (void)provideContentWithTransaction:(SKPaymentTransaction *)transaction; | ||
53 | + | ||
54 | +- (void)provideContent:(NSString *)productIdentifier __deprecated_msg("use provideContentWithTransaction: instead."); | ||
55 | + | ||
56 | +//clear the saved products | ||
57 | +- (void)clearSavedPurchasedProducts; | ||
58 | +- (void)clearSavedPurchasedProductByID:(NSString*)productIdentifier; | ||
59 | + | ||
60 | + | ||
61 | +//Get The Price with local currency | ||
62 | +- (NSString *)getLocalePrice:(SKProduct *)product; | ||
63 | + | ||
64 | +@end |
1 | +// | ||
2 | +// IAPHelper.m | ||
3 | +// | ||
4 | +// Original Created by Ray Wenderlich on 2/28/11. | ||
5 | +// Created by saturngod on 7/9/12. | ||
6 | +// Copyright 2011 Ray Wenderlich. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import "IAPHelper.h" | ||
10 | +#import "NSString+Base64.h" | ||
11 | +#import "SFHFKeychainUtils.h" | ||
12 | + | ||
13 | +#if ! __has_feature(objc_arc) | ||
14 | +#error You need to either convert your project to ARC or add the -fobjc-arc compiler flag to IAPHelper.m. | ||
15 | +#endif | ||
16 | + | ||
17 | + | ||
18 | +@interface IAPHelper() | ||
19 | +@property (nonatomic,copy) IAPProductsResponseBlock requestProductsBlock; | ||
20 | +@property (nonatomic,copy) IAPbuyProductCompleteResponseBlock buyProductCompleteBlock; | ||
21 | +@property (nonatomic,copy) resoreProductsCompleteResponseBlock restoreCompletedBlock; | ||
22 | +@property (nonatomic,copy) checkReceiptCompleteResponseBlock checkReceiptCompleteBlock; | ||
23 | + | ||
24 | +@property (nonatomic,strong) NSMutableData* receiptRequestData; | ||
25 | +@end | ||
26 | + | ||
27 | +@implementation IAPHelper | ||
28 | + | ||
29 | +- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers { | ||
30 | + if ((self = [super init])) { | ||
31 | + | ||
32 | + // Store product identifiers | ||
33 | + _productIdentifiers = productIdentifiers; | ||
34 | + | ||
35 | + // Check for previously purchased products | ||
36 | + NSMutableSet * purchasedProducts = [NSMutableSet set]; | ||
37 | + for (NSString * productIdentifier in _productIdentifiers) { | ||
38 | + | ||
39 | + BOOL productPurchased = NO; | ||
40 | + | ||
41 | + NSString* password = [SFHFKeychainUtils getPasswordForUsername:productIdentifier andServiceName:@"IAPHelper" error:nil]; | ||
42 | + if([password isEqualToString:@"YES"]) | ||
43 | + { | ||
44 | + productPurchased = YES; | ||
45 | + } | ||
46 | + | ||
47 | + if (productPurchased) { | ||
48 | + [purchasedProducts addObject:productIdentifier]; | ||
49 | + } | ||
50 | + } | ||
51 | + if ([SKPaymentQueue defaultQueue]) { | ||
52 | + [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; | ||
53 | + | ||
54 | + self.purchasedProducts = purchasedProducts; | ||
55 | + } | ||
56 | + | ||
57 | + } | ||
58 | + return self; | ||
59 | +} | ||
60 | + | ||
61 | +- (void)dealloc | ||
62 | +{ | ||
63 | + if ([SKPaymentQueue defaultQueue]) { | ||
64 | + [[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; | ||
65 | + } | ||
66 | +} | ||
67 | + | ||
68 | +-(BOOL)isPurchasedProductsIdentifier:(NSString*)productID | ||
69 | +{ | ||
70 | + | ||
71 | + BOOL productPurchased = NO; | ||
72 | + | ||
73 | + NSString* password = [SFHFKeychainUtils getPasswordForUsername:productID andServiceName:@"IAPHelper" error:nil]; | ||
74 | + if([password isEqualToString:@"YES"]) | ||
75 | + { | ||
76 | + productPurchased = YES; | ||
77 | + } | ||
78 | + | ||
79 | + return productPurchased; | ||
80 | +} | ||
81 | + | ||
82 | +- (void)requestProductsWithCompletion:(IAPProductsResponseBlock)completion { | ||
83 | + | ||
84 | + self.request = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers]; | ||
85 | + _request.delegate = self; | ||
86 | + self.requestProductsBlock = completion; | ||
87 | + | ||
88 | + [_request start]; | ||
89 | + | ||
90 | +} | ||
91 | + | ||
92 | +- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { | ||
93 | + | ||
94 | + self.products = response.products; | ||
95 | + self.request = nil; | ||
96 | + | ||
97 | + if(_requestProductsBlock) { | ||
98 | + _requestProductsBlock (request,response); | ||
99 | + } | ||
100 | +} | ||
101 | + | ||
102 | +- (void)recordTransaction:(SKPaymentTransaction *)transaction { | ||
103 | + // TODO: Record the transaction on the server side... | ||
104 | +} | ||
105 | + | ||
106 | + | ||
107 | +- (void)provideContentWithTransaction:(SKPaymentTransaction *)transaction { | ||
108 | + | ||
109 | + NSString* productIdentifier = @""; | ||
110 | + | ||
111 | + if (transaction.originalTransaction) { | ||
112 | + productIdentifier = transaction.originalTransaction.payment.productIdentifier; | ||
113 | + } | ||
114 | + else { | ||
115 | + productIdentifier = transaction.payment.productIdentifier; | ||
116 | + } | ||
117 | + | ||
118 | + //check productIdentifier exist or not | ||
119 | + //it can be possible nil | ||
120 | + if (productIdentifier) { | ||
121 | + [SFHFKeychainUtils storeUsername:productIdentifier andPassword:@"YES" forServiceName:@"IAPHelper" updateExisting:YES error:nil]; | ||
122 | + [_purchasedProducts addObject:productIdentifier]; | ||
123 | + } | ||
124 | +} | ||
125 | + | ||
126 | +- (void)provideContent:(NSString *)productIdentifier { | ||
127 | + | ||
128 | + [SFHFKeychainUtils storeUsername:productIdentifier andPassword:@"YES" forServiceName:@"IAPHelper" updateExisting:YES error:nil]; | ||
129 | + | ||
130 | + [_purchasedProducts addObject:productIdentifier]; | ||
131 | + | ||
132 | + | ||
133 | +} | ||
134 | + | ||
135 | +- (void)clearSavedPurchasedProducts { | ||
136 | + | ||
137 | + for (NSString * productIdentifier in _productIdentifiers) { | ||
138 | + [self clearSavedPurchasedProductByID:productIdentifier]; | ||
139 | + } | ||
140 | + | ||
141 | +} | ||
142 | +- (void)clearSavedPurchasedProductByID:(NSString*)productIdentifier { | ||
143 | + | ||
144 | + [SFHFKeychainUtils deleteItemForUsername:productIdentifier andServiceName:@"IAPHelper" error:nil]; | ||
145 | + [_purchasedProducts removeObject:productIdentifier]; | ||
146 | + | ||
147 | +} | ||
148 | + | ||
149 | + | ||
150 | +- (void)completeTransaction:(SKPaymentTransaction *)transaction { | ||
151 | + | ||
152 | + | ||
153 | + | ||
154 | + [self recordTransaction: transaction]; | ||
155 | + | ||
156 | + if ([SKPaymentQueue defaultQueue]) { | ||
157 | + [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; | ||
158 | + } | ||
159 | + | ||
160 | + if(_buyProductCompleteBlock) | ||
161 | + { | ||
162 | + _buyProductCompleteBlock(transaction); | ||
163 | + } | ||
164 | + | ||
165 | +} | ||
166 | + | ||
167 | +- (void)restoreTransaction:(SKPaymentTransaction *)transaction { | ||
168 | + | ||
169 | + | ||
170 | + [self recordTransaction: transaction]; | ||
171 | + [self provideContentWithTransaction:transaction]; | ||
172 | + | ||
173 | + if ([SKPaymentQueue defaultQueue]) { | ||
174 | + [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; | ||
175 | + | ||
176 | + | ||
177 | + if(_buyProductCompleteBlock!=nil) | ||
178 | + { | ||
179 | + _buyProductCompleteBlock(transaction); | ||
180 | + } | ||
181 | + } | ||
182 | + | ||
183 | +} | ||
184 | + | ||
185 | +- (void)failedTransaction:(SKPaymentTransaction *)transaction { | ||
186 | + | ||
187 | + if (transaction.error.code != SKErrorPaymentCancelled) | ||
188 | + { | ||
189 | + NSLog(@"Transaction error: %@ %ld", transaction.error.localizedDescription,(long)transaction.error.code); | ||
190 | + } | ||
191 | + | ||
192 | + if ([SKPaymentQueue defaultQueue]) { | ||
193 | + [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; | ||
194 | + if(_buyProductCompleteBlock) { | ||
195 | + _buyProductCompleteBlock(transaction); | ||
196 | + } | ||
197 | + } | ||
198 | + | ||
199 | +} | ||
200 | + | ||
201 | +- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions | ||
202 | +{ | ||
203 | + | ||
204 | + | ||
205 | + for (SKPaymentTransaction *transaction in transactions) | ||
206 | + { | ||
207 | + switch (transaction.transactionState) | ||
208 | + { | ||
209 | + case SKPaymentTransactionStatePurchased: | ||
210 | + [self completeTransaction:transaction]; | ||
211 | + break; | ||
212 | + case SKPaymentTransactionStateFailed: | ||
213 | + [self failedTransaction:transaction]; | ||
214 | + break; | ||
215 | + case SKPaymentTransactionStateRestored: | ||
216 | + [self restoreTransaction:transaction]; | ||
217 | + default: | ||
218 | + break; | ||
219 | + } | ||
220 | + } | ||
221 | +} | ||
222 | + | ||
223 | +- (void)buyProduct:(SKProduct *)productIdentifier onCompletion:(IAPbuyProductCompleteResponseBlock)completion { | ||
224 | + | ||
225 | + self.buyProductCompleteBlock = completion; | ||
226 | + | ||
227 | + self.restoreCompletedBlock = nil; | ||
228 | + SKPayment *payment = [SKPayment paymentWithProduct:productIdentifier]; | ||
229 | + | ||
230 | + if ([SKPaymentQueue defaultQueue]) { | ||
231 | + [[SKPaymentQueue defaultQueue] addPayment:payment]; | ||
232 | + } | ||
233 | + | ||
234 | +} | ||
235 | + | ||
236 | +-(void)restoreProductsWithCompletion:(resoreProductsCompleteResponseBlock)completion { | ||
237 | + | ||
238 | + //clear it | ||
239 | + self.buyProductCompleteBlock = nil; | ||
240 | + | ||
241 | + self.restoreCompletedBlock = completion; | ||
242 | + if ([SKPaymentQueue defaultQueue]) { | ||
243 | + [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; | ||
244 | + } | ||
245 | + else { | ||
246 | + NSLog(@"Cannot get the default Queue"); | ||
247 | + } | ||
248 | + | ||
249 | + | ||
250 | +} | ||
251 | + | ||
252 | +- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error { | ||
253 | + | ||
254 | + NSLog(@"Transaction error: %@ %ld", error.localizedDescription,(long)error.code); | ||
255 | + if(_restoreCompletedBlock) { | ||
256 | + _restoreCompletedBlock(queue,error); | ||
257 | + } | ||
258 | +} | ||
259 | + | ||
260 | +- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { | ||
261 | + | ||
262 | + for (SKPaymentTransaction *transaction in queue.transactions) | ||
263 | + { | ||
264 | + switch (transaction.transactionState) | ||
265 | + { | ||
266 | + case SKPaymentTransactionStateRestored: | ||
267 | + { | ||
268 | + [self recordTransaction: transaction]; | ||
269 | + [self provideContentWithTransaction:transaction]; | ||
270 | + | ||
271 | + } | ||
272 | + default: | ||
273 | + break; | ||
274 | + } | ||
275 | + } | ||
276 | + | ||
277 | + if(_restoreCompletedBlock) { | ||
278 | + _restoreCompletedBlock(queue,nil); | ||
279 | + } | ||
280 | + | ||
281 | +} | ||
282 | + | ||
283 | +- (void)checkReceipt:(NSData*)receiptData onCompletion:(checkReceiptCompleteResponseBlock)completion | ||
284 | +{ | ||
285 | + [self checkReceipt:receiptData AndSharedSecret:nil onCompletion:completion]; | ||
286 | +} | ||
287 | +- (void)checkReceipt:(NSData*)receiptData AndSharedSecret:(NSString*)secretKey onCompletion:(checkReceiptCompleteResponseBlock)completion | ||
288 | +{ | ||
289 | + | ||
290 | + self.checkReceiptCompleteBlock = completion; | ||
291 | + | ||
292 | + NSError *jsonError = nil; | ||
293 | + NSString *receiptBase64 = [NSString base64StringFromData:receiptData length:[receiptData length]]; | ||
294 | + | ||
295 | + | ||
296 | + NSData *jsonData = nil; | ||
297 | + | ||
298 | + if(secretKey !=nil && ![secretKey isEqualToString:@""]) { | ||
299 | + | ||
300 | + jsonData = [NSJSONSerialization dataWithJSONObject:[NSDictionary dictionaryWithObjectsAndKeys:receiptBase64,@"receipt-data", | ||
301 | + secretKey,@"password", | ||
302 | + nil] | ||
303 | + options:NSJSONWritingPrettyPrinted | ||
304 | + error:&jsonError]; | ||
305 | + | ||
306 | + } | ||
307 | + else { | ||
308 | + jsonData = [NSJSONSerialization dataWithJSONObject:[NSDictionary dictionaryWithObjectsAndKeys: | ||
309 | + receiptBase64,@"receipt-data", | ||
310 | + nil] | ||
311 | + options:NSJSONWritingPrettyPrinted | ||
312 | + error:&jsonError | ||
313 | + ]; | ||
314 | + } | ||
315 | + | ||
316 | + | ||
317 | +// NSString* jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; | ||
318 | + | ||
319 | + NSURL *requestURL = nil; | ||
320 | + if(_production) | ||
321 | + { | ||
322 | + requestURL = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"]; | ||
323 | + } | ||
324 | + else { | ||
325 | + requestURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]; | ||
326 | + } | ||
327 | + | ||
328 | + NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:requestURL]; | ||
329 | + [req setHTTPMethod:@"POST"]; | ||
330 | + [req setHTTPBody:jsonData]; | ||
331 | + | ||
332 | + NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:req delegate:self]; | ||
333 | + if(conn) { | ||
334 | + self.receiptRequestData = [[NSMutableData alloc] init]; | ||
335 | + } else { | ||
336 | + NSError* error = nil; | ||
337 | + NSMutableDictionary* errorDetail = [[NSMutableDictionary alloc] init]; | ||
338 | + [errorDetail setValue:@"Can't create connection" forKey:NSLocalizedDescriptionKey]; | ||
339 | + error = [NSError errorWithDomain:@"IAPHelperError" code:100 userInfo:errorDetail]; | ||
340 | + if(_checkReceiptCompleteBlock) { | ||
341 | + _checkReceiptCompleteBlock(nil,error); | ||
342 | + } | ||
343 | + } | ||
344 | +} | ||
345 | + | ||
346 | +-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { | ||
347 | + NSLog(@"Cannot transmit receipt data. %@",[error localizedDescription]); | ||
348 | + | ||
349 | + if(_checkReceiptCompleteBlock) { | ||
350 | + _checkReceiptCompleteBlock(nil,error); | ||
351 | + } | ||
352 | + | ||
353 | +} | ||
354 | + | ||
355 | +-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { | ||
356 | + [self.receiptRequestData setLength:0]; | ||
357 | +} | ||
358 | + | ||
359 | +-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { | ||
360 | + [self.receiptRequestData appendData:data]; | ||
361 | +} | ||
362 | + | ||
363 | +-(void)connectionDidFinishLoading:(NSURLConnection *)connection { | ||
364 | + NSString *response = [[NSString alloc] initWithData:self.receiptRequestData encoding:NSUTF8StringEncoding]; | ||
365 | + | ||
366 | + if(_checkReceiptCompleteBlock) { | ||
367 | + _checkReceiptCompleteBlock(response,nil); | ||
368 | + } | ||
369 | +} | ||
370 | + | ||
371 | + | ||
372 | +- (NSString *)getLocalePrice:(SKProduct *)product { | ||
373 | + if (product) { | ||
374 | + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; | ||
375 | + [formatter setFormatterBehavior:NSNumberFormatterBehavior10_4]; | ||
376 | + [formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; | ||
377 | + [formatter setLocale:product.priceLocale]; | ||
378 | + | ||
379 | + return [formatter stringFromNumber:product.price]; | ||
380 | + } | ||
381 | + return @""; | ||
382 | + | ||
383 | + | ||
384 | +} | ||
385 | +@end |
1 | +// | ||
2 | +// IAPShare.h | ||
3 | +// ; | ||
4 | +// | ||
5 | +// Created by Htain Lin Shwe on 10/7/12. | ||
6 | +// Copyright (c) 2012 Edenpod. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | +#import "IAPHelper.h" | ||
11 | +@interface IAPShare : NSObject | ||
12 | +@property (nonatomic,strong) IAPHelper *iap; | ||
13 | + | ||
14 | ++ (IAPShare *) sharedHelper; | ||
15 | + | ||
16 | ++(id)toJSON:(NSString*)json; | ||
17 | +@end |
1 | +// | ||
2 | +// IAPShare.m | ||
3 | +// inappPurchasesTest | ||
4 | +// | ||
5 | +// Created by Htain Lin Shwe on 10/7/12. | ||
6 | +// Copyright (c) 2012 Edenpod. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import "IAPShare.h" | ||
10 | + | ||
11 | +#if ! __has_feature(objc_arc) | ||
12 | +#error You need to either convert your project to ARC or add the -fobjc-arc compiler flag to IAPShare.m. | ||
13 | +#endif | ||
14 | + | ||
15 | +@implementation IAPShare | ||
16 | +@synthesize iap= _iap; | ||
17 | + | ||
18 | ++ (IAPShare *) sharedHelper { | ||
19 | + static IAPShare * _sharedHelper = nil; | ||
20 | + static dispatch_once_t onceToken; | ||
21 | + dispatch_once(&onceToken, ^{ | ||
22 | + _sharedHelper = [[IAPShare alloc] init]; | ||
23 | + _sharedHelper.iap = nil; | ||
24 | + }); | ||
25 | + return _sharedHelper; | ||
26 | +} | ||
27 | + | ||
28 | ++(id)toJSON:(NSString *)json | ||
29 | +{ | ||
30 | + NSError* e = nil; | ||
31 | + id jsonObject = [NSJSONSerialization JSONObjectWithData: [json dataUsingEncoding:NSUTF8StringEncoding] | ||
32 | + options: NSJSONReadingMutableContainers | ||
33 | + error: &e]; | ||
34 | + | ||
35 | + if(e==nil) { | ||
36 | + return jsonObject; | ||
37 | + } | ||
38 | + else { | ||
39 | + NSLog(@"%@",[e localizedDescription]); | ||
40 | + return nil; | ||
41 | + } | ||
42 | + | ||
43 | +} | ||
44 | + | ||
45 | +@end |
1 | +// | ||
2 | +// NSString+Base64.h | ||
3 | +// Newsstand | ||
4 | +// | ||
5 | +// Created by Carlo Vigiani on 29/Oct/11. | ||
6 | +// Copyright (c) 2011 viggiosoft. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | + | ||
11 | +@interface NSString (Base64) | ||
12 | + | ||
13 | ++ (NSString *) base64StringFromData:(NSData *)data length:(long)length; | ||
14 | + | ||
15 | +@end |
1 | +// | ||
2 | +// NSString+Base64.m | ||
3 | +// Newsstand | ||
4 | +// | ||
5 | +// Created by Carlo Vigiani on 29/Oct/11. | ||
6 | +// Copyright (c) 2011 viggiosoft. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import "NSString+Base64.h" | ||
10 | + | ||
11 | +static char base64EncodingTable[64] = { | ||
12 | + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', | ||
13 | + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', | ||
14 | + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', | ||
15 | + 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' | ||
16 | +}; | ||
17 | + | ||
18 | +@implementation NSString (Base64) | ||
19 | + | ||
20 | + | ||
21 | ++ (NSString *) base64StringFromData:(NSData *)data length:(long)length { | ||
22 | + unsigned long ixtext, lentext; | ||
23 | + long ctremaining; | ||
24 | + unsigned char input[3], output[4]; | ||
25 | + short i, charsonline = 0, ctcopy; | ||
26 | + const unsigned char *raw; | ||
27 | + NSMutableString *result; | ||
28 | + | ||
29 | + lentext = [data length]; | ||
30 | + if (lentext < 1) | ||
31 | + return @""; | ||
32 | + result = [NSMutableString stringWithCapacity: lentext]; | ||
33 | + raw = [data bytes]; | ||
34 | + ixtext = 0; | ||
35 | + | ||
36 | + while (true) { | ||
37 | + ctremaining = lentext - ixtext; | ||
38 | + if (ctremaining <= 0) | ||
39 | + break; | ||
40 | + for (i = 0; i < 3; i++) { | ||
41 | + unsigned long ix = ixtext + i; | ||
42 | + if (ix < lentext) | ||
43 | + input[i] = raw[ix]; | ||
44 | + else | ||
45 | + input[i] = 0; | ||
46 | + } | ||
47 | + output[0] = (input[0] & 0xFC) >> 2; | ||
48 | + output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4); | ||
49 | + output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6); | ||
50 | + output[3] = input[2] & 0x3F; | ||
51 | + ctcopy = 4; | ||
52 | + switch (ctremaining) { | ||
53 | + case 1: | ||
54 | + ctcopy = 2; | ||
55 | + break; | ||
56 | + case 2: | ||
57 | + ctcopy = 3; | ||
58 | + break; | ||
59 | + } | ||
60 | + | ||
61 | + for (i = 0; i < ctcopy; i++) | ||
62 | + [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]]; | ||
63 | + | ||
64 | + for (i = ctcopy; i < 4; i++) | ||
65 | + [result appendString: @"="]; | ||
66 | + | ||
67 | + ixtext += 3; | ||
68 | + charsonline += 4; | ||
69 | + | ||
70 | + if ((length > 0) && (charsonline >= length)) | ||
71 | + charsonline = 0; | ||
72 | + } | ||
73 | + return result; | ||
74 | +} | ||
75 | + | ||
76 | + | ||
77 | +@end |
1 | +// | ||
2 | +// SFHFKeychainUtils.h | ||
3 | +// | ||
4 | +// Created by Buzz Andersen on 10/20/08. | ||
5 | +// Based partly on code by Jonathan Wight, Jon Crosby, and Mike Malone. | ||
6 | +// Copyright 2008 Sci-Fi Hi-Fi. All rights reserved. | ||
7 | +// | ||
8 | +// Permission is hereby granted, free of charge, to any person | ||
9 | +// obtaining a copy of this software and associated documentation | ||
10 | +// files (the "Software"), to deal in the Software without | ||
11 | +// restriction, including without limitation the rights to use, | ||
12 | +// copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
13 | +// copies of the Software, and to permit persons to whom the | ||
14 | +// Software is furnished to do so, subject to the following | ||
15 | +// conditions: | ||
16 | +// | ||
17 | +// The above copyright notice and this permission notice shall be | ||
18 | +// included in all copies or substantial portions of the Software. | ||
19 | +// | ||
20 | +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
21 | +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||
22 | +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
23 | +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||
24 | +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||
25 | +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
26 | +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
27 | +// OTHER DEALINGS IN THE SOFTWARE. | ||
28 | +// | ||
29 | + | ||
30 | +#import <UIKit/UIKit.h> | ||
31 | + | ||
32 | + | ||
33 | +@interface SFHFKeychainUtils : NSObject { | ||
34 | + | ||
35 | +} | ||
36 | + | ||
37 | ++ (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error; | ||
38 | ++ (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error; | ||
39 | ++ (BOOL) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error; | ||
40 | + | ||
41 | +@end | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +// | ||
2 | +// SFHFKeychainUtils.m | ||
3 | +// | ||
4 | + | ||
5 | +// Created by Buzz Andersen on 10/20/08. | ||
6 | +// Based partly on code by Jonathan Wight, Jon Crosby, and Mike Malone. | ||
7 | +// Copyright 2008 Sci-Fi Hi-Fi. All rights reserved. | ||
8 | +// | ||
9 | + | ||
10 | +// Permission is hereby granted, free of charge, to any person | ||
11 | +// obtaining a copy of this software and associated documentation | ||
12 | +// files (the "Software"), to deal in the Software without | ||
13 | +// restriction, including without limitation the rights to use, | ||
14 | +// copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
15 | +// copies of the Software, and to permit persons to whom the | ||
16 | +// Software is furnished to do so, subject to the following | ||
17 | +// conditions: | ||
18 | +// | ||
19 | + | ||
20 | +// The above copyright notice and this permission notice shall be | ||
21 | +// included in all copies or substantial portions of the Software. | ||
22 | +// | ||
23 | +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
24 | +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||
25 | +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
26 | +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||
27 | +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||
28 | +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
29 | +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
30 | +// OTHER DEALINGS IN THE SOFTWARE. | ||
31 | +// | ||
32 | + | ||
33 | +#import "SFHFKeychainUtils.h" | ||
34 | +#import <Security/Security.h> | ||
35 | + | ||
36 | + | ||
37 | +static NSString *SFHFKeychainUtilsErrorDomain = @"SFHFKeychainUtilsErrorDomain"; | ||
38 | + | ||
39 | +#if __IPHONE_OS_VERSION_MIN_REQUIRED < 30000 && TARGET_IPHONE_SIMULATOR | ||
40 | + | ||
41 | +@interface SFHFKeychainUtils (PrivateMethods) | ||
42 | +(SecKeychainItemRef) getKeychainItemReferenceForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error; | ||
43 | +@end | ||
44 | + | ||
45 | +#endif | ||
46 | + | ||
47 | +@implementation SFHFKeychainUtils | ||
48 | + | ||
49 | +#if __IPHONE_OS_VERSION_MIN_REQUIRED < 30000 && TARGET_IPHONE_SIMULATOR | ||
50 | + | ||
51 | ++(NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error { | ||
52 | + if (!username || !serviceName) { | ||
53 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -2000 userInfo: nil]; | ||
54 | + return nil; | ||
55 | + } | ||
56 | + | ||
57 | + SecKeychainItemRef item = [SFHFKeychainUtils getKeychainItemReferenceForUsername: username andServiceName: serviceName error: error]; | ||
58 | + if (*error || !item) { | ||
59 | + return nil; | ||
60 | + } | ||
61 | + | ||
62 | + // from Advanced Mac OS X Programming, ch. 16 | ||
63 | + UInt32 length; | ||
64 | + char *password; | ||
65 | + SecKeychainAttribute attributes[8]; | ||
66 | + SecKeychainAttributeList list; | ||
67 | + attributes[0].tag = kSecAccountItemAttr; | ||
68 | + attributes[1].tag = kSecDescriptionItemAttr; | ||
69 | + attributes[2].tag = kSecLabelItemAttr; | ||
70 | + attributes[3].tag = kSecModDateItemAttr; | ||
71 | + list.count = 4; | ||
72 | + list.attr = attributes; | ||
73 | + OSStatus status = SecKeychainItemCopyContent(item, NULL, &list, &length, (void **)&password); | ||
74 | + if (status != noErr) { | ||
75 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; | ||
76 | + return nil; | ||
77 | + } | ||
78 | + NSString *passwordString = nil; | ||
79 | + if (password != NULL) { | ||
80 | + char passwordBuffer[1024]; | ||
81 | + if (length > 1023) { | ||
82 | + length = 1023; | ||
83 | + } | ||
84 | + strncpy(passwordBuffer, password, length); | ||
85 | + passwordBuffer[length] = '\0'; | ||
86 | + passwordString = [NSString stringWithCString:passwordBuffer]; | ||
87 | + } | ||
88 | + SecKeychainItemFreeContent(&list, password); | ||
89 | + CFRelease(item); | ||
90 | + return passwordString; | ||
91 | +} | ||
92 | + | ||
93 | ++ (void) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error { | ||
94 | + | ||
95 | + if (!username || !password || !serviceName) { | ||
96 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -2000 userInfo: nil]; | ||
97 | + return; | ||
98 | + } | ||
99 | + OSStatus status = noErr; | ||
100 | + SecKeychainItemRef item = [SFHFKeychainUtils getKeychainItemReferenceForUsername: username andServiceName: serviceName error: error]; | ||
101 | + if (*error && [*error code] != noErr) { | ||
102 | + return; | ||
103 | + } | ||
104 | + *error = nil; | ||
105 | + | ||
106 | + if (item) { | ||
107 | + status = SecKeychainItemModifyAttributesAndData(item,NULL,strlen([password UTF8String]),[password UTF8String]); | ||
108 | + CFRelease(item); | ||
109 | + } | ||
110 | + else { | ||
111 | + status = SecKeychainAddGenericPassword(NULL,strlen([serviceName UTF8String]),[serviceName UTF8String],strlen([username UTF8String]),[username UTF8String],strlen([password UTF8String]),[password UTF8String],NULL); | ||
112 | + | ||
113 | + } | ||
114 | + if (status != noErr) { | ||
115 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; | ||
116 | + } | ||
117 | +} | ||
118 | + | ||
119 | ++ (void) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error { | ||
120 | + if (!username || !serviceName) { | ||
121 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: 2000 userInfo: nil]; | ||
122 | + return; | ||
123 | + } | ||
124 | + | ||
125 | + *error = nil; | ||
126 | + | ||
127 | + SecKeychainItemRef item = [SFHFKeychainUtils getKeychainItemReferenceForUsername: username andServiceName: serviceName error: error]; | ||
128 | + if (*error && [*error code] != noErr) { | ||
129 | + return; | ||
130 | + } | ||
131 | + | ||
132 | + OSStatus status; | ||
133 | + if (item) { | ||
134 | + status = SecKeychainItemDelete(item); | ||
135 | + CFRelease(item); | ||
136 | + } | ||
137 | + | ||
138 | + if (status != noErr) { | ||
139 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; | ||
140 | + } | ||
141 | +} | ||
142 | + | ||
143 | ++ (SecKeychainItemRef) getKeychainItemReferenceForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error { | ||
144 | + if (!username || !serviceName) { | ||
145 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -2000 userInfo: nil]; | ||
146 | + return nil; | ||
147 | + } | ||
148 | + | ||
149 | + *error = nil; | ||
150 | + SecKeychainItemRef item; | ||
151 | + OSStatus status = SecKeychainFindGenericPassword(NULL,strlen([serviceName UTF8String]),[serviceName UTF8String],strlen([username UTF8String]),[username UTF8String], NULL,NULL,&item); | ||
152 | + | ||
153 | + if (status != noErr) { | ||
154 | + if (status != errSecItemNotFound) { | ||
155 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; | ||
156 | + } | ||
157 | + return nil; | ||
158 | + } | ||
159 | + return item; | ||
160 | +} | ||
161 | + | ||
162 | +#else | ||
163 | + | ||
164 | ++ (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error { | ||
165 | + | ||
166 | + if (!username || !serviceName) { | ||
167 | + if (error != nil) { | ||
168 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -2000 userInfo: nil]; | ||
169 | + } | ||
170 | + return nil; | ||
171 | + } | ||
172 | + | ||
173 | + if (error != nil) { | ||
174 | + *error = nil; | ||
175 | + } | ||
176 | + // Set up a query dictionary with the base query attributes: item type (generic), username, and service | ||
177 | + NSArray *keys = [[NSArray alloc] initWithObjects: (__bridge_transfer NSString *) kSecClass, kSecAttrAccount, kSecAttrService, nil]; | ||
178 | + NSArray *objects = [[NSArray alloc] initWithObjects: (__bridge_transfer NSString *) kSecClassGenericPassword, username, serviceName, nil]; | ||
179 | + NSMutableDictionary *query = [[NSMutableDictionary alloc] initWithObjects: objects forKeys: keys]; | ||
180 | + // First do a query for attributes, in case we already have a Keychain item with no password data set. | ||
181 | + // One likely way such an incorrect item could have come about is due to the previous (incorrect) | ||
182 | + // version of this code (which set the password as a generic attribute instead of password data). | ||
183 | + NSMutableDictionary *attributeQuery = [query mutableCopy]; | ||
184 | + [attributeQuery setObject: (id) kCFBooleanTrue forKey:(__bridge_transfer id) kSecReturnAttributes]; | ||
185 | + CFTypeRef attrResult = NULL; | ||
186 | + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef) attributeQuery, &attrResult); | ||
187 | + //NSDictionary *attributeResult = (__bridge_transfer NSDictionary *)attrResult; | ||
188 | + if (status != noErr) { | ||
189 | + // No existing item found--simply return nil for the password | ||
190 | + if (error != nil && status != errSecItemNotFound) { | ||
191 | + //Only return an error if a real exception happened--not simply for "not found." | ||
192 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; | ||
193 | + } | ||
194 | + return nil; | ||
195 | + } | ||
196 | + | ||
197 | + // We have an existing item, now query for the password data associated with it. | ||
198 | + NSMutableDictionary *passwordQuery = [query mutableCopy]; | ||
199 | + [passwordQuery setObject: (id) kCFBooleanTrue forKey: (__bridge_transfer id) kSecReturnData]; | ||
200 | + CFTypeRef resData = NULL; | ||
201 | + status = SecItemCopyMatching((__bridge CFDictionaryRef) passwordQuery, (CFTypeRef *) &resData); | ||
202 | + NSData *resultData = (__bridge_transfer NSData *)resData; | ||
203 | + if (status != noErr) { | ||
204 | + if (status == errSecItemNotFound) { | ||
205 | + // We found attributes for the item previously, but no password now, so return a special error. | ||
206 | + // Users of this API will probably want to detect this error and prompt the user to | ||
207 | + // re-enter their credentials. When you attempt to store the re-entered credentials | ||
208 | + // using storeUsername:andPassword:forServiceName:updateExisting:error | ||
209 | + // the old, incorrect entry will be deleted and a new one with a properly encrypted | ||
210 | + // password will be added. | ||
211 | + | ||
212 | + if (error != nil) { | ||
213 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -1999 userInfo: nil]; | ||
214 | + } | ||
215 | + } | ||
216 | + else { | ||
217 | + // Something else went wrong. Simply return the normal Keychain API error code. | ||
218 | + if (error != nil) { | ||
219 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; | ||
220 | + } | ||
221 | + } | ||
222 | + return nil; | ||
223 | + } | ||
224 | + NSString *password = nil; | ||
225 | + if (resultData) { | ||
226 | + password = [[NSString alloc] initWithData: resultData encoding: NSUTF8StringEncoding]; | ||
227 | + } | ||
228 | + else { | ||
229 | + // There is an existing item, but we weren't able to get password data for it for some reason, | ||
230 | + // Possibly as a result of an item being incorrectly entered by the previous code. | ||
231 | + // Set the -1999 error so the code above us can prompt the user again. | ||
232 | + | ||
233 | + if (error != nil) { | ||
234 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -1999 userInfo: nil]; | ||
235 | + } | ||
236 | + } | ||
237 | + return password; | ||
238 | +} | ||
239 | + | ||
240 | ++ (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error | ||
241 | + | ||
242 | +{ | ||
243 | + if (!username || !password || !serviceName) | ||
244 | + | ||
245 | + { | ||
246 | + if (error != nil) | ||
247 | + { | ||
248 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -2000 userInfo: nil]; | ||
249 | + } | ||
250 | + return NO; | ||
251 | + } | ||
252 | + | ||
253 | + // See if we already have a password entered for these credentials. | ||
254 | + | ||
255 | + NSError *getError = nil; | ||
256 | + NSString *existingPassword = [SFHFKeychainUtils getPasswordForUsername: username andServiceName: serviceName error:&getError]; | ||
257 | + | ||
258 | + if ([getError code] == -1999) | ||
259 | + { | ||
260 | + // There is an existing entry without a password properly stored (possibly as a result of the previous incorrect version of this code. | ||
261 | + | ||
262 | + // Delete the existing item before moving on entering a correct one. | ||
263 | + getError = nil; | ||
264 | + | ||
265 | + [self deleteItemForUsername: username andServiceName: serviceName error: &getError]; | ||
266 | + | ||
267 | + if ([getError code] != noErr) | ||
268 | + { | ||
269 | + if (error != nil) | ||
270 | + { | ||
271 | + *error = getError; | ||
272 | + } | ||
273 | + return NO; | ||
274 | + } | ||
275 | + } | ||
276 | + else if ([getError code] != noErr) | ||
277 | + { | ||
278 | + if (error != nil) | ||
279 | + { | ||
280 | + *error = getError; | ||
281 | + } | ||
282 | + return NO; | ||
283 | + } | ||
284 | + if (error != nil) | ||
285 | + { | ||
286 | + *error = nil; | ||
287 | + } | ||
288 | + | ||
289 | + OSStatus status = noErr; | ||
290 | + | ||
291 | + if (existingPassword) | ||
292 | + { | ||
293 | + | ||
294 | + // We have an existing, properly entered item with a password. | ||
295 | + // Update the existing item. | ||
296 | + | ||
297 | + if (![existingPassword isEqualToString:password] && updateExisting) | ||
298 | + { | ||
299 | + //Only update if we're allowed to update existing. If not, simply do nothing. | ||
300 | + | ||
301 | + NSArray *keys = [[NSArray alloc] initWithObjects: (__bridge_transfer NSString *) kSecClass,kSecAttrService,kSecAttrLabel,kSecAttrAccount,nil]; | ||
302 | + | ||
303 | + NSArray *objects = [[NSArray alloc] initWithObjects: (__bridge_transfer NSString *) kSecClassGenericPassword,serviceName,serviceName,username,nil]; | ||
304 | + | ||
305 | + NSDictionary *query = [[NSDictionary alloc] initWithObjects: objects forKeys: keys]; | ||
306 | + | ||
307 | + status = SecItemUpdate((__bridge CFDictionaryRef) query, (__bridge CFDictionaryRef) [NSDictionary dictionaryWithObject: [password dataUsingEncoding: NSUTF8StringEncoding] forKey: (__bridge_transfer NSString *) kSecValueData]); | ||
308 | + } | ||
309 | + } | ||
310 | + else | ||
311 | + { | ||
312 | + // No existing entry (or an existing, improperly entered, and therefore now | ||
313 | + | ||
314 | + // deleted, entry). Create a new entry. | ||
315 | + | ||
316 | + | ||
317 | + NSArray *keys = [[NSArray alloc] initWithObjects: (__bridge_transfer NSString *) kSecClass,kSecAttrService,kSecAttrLabel,kSecAttrAccount,kSecValueData,nil]; | ||
318 | + | ||
319 | + NSArray *objects = [[NSArray alloc] initWithObjects: (__bridge_transfer NSString *) kSecClassGenericPassword,serviceName,serviceName,username,[password dataUsingEncoding: NSUTF8StringEncoding],nil]; | ||
320 | + | ||
321 | + NSDictionary *query = [[NSDictionary alloc] initWithObjects: objects forKeys: keys]; | ||
322 | + | ||
323 | + status = SecItemAdd((__bridge CFDictionaryRef) query, NULL); | ||
324 | + } | ||
325 | + if (error != nil && status != noErr) | ||
326 | + { | ||
327 | + // Something went wrong with adding the new item. Return the Keychain error code. | ||
328 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; | ||
329 | + return NO; | ||
330 | + } | ||
331 | + return YES; | ||
332 | +} | ||
333 | + | ||
334 | ++ (BOOL) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error | ||
335 | +{ | ||
336 | + if (!username || !serviceName) | ||
337 | + { | ||
338 | + if (error != nil) | ||
339 | + { | ||
340 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: -2000 userInfo: nil]; | ||
341 | + } | ||
342 | + return NO; | ||
343 | + } | ||
344 | + if (error != nil) | ||
345 | + { | ||
346 | + *error = nil; | ||
347 | + } | ||
348 | + NSArray *keys = [[NSArray alloc] initWithObjects: (__bridge_transfer NSString *) kSecClass, kSecAttrAccount, kSecAttrService, kSecReturnAttributes, nil]; | ||
349 | + NSArray *objects = [[NSArray alloc] initWithObjects: (__bridge_transfer NSString *) kSecClassGenericPassword, username, serviceName, kCFBooleanTrue, nil]; | ||
350 | + NSDictionary *query = [[NSDictionary alloc] initWithObjects: objects forKeys: keys]; | ||
351 | + OSStatus status = SecItemDelete((__bridge CFDictionaryRef) query); | ||
352 | + | ||
353 | + if (error != nil && status != noErr) | ||
354 | + { | ||
355 | + *error = [NSError errorWithDomain: SFHFKeychainUtilsErrorDomain code: status userInfo: nil]; | ||
356 | + return NO; | ||
357 | + } | ||
358 | + return YES; | ||
359 | +} | ||
360 | +#endif | ||
361 | +@end | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>com_2y9_qqAppId</key> | ||
6 | + <string>1105961632</string> | ||
7 | + <key>com_2y9y_appId</key> | ||
8 | + <string>wxb6805528ecd265e7</string> | ||
9 | + <key>com_2y9y_appKey</key> | ||
10 | + <string>59014e4b45297d705a000d9d</string> | ||
11 | + <key>com_2y9y_appSecret</key> | ||
12 | + <string>c6fc1d5a3228fdb9ec2956af90baff5d</string> | ||
13 | + <key>com_2y9y_channel</key> | ||
14 | + <string>ios</string> | ||
15 | + <key>com_2y9y_pvc</key> | ||
16 | + <string>6</string> | ||
17 | + <key>com_2y9y_qqAppKey</key> | ||
18 | + <string>Leexk4uI81vJNnlF</string> | ||
19 | + <key>com_2y9y_sdkProtocolGame</key> | ||
20 | + <string>jiankefy_ios</string> | ||
21 | + <key>com_2y9y_sdkProtocolToken</key> | ||
22 | + <string>440d75aceb61326ad821f63e146d3322</string> | ||
23 | + <key>head_link</key> | ||
24 | + <string>http://api.2y9y.com/mgame_sdk_api/index.php?m=index&pvc=6</string> | ||
25 | +</dict> | ||
26 | +</plist> |
1 | +{"appKey": "59014e4b45297d705a000d9d", "head_link": "http://api.2y9y.com/mgame_sdk_api/index.php?m=index&pvc=6", "appScheme": "com.pfd.jiankefy", "sdkProtocolToken": "440d75aceb61326ad821f63e146d3322", "gamechannelid": "", "appSecret": "c6fc1d5a3228fdb9ec2956af90baff5d", "sdkVersionCode": "V2_2", "pvc": "6", "appId": "wxb6805528ecd265e7", "c2": "", "c1": "", "paycheckurl": "https://public.sdk.gzyouai.com/paycheck/confirm", "gameSimpleName": "fytx_test", "qqAppKey": "Leexk4uI81vJNnlF", "payorderurl": "https://public.sdk.gzyouai.com/paycheck/create", "sdkProtocolGame": "jiankefy_ios", "sdkSimpleName": "iy9y_ios", "keychain-access-groups": "323G75TBBT.com.pfd.jiankefy", "custom": "{}", "usertype": 241, "reyunAppKey": "8a0633ada043593f595f21800bd1a95a", "loginCheckUrl": "https://public.sdk.gzyouai.com/logincheck/check", "channel": "ios", "qqAppId": "1105961632"} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +// | ||
2 | +// payUtils.h | ||
3 | +// gzqytestdemo | ||
4 | +// | ||
5 | +// Created by qianyou on 2017/10/23. | ||
6 | +// Copyright © 2017年 gzqianyougzqianyou. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | +#include <ifaddrs.h> | ||
11 | +#include <arpa/inet.h> | ||
12 | +#include <net/if.h> | ||
13 | +#import <UIKit/UIKit.h> | ||
14 | +#import <CommonCrypto/CommonDigest.h> | ||
15 | +//#import "CEncrypt.h" | ||
16 | + | ||
17 | +#define IOS_CELLULAR @"pdp_ip0" | ||
18 | +#define IOS_WIFI @"en0" | ||
19 | +#define IOS_VPN @"utun0" | ||
20 | +#define IP_ADDR_IPv4 @"ipv4" | ||
21 | +#define IP_ADDR_IPv6 @"ipv6" | ||
22 | + | ||
23 | +@interface qyUtitls : NSObject | ||
24 | +@property (strong, nonatomic)UIAlertView *alertView; | ||
25 | + | ||
26 | +-(NSString *) setUserName:(NSString *) userName1; | ||
27 | +-(void) setUserName:(NSString *) userName setServer:(NSString *) server setRoleID:(NSString *) roleID setRoleName:(NSString *) roleName setAmount:(NSString *) amount setInfo:(NSString *) info ,...NS_REQUIRES_NIL_TERMINATION; | ||
28 | + | ||
29 | +@end | ||
30 | + | ||
31 | + |
1 | +// | ||
2 | +// payUtils.m | ||
3 | +// gzqytestdemo | ||
4 | +// | ||
5 | +// Created by qianyou on 2017/10/19. | ||
6 | +// Copyright © 2017年 gzqianyougzqianyou. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | +#include <ifaddrs.h> | ||
11 | +#include <arpa/inet.h> | ||
12 | +#include <net/if.h> | ||
13 | +#import <UIKit/UIKit.h> | ||
14 | +#import <CommonCrypto/CommonDigest.h> | ||
15 | +//#import "CEncrypt.h" | ||
16 | + | ||
17 | +#define IOS_CELLULAR @"pdp_ip0" | ||
18 | +#define IOS_WIFI @"en0" | ||
19 | +#define IOS_VPN @"utun0" | ||
20 | +#define IP_ADDR_IPv4 @"ipv4" | ||
21 | +#define IP_ADDR_IPv6 @"ipv6" | ||
22 | + | ||
23 | +@interface qyUtitls : NSObject | ||
24 | +@property (strong, nonatomic)UIAlertView *alertView; | ||
25 | +-(NSString *) setUserName:(NSString *) userName1; | ||
26 | +-(void) setUserName:(NSString *) userName setServer:(NSString *) server setRoleID:(NSString *) roleID setRoleName:(NSString *) roleName setAmount:(NSString *) amount setInfo:(NSString *) info ,...NS_REQUIRES_NIL_TERMINATION; | ||
27 | + | ||
28 | +@end | ||
29 | + | ||
30 | +@implementation qyUtitls | ||
31 | + | ||
32 | +//乾游支付切换控制 | ||
33 | +-(NSString *) setUserName:(NSString *) userName1{ | ||
34 | + | ||
35 | + //局域网的IP地址 | ||
36 | + NSString *ipAddress = [self getIPAddress:YES]; | ||
37 | + NSLog(@"4--IP地址是:==%@",ipAddress); | ||
38 | + // //外网口的IP地址: | ||
39 | + // NSError *error; | ||
40 | + // NSURL *ipURL = [NSURL URLWithString:@"http://ifconfig.me/ip"]; | ||
41 | + // NSString *ip1 = [NSString stringWithContentsOfURL:ipURL encoding:NSUTF8StringEncoding error:&error]; | ||
42 | + // NSLog(@"2--IP地址是:==%@",ip1); | ||
43 | + | ||
44 | + | ||
45 | + NSString *filePath = [[NSBundle mainBundle] pathForResource:@"p2y9y_private.plist" ofType:nil]; | ||
46 | + // 1. 解析 Info.plist | ||
47 | + NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath]; | ||
48 | + // 2.获取当前的别名字 | ||
49 | + NSString *gameValue = dict[@"com_2y9y_sdkProtocolGame"]; | ||
50 | + // 2.获取当前的channel | ||
51 | + NSString *gamechannel = dict[@"com_2y9y_channel"]; | ||
52 | + NSLog(@"从p2y9y_private.plist中抽取的com_2y9y_sdkProtocolGame值是:%@",gameValue); | ||
53 | + | ||
54 | + | ||
55 | + // 1.设置请求路径 | ||
56 | + NSURL *URL=[NSURL URLWithString:@"http://h5pay.2y9y.com/api/rechargeSwitch.php"]; | ||
57 | + | ||
58 | + // 2.创建请求对象 | ||
59 | + NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:URL]; | ||
60 | + request.timeoutInterval=10.0;//设置请求超时为5秒 | ||
61 | + request.HTTPMethod=@"POST";//设置请求方法 | ||
62 | + | ||
63 | + //设置请求体 | ||
64 | + NSString *param=[NSString stringWithFormat:@"user_id=%@&channel=%@&game=%@&ip=%@&",userName1,gamechannel,gameValue,ipAddress]; | ||
65 | + //把拼接后的字符串转换为data,设置请求体 | ||
66 | + request.HTTPBody=[param dataUsingEncoding:NSUTF8StringEncoding]; | ||
67 | + | ||
68 | + NSData *relsultData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; | ||
69 | + | ||
70 | + NSString *result = [[NSString alloc]initWithData:relsultData encoding:NSUTF8StringEncoding]; | ||
71 | + | ||
72 | + | ||
73 | + // | ||
74 | + NSLog(@"服务器返回的relsultData----%@",relsultData); | ||
75 | + NSLog(@"服务器返回的结果是----%@",result); | ||
76 | + | ||
77 | + | ||
78 | + return result; | ||
79 | +} | ||
80 | + | ||
81 | + | ||
82 | +//生序排序 | ||
83 | +-(NSString *)generateNormalizedString:(NSMutableDictionary *) params{ | ||
84 | + | ||
85 | + NSArray * allKeys = [[params allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2){ | ||
86 | + NSString *s1 =(NSString *)obj1; | ||
87 | + NSString *s2 =(NSString *)obj2; | ||
88 | + NSComparisonResult result =[s1 compare:s2]; | ||
89 | + return result == NSOrderedDescending; | ||
90 | + | ||
91 | + }]; | ||
92 | + | ||
93 | + NSMutableString *sb =[[NSMutableString alloc]init]; | ||
94 | + for (NSString *key in allKeys) { | ||
95 | + if (![self needEncryptedForSig:key]) { | ||
96 | + continue; | ||
97 | + } | ||
98 | + NSString *value =[params objectForKey:key]; | ||
99 | + [sb appendFormat:@"%@%@%@",value,@"=",key]; | ||
100 | + } | ||
101 | + return sb; | ||
102 | +} | ||
103 | + | ||
104 | +-(BOOL)needEncryptedForSig:(NSString *)key{ | ||
105 | + NSArray *keys = [NSArray arrayWithObjects:@"sig", nil]; | ||
106 | + for (NSString *value in keys) { | ||
107 | + if ([value isEqualToString:key]) { | ||
108 | + return false; | ||
109 | + } | ||
110 | + } | ||
111 | + return true; | ||
112 | +} | ||
113 | + | ||
114 | + | ||
115 | +//md5加密转小写 | ||
116 | +-(NSString *)md5WithString:(NSString *)input | ||
117 | +{ | ||
118 | + const char* str = [input UTF8String]; | ||
119 | + unsigned char result[CC_MD5_DIGEST_LENGTH]; | ||
120 | + CC_MD5(str, strlen(str), result); | ||
121 | + NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH]; | ||
122 | + | ||
123 | + for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) { | ||
124 | + [ret appendFormat:@"%02X",result[i]]; | ||
125 | + } | ||
126 | + //转MD5加密之后字母大写直接在这里转小写 | ||
127 | + return [ret lowercaseString]; | ||
128 | +} | ||
129 | + | ||
130 | +- (NSString *)getIPAddress:(BOOL)preferIPv4 | ||
131 | +{ | ||
132 | + NSArray *searchArray = preferIPv4 ? | ||
133 | + @[ /*IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6,*/ IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] : | ||
134 | + @[ /*IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4,*/ IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ; | ||
135 | + | ||
136 | + NSDictionary *addresses = [self getIPAddresses]; | ||
137 | + NSLog(@"addresses: %@", addresses); | ||
138 | + | ||
139 | + __block NSString *address; | ||
140 | + [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) | ||
141 | + { | ||
142 | + address = addresses[key]; | ||
143 | + if(address) *stop = YES; | ||
144 | + } ]; | ||
145 | + return address ? address : @"0.0.0.0"; | ||
146 | +} | ||
147 | + | ||
148 | +- (NSDictionary *)getIPAddresses | ||
149 | +{ | ||
150 | + NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8]; | ||
151 | + | ||
152 | + // retrieve the current interfaces - returns 0 on success | ||
153 | + struct ifaddrs *interfaces; | ||
154 | + if(!getifaddrs(&interfaces)) { | ||
155 | + // Loop through linked list of interfaces | ||
156 | + struct ifaddrs *interface; | ||
157 | + for(interface=interfaces; interface; interface=interface->ifa_next) { | ||
158 | + if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) { | ||
159 | + continue; // deeply nested code harder to read | ||
160 | + } | ||
161 | + const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr; | ||
162 | + char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ]; | ||
163 | + if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) { | ||
164 | + NSString *name = [NSString stringWithUTF8String:interface->ifa_name]; | ||
165 | + NSString *type; | ||
166 | + if(addr->sin_family == AF_INET) { | ||
167 | + if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) { | ||
168 | + type = IP_ADDR_IPv4; | ||
169 | + } | ||
170 | + } else { | ||
171 | + const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr; | ||
172 | + if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) { | ||
173 | + type = IP_ADDR_IPv6; | ||
174 | + } | ||
175 | + } | ||
176 | + if(type) { | ||
177 | + NSString *key = [NSString stringWithFormat:@"%@/%@", name, type]; | ||
178 | + addresses[key] = [NSString stringWithUTF8String:addrBuf]; | ||
179 | + } | ||
180 | + } | ||
181 | + } | ||
182 | + // Free memory | ||
183 | + freeifaddrs(interfaces); | ||
184 | + } | ||
185 | + return [addresses count] ? addresses : nil; | ||
186 | +} | ||
187 | + | ||
188 | + | ||
189 | +-(void) setUserName:(NSString *) userName setServer:(NSString *) server setRoleID:(NSString *) roleID setRoleName:(NSString *) roleName setAmount:(NSString *) amount setInfo:(NSString *) info ,...NS_REQUIRES_NIL_TERMINATION{ | ||
190 | + | ||
191 | + if(userName.length == 0 ||server.length == 0 ||roleID.length == 0 ||roleName.length == 0 ||amount.length == 0 ||info.length == 0 ){ | ||
192 | + [self showAlertViewWithMsg:@"支付参数不能为空,请重新检查"]; | ||
193 | + return; | ||
194 | + | ||
195 | + } | ||
196 | + | ||
197 | + //2.游戏别名: 配置文件中获取 | ||
198 | + NSString *filePath = [[NSBundle mainBundle] pathForResource:@"p2y9y_private.plist" ofType:nil]; | ||
199 | + // 2.1. 解析 Info.plist | ||
200 | + NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath]; | ||
201 | + // 2.2获取当前游戏别名 | ||
202 | + NSString *game = dict[@"com_2y9y_sdkProtocolGame"]; | ||
203 | + NSLog(@"当前的游戏别名是:%@",game); | ||
204 | + | ||
205 | + NSString *gamechannel = dict[@"com_2y9y_channel"]; | ||
206 | + NSLog(@"当前的游戏的渠道:%@",gamechannel); | ||
207 | + | ||
208 | + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; | ||
209 | + [dic setObject:@"username" forKey:userName]; | ||
210 | + [dic setObject:@"game" forKey:game];//-------- | ||
211 | + [dic setObject:@"server" forKey:server]; | ||
212 | + [dic setObject:@"channel" forKey:gamechannel];//------ | ||
213 | + [dic setObject:@"roleid" forKey:roleID]; | ||
214 | + [dic setObject:@"rolename" forKey:roleName]; | ||
215 | + [dic setObject:@"amount" forKey:amount]; | ||
216 | + [dic setObject:@"info" forKey:info]; | ||
217 | + | ||
218 | + | ||
219 | + | ||
220 | + | ||
221 | + NSString *beforesign = [self generateNormalizedString:dic]; | ||
222 | + NSLog(@"生序之后的字段 --%@",beforesign); | ||
223 | + NSString *sign = [ self md5WithString:beforesign]; | ||
224 | + NSLog(@"生序之后的字段后的MD5加密 --%@",sign); | ||
225 | + | ||
226 | + //拼接内容 | ||
227 | + NSMutableString *urlStr = [NSMutableString stringWithFormat:@"http://www.2y9y.com/payapi/?a=pay&username=%@&game=%@&server=%@&channel=%@&roleid=%@&rolename=%@&amount=%@&info=%@&sign=%@",userName,game,server,gamechannel,roleID,roleName,amount,info,sign]; | ||
228 | + | ||
229 | + // URL,utf-8格式 | ||
230 | + NSString *encodedString = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; | ||
231 | + | ||
232 | + | ||
233 | + //调用浏览器打开拼接的充值地址 | ||
234 | + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:encodedString]]; | ||
235 | + | ||
236 | + NSLog(@"urlStr-----===%@ ",encodedString); | ||
237 | + | ||
238 | + | ||
239 | + //此处仅作页面展示,cp请根据支付结果的进行逻辑处理 | ||
240 | + //[self showResultView]; | ||
241 | + | ||
242 | + | ||
243 | +} | ||
244 | +//工具类 弹出框 | ||
245 | +-(void)showAlertViewWithMsg:(NSString *)msg{ | ||
246 | + self.alertView.message=msg; | ||
247 | + [self.alertView show]; | ||
248 | +} | ||
249 | + | ||
250 | +// | ||
251 | +-(UIAlertView *)alertView{ | ||
252 | + if(!_alertView){ | ||
253 | + _alertView=[[UIAlertView alloc] initWithTitle:@"" message:@"" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; | ||
254 | + } | ||
255 | + return _alertView; | ||
256 | +} | ||
257 | + | ||
258 | + | ||
259 | + | ||
260 | +@end | ||
261 | + | ||
262 | + |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>CFBundleDevelopmentRegion</key> | ||
6 | + <string>en</string> | ||
7 | + <key>CFBundleExecutable</key> | ||
8 | + <string>$(EXECUTABLE_NAME)</string> | ||
9 | + <key>CFBundleIdentifier</key> | ||
10 | + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||
11 | + <key>CFBundleInfoDictionaryVersion</key> | ||
12 | + <string>6.0</string> | ||
13 | + <key>CFBundleName</key> | ||
14 | + <string>$(PRODUCT_NAME)</string> | ||
15 | + <key>CFBundlePackageType</key> | ||
16 | + <string>APPL</string> | ||
17 | + <key>CFBundleShortVersionString</key> | ||
18 | + <string>1.0</string> | ||
19 | + <key>CFBundleSignature</key> | ||
20 | + <string>????</string> | ||
21 | + <key>CFBundleURLTypes</key> | ||
22 | + <array> | ||
23 | + <dict> | ||
24 | + <key>CFBundleTypeRole</key> | ||
25 | + <string>Editor</string> | ||
26 | + <key>CFBundleURLName</key> | ||
27 | + <string>open_app</string> | ||
28 | + <key>CFBundleURLSchemes</key> | ||
29 | + <array> | ||
30 | + <string>xpcjjh</string> | ||
31 | + </array> | ||
32 | + </dict> | ||
33 | + </array> | ||
34 | + <key>CFBundleVersion</key> | ||
35 | + <string>1</string> | ||
36 | + <key>LSApplicationQueriesSchemes</key> | ||
37 | + <array> | ||
38 | + <string>weixin</string> | ||
39 | + </array> | ||
40 | + <key>LSRequiresIPhoneOS</key> | ||
41 | + <true/> | ||
42 | + <key>NSAppTransportSecurity</key> | ||
43 | + <dict> | ||
44 | + <key>NSAllowsArbitraryLoads</key> | ||
45 | + <true/> | ||
46 | + </dict> | ||
47 | + <key>NSPhotoLibraryUsageDescription</key> | ||
48 | + <string>获取相册</string> | ||
49 | + <key>UILaunchStoryboardName</key> | ||
50 | + <string>LaunchScreen</string> | ||
51 | + <key>UIMainStoryboardFile</key> | ||
52 | + <string>Main</string> | ||
53 | + <key>UIRequiredDeviceCapabilities</key> | ||
54 | + <array> | ||
55 | + <string>armv7</string> | ||
56 | + </array> | ||
57 | + <key>UISupportedInterfaceOrientations</key> | ||
58 | + <array> | ||
59 | + <string>UIInterfaceOrientationPortrait</string> | ||
60 | + </array> | ||
61 | +</dict> | ||
62 | +</plist> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>CFBundleURLTypes</key> | ||
6 | + <array> | ||
7 | + <dict> | ||
8 | + <key>CFBundleTypeRole</key> | ||
9 | + <string>Editor</string> | ||
10 | + <key>CFBundleURLName</key> | ||
11 | + <string>open_app</string> | ||
12 | + <key>CFBundleURLSchemes</key> | ||
13 | + <array> | ||
14 | + <string>xpcjjh</string> | ||
15 | + </array> | ||
16 | + </dict> | ||
17 | + </array> | ||
18 | + <key>LSApplicationQueriesSchemes</key> | ||
19 | + <array> | ||
20 | + <string>weixin</string> | ||
21 | + </array> | ||
22 | + <key>NSAppTransportSecurity</key> | ||
23 | + <dict> | ||
24 | + <key>NSAllowsArbitraryLoads</key> | ||
25 | + <true/> | ||
26 | + </dict> | ||
27 | + <key>NSPhotoLibraryUsageDescription</key> | ||
28 | + <string>获取相册</string> | ||
29 | + <key>UISupportedInterfaceOrientations</key> | ||
30 | + <array> | ||
31 | + <string>UIInterfaceOrientationPortrait</string> | ||
32 | + </array> | ||
33 | +</dict> | ||
34 | +</plist> |
1 | +/* | ||
2 | + * | | | | \ \ / / | | | | / _______| | ||
3 | + * | |____| | \ \/ / | |____| | / / | ||
4 | + * | |____| | \ / | |____| | | | _____ | ||
5 | + * | | | | / \ | | | | | | |____ | | ||
6 | + * | | | | / /\ \ | | | | \ \______| | | ||
7 | + * | | | | /_/ \_\ | | | | \_________| | ||
8 | + * | ||
9 | + * Copyright (c) 2016~ Shenzhen HXHG. All rights reserved. | ||
10 | + */ | ||
11 | + | ||
12 | +#import <Foundation/Foundation.h> | ||
13 | +#import <UIKit/UIKit.h> | ||
14 | +/** | ||
15 | + * | ||
16 | + * @abstract 事件对象共同父类 | ||
17 | + * | ||
18 | + * @discussion 所有的字符串属性长度不能超过256字节(包括extra的key和value) | ||
19 | + * | ||
20 | + */ | ||
21 | +@interface JANALYTICSEventObject : NSObject | ||
22 | + | ||
23 | +@property (nonatomic, strong, nonnull) NSDictionary<NSString *, NSString *>* extra; | ||
24 | + | ||
25 | +@end | ||
26 | + | ||
27 | +/** | ||
28 | + 登录事件对象 | ||
29 | + */ | ||
30 | +@interface JANALYTICSLoginEvent : JANALYTICSEventObject | ||
31 | + | ||
32 | +//登录方法,非空 | ||
33 | +@property (nonatomic, copy, nonnull) NSString* method; | ||
34 | +//登录是否成功,非空 | ||
35 | +@property (nonatomic, assign) BOOL success; | ||
36 | + | ||
37 | +@end | ||
38 | + | ||
39 | +/** | ||
40 | + 注册事件对象 | ||
41 | + */ | ||
42 | +@interface JANALYTICSRegisterEvent : JANALYTICSEventObject | ||
43 | + | ||
44 | +//注册方法,非空 | ||
45 | +@property (nonatomic, copy, nonnull) NSString* method; | ||
46 | +//注册是否成功,非空 | ||
47 | +@property (nonatomic, assign) BOOL success; | ||
48 | + | ||
49 | +@end | ||
50 | + | ||
51 | +typedef NS_ENUM(NSUInteger, JANALYTICSPurchaseCurrency) { | ||
52 | + //人民币 | ||
53 | + JANALYTICSCurrencyCNY, | ||
54 | + //美元 | ||
55 | + JANALYTICSCurrencyUSD | ||
56 | +}; | ||
57 | +/** | ||
58 | + 购买事件对象 | ||
59 | + */ | ||
60 | +@interface JANALYTICSPurchaseEvent : JANALYTICSEventObject | ||
61 | + | ||
62 | +//价格 非空 | ||
63 | +@property (nonatomic, assign) CGFloat price; | ||
64 | +//购买是否成功,非空 | ||
65 | +@property (nonatomic, assign) BOOL success; | ||
66 | +//物品ID | ||
67 | +@property (nonatomic, copy, nonnull) NSString* goodsID; | ||
68 | +//物品名称 | ||
69 | +@property (nonatomic, copy, nonnull) NSString* goodsName; | ||
70 | +//物品类型 | ||
71 | +@property (nonatomic, copy, nonnull) NSString* goodsType; | ||
72 | +//货币类型 默认CNY | ||
73 | +@property (nonatomic, assign) JANALYTICSPurchaseCurrency currency; | ||
74 | +//物品数量 | ||
75 | +@property (nonatomic, assign) NSInteger quantity; | ||
76 | + | ||
77 | +@end | ||
78 | + | ||
79 | +/** | ||
80 | + 内容浏览事件对象 | ||
81 | + */ | ||
82 | +@interface JANALYTICSBrowseEvent : JANALYTICSEventObject | ||
83 | + | ||
84 | +//内容名称,非空 | ||
85 | +@property (nonatomic, copy, nonnull) NSString* name; | ||
86 | +//内容ID | ||
87 | +@property (nonatomic, copy, nonnull) NSString* contentID; | ||
88 | +//内容类型 | ||
89 | +@property (nonatomic, copy, nonnull) NSString* type; | ||
90 | +//内容时长 | ||
91 | +@property (nonatomic, assign) CGFloat duration; | ||
92 | + | ||
93 | +@end | ||
94 | + | ||
95 | +/** | ||
96 | + 自定义计数事件对象 | ||
97 | + */ | ||
98 | +@interface JANALYTICSCountEvent : JANALYTICSEventObject | ||
99 | + | ||
100 | +//事件ID 非空 | ||
101 | +@property (nonatomic, copy, nonnull) NSString* eventID; | ||
102 | + | ||
103 | +@end | ||
104 | + | ||
105 | +/** | ||
106 | + 自定义计算事件对象 | ||
107 | + */ | ||
108 | +@interface JANALYTICSCalculateEvent : JANALYTICSEventObject | ||
109 | + | ||
110 | +//事件ID 非空 | ||
111 | +@property (nonatomic, copy, nonnull) NSString* eventID; | ||
112 | +//事件值 非空 | ||
113 | +@property (nonatomic, assign) CGFloat value; | ||
114 | + | ||
115 | +@end |
1 | +/* | ||
2 | + * | | | | \ \ / / | | | | / _______| | ||
3 | + * | |____| | \ \/ / | |____| | / / | ||
4 | + * | |____| | \ / | |____| | | | _____ | ||
5 | + * | | | | / \ | | | | | | |____ | | ||
6 | + * | | | | / /\ \ | | | | \ \______| | | ||
7 | + * | | | | /_/ \_\ | | | | \_________| | ||
8 | + * | ||
9 | + * Copyright (c) 2016~ Shenzhen HXHG. All rights reserved. | ||
10 | + */ | ||
11 | + | ||
12 | +#define JANALYTICS_VERSION_NUMBER 1.1.3 | ||
13 | + | ||
14 | +#import <Foundation/Foundation.h> | ||
15 | +#import "JANALYTICSEventObject.h" | ||
16 | + | ||
17 | +@interface JANALYTICSLaunchConfig : NSObject | ||
18 | + | ||
19 | +/* appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识. */ | ||
20 | +@property (nonatomic, copy) NSString *appKey; | ||
21 | +/* channel 发布渠道. 可选 */ | ||
22 | +@property (nonatomic, copy) NSString *channel; | ||
23 | +/* advertisingIdentifier 广告标识符(IDFA). 可选,IDFA能帮助您更准确的统计*/ | ||
24 | +@property (nonatomic, copy) NSString *advertisingId; | ||
25 | +/* isProduction 是否生产环境. 如果为开发状态,设置为NO; 如果为生产状态,应改为 YES.默认为NO */ | ||
26 | +@property (nonatomic, assign) BOOL isProduction; | ||
27 | + | ||
28 | +@end | ||
29 | + | ||
30 | +@class CLLocation; | ||
31 | + | ||
32 | +@interface JANALYTICSService : NSObject | ||
33 | + | ||
34 | +/*! | ||
35 | + * @abstract 启动SDK | ||
36 | + * | ||
37 | + * @param config SDK启动相关模型,必填 | ||
38 | + */ | ||
39 | ++ (void)setupWithConfig:(JANALYTICSLaunchConfig *)config; | ||
40 | + | ||
41 | +/*! | ||
42 | + * @abstract 开始记录页面停留 | ||
43 | + * | ||
44 | + * @param pageName 页面名称 | ||
45 | + */ | ||
46 | ++ (void)startLogPageView:(NSString *)pageName; | ||
47 | + | ||
48 | +/*! | ||
49 | + * @abstract 停止记录页面停留 | ||
50 | + * | ||
51 | + * @param pageName 页面 | ||
52 | + */ | ||
53 | ++ (void)stopLogPageView:(NSString *)pageName; | ||
54 | + | ||
55 | +/*! | ||
56 | + * @abstract 地理位置上报 | ||
57 | + * | ||
58 | + * @param latitude 纬度. | ||
59 | + * @param longitude 经度. | ||
60 | + * | ||
61 | + */ | ||
62 | ++ (void)setLatitude:(double)latitude longitude:(double)longitude; | ||
63 | + | ||
64 | +/*! | ||
65 | + * @abstract 地理位置上报 | ||
66 | + * | ||
67 | + * @param location 直接传递 CLLocation * 型的地理信息 | ||
68 | + * | ||
69 | + * @discussion 需要链接 CoreLocation.framework 并且 #import <CoreLocation/CoreLocation.h> | ||
70 | + */ | ||
71 | ++ (void)setLocation:(CLLocation *)location; | ||
72 | + | ||
73 | +/*! | ||
74 | + * @abstract 开启Crash日志收集 | ||
75 | + * | ||
76 | + * @discussion 默认是关闭状态. | ||
77 | + */ | ||
78 | ++ (void)crashLogON; | ||
79 | + | ||
80 | +/*! | ||
81 | + * @abstract 设置是否打印sdk产生的Debug级log信息, 默认为NO(不打印log) | ||
82 | + * | ||
83 | + * SDK 默认开启的日志级别为: Info. 只显示必要的信息, 不打印调试日志. | ||
84 | + * | ||
85 | + * 请在SDK启动后调用本接口,调用本接口可打开日志级别为: Debug, 打印调试日志. | ||
86 | + * 请在发布产品时改为NO,避免产生不必要的IO | ||
87 | + */ | ||
88 | ++ (void)setDebug:(BOOL)enable; | ||
89 | + | ||
90 | +/*!事件统计 | ||
91 | + * @param event 上报的事件模型 | ||
92 | + */ | ||
93 | ++ (void)eventRecord:(JANALYTICSEventObject *)event; | ||
94 | + | ||
95 | +@end | ||
96 | + |
1 | +// | ||
2 | +// AppDelegate.h | ||
3 | +// MGBSHudTest | ||
4 | +// | ||
5 | +// Created by megabes inc. on 2017/6/9. | ||
6 | +// Copyright © 2017年 megabes inc. All rights reserved. | ||
7 | +// | ||
8 | +// WebSite : http://www.megabes.com/ | ||
9 | +// E-mail : megabes@126.com | ||
10 | + | ||
11 | +#import <Foundation/Foundation.h> | ||
12 | +#import <UIKit/UIKit.h> | ||
13 | + | ||
14 | +// backgroundStyle : Dark, Blur | ||
15 | +typedef NS_ENUM (NSInteger, MGBSHUDBackgourdStyle){ | ||
16 | + MGBSHUDBackgourdStyleDark = 0, | ||
17 | + MGBSHUDBackgourdStyleBlur | ||
18 | +}; | ||
19 | + | ||
20 | +// Position : center, bottom | ||
21 | +typedef NS_ENUM (NSInteger, MGBSHUDPosition){ | ||
22 | + MGBSHUDPositionCenter = 0, | ||
23 | + MGBSHUDPositionBottom | ||
24 | +}; | ||
25 | + | ||
26 | +// MGBSHUDPopstyle : fade, transform | ||
27 | +typedef NS_ENUM (NSInteger, MGBSHUDPopstyle){ | ||
28 | + MGBSHUDPopstyleNormal = 0, // 淡入淡出 | ||
29 | + MGBSHUDPopstyleTransform // 变形动画 | ||
30 | +}; | ||
31 | + | ||
32 | +// MGBSHUDImgtype | ||
33 | +typedef NS_ENUM (NSInteger, MGBSHUDImgtype){ | ||
34 | + MGBSHUDImgtypeSpinCircle = 0, | ||
35 | + MGBSHUDImgtypeSuccess, | ||
36 | + MGBSHUDImgtypeFail, | ||
37 | + MGBSHUDImgtypeWarning, | ||
38 | + MGBSHUDImgtypeCustom // 可以定制自己的IMG | ||
39 | +}; | ||
40 | + | ||
41 | +@interface MGBSHUD : NSObject | ||
42 | + | ||
43 | +/* | ||
44 | + * 方法:展示一个text的HUD,可以定制 | ||
45 | + * fontsize : | ||
46 | + * uiEnabled : uiUserEnabled | ||
47 | + * delay : TIME LAST | ||
48 | + * backgroudStyle : | ||
49 | + * position : | ||
50 | + * popstyle : animation style | ||
51 | + */ | ||
52 | ++(void)showOnlyText:(NSString*)text fontSize:(CGFloat)size uiEnabled:(bool)uiEnabled delay:(NSTimeInterval)delay backgroudStyle:(MGBSHUDBackgourdStyle)backgroundStyle position:(MGBSHUDPosition)position popstyle:(MGBSHUDPopstyle)popStyle identifier:(NSString*)identifier; | ||
53 | + | ||
54 | +/* | ||
55 | + * 方法:展示一个text的HUD,可以定制 | ||
56 | + * fontsize : | ||
57 | + * uiEnabled : uiUserEnabled | ||
58 | + * delay : TIME LAST | ||
59 | + * backgroudStyle : | ||
60 | + * position : | ||
61 | + * popstyle : animation style | ||
62 | + * imgType : | ||
63 | + * ifCircleColor : 可以定制转圈的颜色 | ||
64 | + */ | ||
65 | ++(void)showImgText:(NSString*)text fontSize:(CGFloat)size uiEnabled:(bool)uiEnabled delay:(NSTimeInterval)delay backgroudStyle:(MGBSHUDBackgourdStyle)backgroundStyle position:(MGBSHUDPosition)position popstyle:(MGBSHUDPopstyle)popStyle imgType:(MGBSHUDImgtype)imgType ifCircleColor:(UIColor*)circleColor ifCustomImg:(UIImage*)img identifier:(NSString*)identifier; | ||
66 | + | ||
67 | ++(void)showSqureHUDbyText:(NSString*)text fontSize:(CGFloat)size uiEnabled:(bool)uiEnabled delay:(NSTimeInterval)delay backgroudStyle:(MGBSHUDBackgourdStyle)backgroundStyle popstyle:(MGBSHUDPopstyle)popStyle imgType:(MGBSHUDImgtype)imgType ifCircleColor:(UIColor*)circleColor ifCustomImg:(UIImage*)img identifier:(NSString*)identifier; | ||
68 | + | ||
69 | ++(void)dismissHUDWithIdentifier:(NSString*)identifier; | ||
70 | + | ||
71 | +@end |

4.74 KB

5.38 KB
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | +<plist version="1.0"> | ||
4 | +<dict> | ||
5 | + <key>files</key> | ||
6 | + <dict> | ||
7 | + <key>Info.plist</key> | ||
8 | + <data> | ||
9 | + wScrrUfKAuSV8BljEoqFpP6iqrU= | ||
10 | + </data> | ||
11 | + <key>MGBSHUDError.png</key> | ||
12 | + <data> | ||
13 | + NhvK1HHcH7J5dfMgKRTxxyNpaEs= | ||
14 | + </data> | ||
15 | + <key>MGBSHUDImgTextView.nib</key> | ||
16 | + <data> | ||
17 | + idgvxYiRc3HBgCYpmTbP8FpLkHU= | ||
18 | + </data> | ||
19 | + <key>MGBSHUDSqure.nib</key> | ||
20 | + <data> | ||
21 | + Pp7rmTFAB4zJ+SK6FWRWyunYe24= | ||
22 | + </data> | ||
23 | + <key>MGBSHUDSuccess.png</key> | ||
24 | + <data> | ||
25 | + E/xkvJJwc9apKW1YmAVl0cxQt/s= | ||
26 | + </data> | ||
27 | + <key>MGBSHUDTextView.nib</key> | ||
28 | + <data> | ||
29 | + mhAV81Crhf5G+y7mprE9pLpMMjg= | ||
30 | + </data> | ||
31 | + <key>MGBSHUDWarning.png</key> | ||
32 | + <data> | ||
33 | + CzPYvks9WjGZc3qpVytoUa1Bc/U= | ||
34 | + </data> | ||
35 | + </dict> | ||
36 | + <key>files2</key> | ||
37 | + <dict> | ||
38 | + <key>MGBSHUDError.png</key> | ||
39 | + <dict> | ||
40 | + <key>hash</key> | ||
41 | + <data> | ||
42 | + NhvK1HHcH7J5dfMgKRTxxyNpaEs= | ||
43 | + </data> | ||
44 | + <key>hash2</key> | ||
45 | + <data> | ||
46 | + 7UbfTxg5DAiv0cQTVeJPMN0gEblV18NE3kGiWQZsgMw= | ||
47 | + </data> | ||
48 | + </dict> | ||
49 | + <key>MGBSHUDImgTextView.nib</key> | ||
50 | + <dict> | ||
51 | + <key>hash</key> | ||
52 | + <data> | ||
53 | + idgvxYiRc3HBgCYpmTbP8FpLkHU= | ||
54 | + </data> | ||
55 | + <key>hash2</key> | ||
56 | + <data> | ||
57 | + cfa+b2yWyFCebKqjQNYO1a6HPspGhdlyoC4UGrbJAlQ= | ||
58 | + </data> | ||
59 | + </dict> | ||
60 | + <key>MGBSHUDSqure.nib</key> | ||
61 | + <dict> | ||
62 | + <key>hash</key> | ||
63 | + <data> | ||
64 | + Pp7rmTFAB4zJ+SK6FWRWyunYe24= | ||
65 | + </data> | ||
66 | + <key>hash2</key> | ||
67 | + <data> | ||
68 | + 4QqrbfCiY+G7nbsx0bzxLs2NEEN0EJvsAl7sW9iNJdo= | ||
69 | + </data> | ||
70 | + </dict> | ||
71 | + <key>MGBSHUDSuccess.png</key> | ||
72 | + <dict> | ||
73 | + <key>hash</key> | ||
74 | + <data> | ||
75 | + E/xkvJJwc9apKW1YmAVl0cxQt/s= | ||
76 | + </data> | ||
77 | + <key>hash2</key> | ||
78 | + <data> | ||
79 | + rz/fB39AJBIDV22KT1E0F5Nr5xnOV1TWNXgy54kGo3o= | ||
80 | + </data> | ||
81 | + </dict> | ||
82 | + <key>MGBSHUDTextView.nib</key> | ||
83 | + <dict> | ||
84 | + <key>hash</key> | ||
85 | + <data> | ||
86 | + mhAV81Crhf5G+y7mprE9pLpMMjg= | ||
87 | + </data> | ||
88 | + <key>hash2</key> | ||
89 | + <data> | ||
90 | + FBM/OlDthxMFGCKogid0YCUHjnIYOPTYTnOW4F6DyeA= | ||
91 | + </data> | ||
92 | + </dict> | ||
93 | + <key>MGBSHUDWarning.png</key> | ||
94 | + <dict> | ||
95 | + <key>hash</key> | ||
96 | + <data> | ||
97 | + CzPYvks9WjGZc3qpVytoUa1Bc/U= | ||
98 | + </data> | ||
99 | + <key>hash2</key> | ||
100 | + <data> | ||
101 | + +NZDELsYe8wiF7c/qOMWIDzcNHoDaonVzw4Ngcbshgo= | ||
102 | + </data> | ||
103 | + </dict> | ||
104 | + </dict> | ||
105 | + <key>rules</key> | ||
106 | + <dict> | ||
107 | + <key>^</key> | ||
108 | + <true/> | ||
109 | + <key>^.*\.lproj/</key> | ||
110 | + <dict> | ||
111 | + <key>optional</key> | ||
112 | + <true/> | ||
113 | + <key>weight</key> | ||
114 | + <real>1000</real> | ||
115 | + </dict> | ||
116 | + <key>^.*\.lproj/locversion.plist$</key> | ||
117 | + <dict> | ||
118 | + <key>omit</key> | ||
119 | + <true/> | ||
120 | + <key>weight</key> | ||
121 | + <real>1100</real> | ||
122 | + </dict> | ||
123 | + <key>^Base\.lproj/</key> | ||
124 | + <dict> | ||
125 | + <key>weight</key> | ||
126 | + <real>1010</real> | ||
127 | + </dict> | ||
128 | + <key>^version.plist$</key> | ||
129 | + <true/> | ||
130 | + </dict> | ||
131 | + <key>rules2</key> | ||
132 | + <dict> | ||
133 | + <key>.*\.dSYM($|/)</key> | ||
134 | + <dict> | ||
135 | + <key>weight</key> | ||
136 | + <real>11</real> | ||
137 | + </dict> | ||
138 | + <key>^</key> | ||
139 | + <dict> | ||
140 | + <key>weight</key> | ||
141 | + <real>20</real> | ||
142 | + </dict> | ||
143 | + <key>^(.*/)?\.DS_Store$</key> | ||
144 | + <dict> | ||
145 | + <key>omit</key> | ||
146 | + <true/> | ||
147 | + <key>weight</key> | ||
148 | + <real>2000</real> | ||
149 | + </dict> | ||
150 | + <key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key> | ||
151 | + <dict> | ||
152 | + <key>nested</key> | ||
153 | + <true/> | ||
154 | + <key>weight</key> | ||
155 | + <real>10</real> | ||
156 | + </dict> | ||
157 | + <key>^.*</key> | ||
158 | + <true/> | ||
159 | + <key>^.*\.lproj/</key> | ||
160 | + <dict> | ||
161 | + <key>optional</key> | ||
162 | + <true/> | ||
163 | + <key>weight</key> | ||
164 | + <real>1000</real> | ||
165 | + </dict> | ||
166 | + <key>^.*\.lproj/locversion.plist$</key> | ||
167 | + <dict> | ||
168 | + <key>omit</key> | ||
169 | + <true/> | ||
170 | + <key>weight</key> | ||
171 | + <real>1100</real> | ||
172 | + </dict> | ||
173 | + <key>^Base\.lproj/</key> | ||
174 | + <dict> | ||
175 | + <key>weight</key> | ||
176 | + <real>1010</real> | ||
177 | + </dict> | ||
178 | + <key>^Info\.plist$</key> | ||
179 | + <dict> | ||
180 | + <key>omit</key> | ||
181 | + <true/> | ||
182 | + <key>weight</key> | ||
183 | + <real>20</real> | ||
184 | + </dict> | ||
185 | + <key>^PkgInfo$</key> | ||
186 | + <dict> | ||
187 | + <key>omit</key> | ||
188 | + <true/> | ||
189 | + <key>weight</key> | ||
190 | + <real>20</real> | ||
191 | + </dict> | ||
192 | + <key>^[^/]+$</key> | ||
193 | + <dict> | ||
194 | + <key>nested</key> | ||
195 | + <true/> | ||
196 | + <key>weight</key> | ||
197 | + <real>10</real> | ||
198 | + </dict> | ||
199 | + <key>^embedded\.provisionprofile$</key> | ||
200 | + <dict> | ||
201 | + <key>weight</key> | ||
202 | + <real>20</real> | ||
203 | + </dict> | ||
204 | + <key>^version\.plist$</key> | ||
205 | + <dict> | ||
206 | + <key>weight</key> | ||
207 | + <real>20</real> | ||
208 | + </dict> | ||
209 | + </dict> | ||
210 | +</dict> | ||
211 | +</plist> |
1 | +{ | ||
2 | + "images" : [ | ||
3 | + { | ||
4 | + "idiom" : "universal", | ||
5 | + "filename" : "center_white.png", | ||
6 | + "scale" : "1x" | ||
7 | + }, | ||
8 | + { | ||
9 | + "idiom" : "universal", | ||
10 | + "scale" : "2x" | ||
11 | + }, | ||
12 | + { | ||
13 | + "idiom" : "universal", | ||
14 | + "scale" : "3x" | ||
15 | + } | ||
16 | + ], | ||
17 | + "info" : { | ||
18 | + "version" : 1, | ||
19 | + "author" : "xcode" | ||
20 | + } | ||
21 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |

13.9 KB
1 | +// | ||
2 | +// XYCommon.h | ||
3 | +// PieChart | ||
4 | +// | ||
5 | +// Created by GMY on 17/6/1. | ||
6 | +// Copyright © 2017年 com.gmy. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <Foundation/Foundation.h> | ||
10 | +#import <UIKit/UIKit.h> | ||
11 | + | ||
12 | +#define ScreenWidth [UIScreen mainScreen].bounds.size.width //屏幕宽度 | ||
13 | +#define ScreenHeight [UIScreen mainScreen].bounds.size.height //屏幕高度 | ||
14 | + | ||
15 | +/* 定义RGBCOLOR*/ | ||
16 | +#define ColorRGBA(r, g, b, a) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:(a)] | ||
17 | + | ||
18 | +@interface XYCommon : NSObject | ||
19 | + | ||
20 | +UIKIT_EXTERN CGFloat const CenterTitleWidth; | ||
21 | + | ||
22 | +UIKIT_EXTERN CGFloat const AmountWidth; | ||
23 | + | ||
24 | +UIKIT_EXTERN CGFloat const AmountHeight; | ||
25 | + | ||
26 | +@end |
1 | +// | ||
2 | +// XYCommon.m | ||
3 | +// PieChart | ||
4 | +// | ||
5 | +// Created by GMY on 17/6/1. | ||
6 | +// Copyright © 2017年 com.gmy. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import "XYCommon.h" | ||
10 | + | ||
11 | +@implementation XYCommon | ||
12 | + | ||
13 | +CGFloat const CenterTitleWidth = 70; | ||
14 | + | ||
15 | +CGFloat const AmountWidth = 70; | ||
16 | + | ||
17 | +CGFloat const AmountHeight = 22; | ||
18 | + | ||
19 | +@end |
1 | +// | ||
2 | +// XYPieChartView.h | ||
3 | +// PieChart | ||
4 | +// | ||
5 | +// Created by GMY on 17/6/1. | ||
6 | +// Copyright © 2017年 com.gmy. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <UIKit/UIKit.h> | ||
10 | + | ||
11 | +@class XYPieChartView; | ||
12 | +@protocol PieChartDelegate <NSObject> | ||
13 | + | ||
14 | +@required | ||
15 | +/** | ||
16 | + * 选中扇形的回调数据 | ||
17 | + */ | ||
18 | +- (void)selectedFinish:(XYPieChartView *)pieChartView index:(NSInteger)index selectedType:(NSDictionary *)selectedType; | ||
19 | + | ||
20 | +@optional | ||
21 | +/** | ||
22 | + * 点击中心按钮的回调 | ||
23 | + */ | ||
24 | +- (void)onCenterClick:(XYPieChartView *)PieChartView; | ||
25 | + | ||
26 | +@end | ||
27 | + | ||
28 | +@interface XYPieChartView : UIView | ||
29 | + | ||
30 | +@property (nonatomic, assign) id<PieChartDelegate> delegate; | ||
31 | + | ||
32 | +/** | ||
33 | + * param:{frame:位置, AssetTypeArray:数据的数组, PercentArray:百分比数值 colorArr:颜色的数组} | ||
34 | + */ | ||
35 | +- (id)initWithFrame:(CGRect)frame withPieChartTypeArray:(NSMutableArray *)pieChartTypeArray withPercentArray:(NSMutableArray *)percentArray withColorArray:(NSMutableArray *)colorArray; | ||
36 | + | ||
37 | +/** | ||
38 | + * 总标题信息 | ||
39 | + */ | ||
40 | +- (void)setAmountText:(NSString *)text; | ||
41 | + | ||
42 | +/** | ||
43 | + * 总金额 | ||
44 | + */ | ||
45 | +- (void)setTitleText:(NSMutableAttributedString *)text; | ||
46 | + | ||
47 | +/** | ||
48 | + * 刷新chart | ||
49 | + */ | ||
50 | +- (void)reloadChart; | ||
51 | + | ||
52 | +/** | ||
53 | + * 校验小于百分比时,另外的展现形式 | ||
54 | + */ | ||
55 | +- (void)setCheckLessThanPercent:(CGFloat)lessPerent; | ||
56 | +@end |
1 | +// | ||
2 | +// XYPieChartView.m | ||
3 | +// PieChart | ||
4 | +// | ||
5 | +// Created by GMY on 17/6/1. | ||
6 | +// Copyright © 2017年 com.gmy. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import "XYPieChartView.h" | ||
10 | +#import "XYRotatedView.h" | ||
11 | +#import "XYCommon.h" | ||
12 | + | ||
13 | +@interface XYPieChartView()<RotatedViewDelegate> | ||
14 | + | ||
15 | +// 旋转视图 | ||
16 | +@property (nonatomic,strong)XYRotatedView *rotatedView; | ||
17 | + | ||
18 | +// 中心圆的按钮 | ||
19 | +@property (nonatomic,strong) UIButton *centerButton; | ||
20 | + | ||
21 | +// 中心圆数值(总金额) | ||
22 | +@property (nonatomic,strong) UILabel *centerAmount; | ||
23 | + | ||
24 | +// 中心圆标题 | ||
25 | +@property (nonatomic, strong) UILabel *centerTitle; | ||
26 | + | ||
27 | +// 数据数组 | ||
28 | +@property (nonatomic, strong) NSMutableArray *selectedTypeList; | ||
29 | + | ||
30 | +@end | ||
31 | + | ||
32 | +@implementation XYPieChartView | ||
33 | + | ||
34 | +/** | ||
35 | + * | ||
36 | + * 初始化方法 | ||
37 | + * param:{frame:位置, pieChartTypeArray:数据的数组, PercentArray:百分比数值 colorArr:颜色的数组} | ||
38 | + * | ||
39 | + */ | ||
40 | +- (id)initWithFrame:(CGRect)frame withPieChartTypeArray:(NSMutableArray *)pieChartTypeArray withPercentArray:(NSMutableArray *)percentArray withColorArray:(NSMutableArray *)colorArray | ||
41 | +{ | ||
42 | + | ||
43 | + if (self = [super initWithFrame:frame]) { | ||
44 | + | ||
45 | + self.selectedTypeList = pieChartTypeArray; | ||
46 | + | ||
47 | + // 初始化RotatedView | ||
48 | + self.rotatedView = [[XYRotatedView alloc]initWithFrame:self.bounds]; | ||
49 | + | ||
50 | + // 给RotatedView 百分比数组赋值 | ||
51 | + self.rotatedView.percentArray = percentArray; | ||
52 | + | ||
53 | + // 给RotatedView 颜色数组赋值 | ||
54 | + self.rotatedView.mColorArray = colorArray; | ||
55 | + | ||
56 | + // 接收代理方法 | ||
57 | + self.rotatedView.delegate = self; | ||
58 | + | ||
59 | + // 添加RotatedView | ||
60 | + [self addSubview:self.rotatedView]; | ||
61 | + | ||
62 | + // 初始化中心圆按钮 | ||
63 | + self.centerButton = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
64 | + | ||
65 | + // 移除点击事件 | ||
66 | + [self.centerButton removeTarget:self action:nil forControlEvents:UIControlEventTouchUpInside]; | ||
67 | + | ||
68 | + // 是否接收事件 | ||
69 | + self.centerButton.userInteractionEnabled = YES; | ||
70 | + | ||
71 | + // 设置按钮点击事件 | ||
72 | + [self.centerButton addTarget:self action:@selector(changeInOut:) forControlEvents:UIControlEventTouchUpInside]; | ||
73 | + | ||
74 | + // 中心圆图片 | ||
75 | + UIImage *centerImage = [UIImage imageNamed:@"center_white"]; | ||
76 | + | ||
77 | + // 图片尺寸 | ||
78 | + CGSize centerImageSize = centerImage.size; | ||
79 | + | ||
80 | + if (centerImageSize.height == 0 && centerImageSize.width == 0) { | ||
81 | + | ||
82 | + // 如果图片尺寸为0,默认赋值width = 80, Height = 80 | ||
83 | + centerImageSize = CGSizeMake(80, 80); | ||
84 | + } | ||
85 | + | ||
86 | + // 设置按钮普通状态下的背景图片 | ||
87 | + [self.centerButton setBackgroundImage:centerImage forState:UIControlStateNormal]; | ||
88 | + | ||
89 | + // 设置按钮高亮状态下的背景图片 | ||
90 | + [self.centerButton setBackgroundImage:centerImage forState:UIControlStateHighlighted]; | ||
91 | + | ||
92 | + // 设置按钮位置、尺寸 (frame) | ||
93 | + self.centerButton.frame = CGRectMake((frame.size.width - centerImageSize.width/2)/2, (frame.size.height - centerImageSize.height/2)/2, centerImageSize.width/2, centerImageSize.height/2); | ||
94 | + | ||
95 | + [self.centerButton.layer setMasksToBounds:YES]; | ||
96 | + | ||
97 | + // 将按钮设置成圆形 | ||
98 | + [self.centerButton.layer setCornerRadius:self.centerButton.frame.size.width/2]; | ||
99 | + | ||
100 | + | ||
101 | + /** 中心圆上展示的标题和总金额 **/ | ||
102 | + | ||
103 | + // 标题宽 | ||
104 | + CGFloat centerTitleWidth = CenterTitleWidth; | ||
105 | + | ||
106 | + // 标题高 | ||
107 | + CGFloat centerTitleHeight = CenterTitleWidth; | ||
108 | + | ||
109 | + // 设置标题位置 | ||
110 | + self.centerTitle = [[UILabel alloc]initWithFrame:CGRectMake((centerImageSize.width/2 - centerTitleWidth)/2, (centerImageSize.height/2 - 75)/2, centerTitleWidth, centerTitleHeight)]; | ||
111 | + | ||
112 | + // 标题背景色 | ||
113 | + self.centerTitle.backgroundColor = [UIColor clearColor]; | ||
114 | + | ||
115 | + // 字体居中 | ||
116 | + self.centerTitle.textAlignment = NSTextAlignmentCenter; | ||
117 | + | ||
118 | + // 字体大小 | ||
119 | + self.centerTitle.font = [UIFont systemFontOfSize:16]; | ||
120 | + | ||
121 | + self.centerTitle.numberOfLines = 2; | ||
122 | + | ||
123 | + // 字体颜色 | ||
124 | + self.centerTitle.textColor = [UIColor blackColor]; | ||
125 | + | ||
126 | + // 添加标题 | ||
127 | + [self.centerButton addSubview:self.centerTitle]; | ||
128 | + | ||
129 | + /** 总金额 **/ | ||
130 | + | ||
131 | + // 金额宽度 | ||
132 | + CGFloat amountWidth = AmountWidth; | ||
133 | + | ||
134 | + // 金额宽度 | ||
135 | + CGFloat amountHeight = AmountHeight; | ||
136 | + | ||
137 | + // 初始化金额Label 设置位置、大小 | ||
138 | + self.centerAmount = [[UILabel alloc]initWithFrame:CGRectMake((centerImageSize.width/2 - amountWidth)/2, 53, amountWidth, amountHeight)]; | ||
139 | + | ||
140 | + // 金额背景色 | ||
141 | + self.centerAmount.backgroundColor = [UIColor clearColor]; | ||
142 | + | ||
143 | + // 字体居中 | ||
144 | + self.centerAmount.textAlignment = NSTextAlignmentCenter; | ||
145 | + | ||
146 | + // 字体大小 | ||
147 | + self.centerAmount.font = [UIFont boldSystemFontOfSize:21]; | ||
148 | + | ||
149 | + // 字体颜色 | ||
150 | + self.centerAmount.textColor = [UIColor blackColor]; | ||
151 | + | ||
152 | + // 字体大小宽度自适应 | ||
153 | + [self.centerAmount setAdjustsFontSizeToFitWidth:YES]; | ||
154 | + | ||
155 | + // 添加金额Label | ||
156 | + [self.centerButton addSubview:self.centerAmount]; | ||
157 | + | ||
158 | + // 添加中心圆的按钮 | ||
159 | + [self addSubview:self.centerButton]; | ||
160 | + | ||
161 | + self.backgroundColor = [UIColor clearColor]; | ||
162 | + } | ||
163 | + return self; | ||
164 | +} | ||
165 | + | ||
166 | +/** | ||
167 | + * 按钮点击范围的方法 | ||
168 | + */ | ||
169 | +- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { | ||
170 | + | ||
171 | + //首先调用父类的方法确定点击的区域确实在按钮的区域中 | ||
172 | + BOOL res = [super pointInside:point withEvent:event]; | ||
173 | + if (res) { | ||
174 | + //绘制一个圆形path | ||
175 | + UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:self.centerButton.frame]; | ||
176 | + if ([path containsPoint:point]) { | ||
177 | + //如果在path区域内,可以接收交互事件,从而截获父视图的点击事件 | ||
178 | + self.centerButton.userInteractionEnabled = YES; | ||
179 | + return YES; | ||
180 | + | ||
181 | + } else { | ||
182 | + | ||
183 | + //如果不在path区域内,不可以接收交互事件,从而将事件传给父视图接收 | ||
184 | + self.centerButton.userInteractionEnabled = NO; | ||
185 | + return YES; | ||
186 | + } | ||
187 | + | ||
188 | + } | ||
189 | + return NO; | ||
190 | +} | ||
191 | +/** | ||
192 | + * 中心圆按钮的点击事件 | ||
193 | + */ | ||
194 | +- (void)changeInOut:(id)sender { | ||
195 | + // 触发点击回调方法 | ||
196 | + if ([self.delegate respondsToSelector:@selector(onCenterClick:)]) { | ||
197 | + [self.delegate onCenterClick:self]; | ||
198 | + } | ||
199 | +} | ||
200 | + | ||
201 | +/** | ||
202 | + * 设置标中心圆标题 | ||
203 | + */ | ||
204 | +- (void)setTitleText:(NSMutableAttributedString *)text { | ||
205 | + [self.centerTitle setAttributedText:text]; | ||
206 | +} | ||
207 | + | ||
208 | +/** | ||
209 | + * 设置标中心圆金额 | ||
210 | + */ | ||
211 | +- (void)setAmountText:(NSString *)text { | ||
212 | + [self.centerAmount setText:text]; | ||
213 | +} | ||
214 | + | ||
215 | +- (void)setCheckLessThanPercent:(CGFloat)lessPerent { | ||
216 | + | ||
217 | + [self.rotatedView lessThanPercent:lessPerent]; | ||
218 | +} | ||
219 | +/** | ||
220 | + * 刷新PiaChart视图 | ||
221 | + */ | ||
222 | +- (void)reloadChart { | ||
223 | + [self.rotatedView reloadPie]; | ||
224 | +} | ||
225 | + | ||
226 | +/** | ||
227 | + * RotatedView 选中视图的delegate方法 | ||
228 | + */ | ||
229 | +- (void)selectedFinish:(XYRotatedView *)rotatedView index:(NSInteger)index percent:(float)per { | ||
230 | + // 触发本视图的delegate方法 | ||
231 | + if ([self.delegate respondsToSelector:@selector(selectedFinish:index:selectedType: )]) { | ||
232 | + | ||
233 | + [self.delegate selectedFinish:self index:index selectedType:self.selectedTypeList[index]]; | ||
234 | + } | ||
235 | + | ||
236 | +} | ||
237 | + | ||
238 | +@end |
1 | +// | ||
2 | +// XYRenderView.h | ||
3 | +// PieChart | ||
4 | +// | ||
5 | +// Created by GMY on 17/6/1. | ||
6 | +// Copyright © 2017年 com.gmy. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <UIKit/UIKit.h> | ||
10 | + | ||
11 | +@class XYRenderView; | ||
12 | + | ||
13 | +@protocol RenderViewDataSource <NSObject> | ||
14 | + | ||
15 | +@required | ||
16 | + | ||
17 | +// 数据源方法 饼图共有几个区域 | ||
18 | +- (NSUInteger)numberOfSlicesInPieChart:(XYRenderView *)pieChart; | ||
19 | + | ||
20 | +// 选中的区域索引 | ||
21 | +- (CGFloat)pieChart:(XYRenderView *)pieChart valueForSliceAtIndex:(NSUInteger)index; | ||
22 | + | ||
23 | +@optional | ||
24 | +// 选中的区域颜色 | ||
25 | +- (UIColor *)pieChart:(XYRenderView *)pieChart colorForSliceAtIndex:(NSUInteger)index; | ||
26 | + | ||
27 | +@end | ||
28 | + | ||
29 | +@protocol RenderViewtDelegate <NSObject> | ||
30 | + | ||
31 | +@optional | ||
32 | + | ||
33 | +// will Select | ||
34 | +- (void)pieChart:(XYRenderView *)pieChart willSelectSliceAtIndex:(NSUInteger)index; | ||
35 | + | ||
36 | +// did Select | ||
37 | +- (void)pieChart:(XYRenderView *)pieChart didSelectSliceAtIndex:(NSUInteger)index; | ||
38 | + | ||
39 | +// will Deselect | ||
40 | +- (void)pieChart:(XYRenderView *)pieChart willDeselectSliceAtIndex:(NSUInteger)index; | ||
41 | + | ||
42 | +// did Deselect | ||
43 | +- (void)pieChart:(XYRenderView *)pieChart didDeselectSliceAtIndex:(NSUInteger)index; | ||
44 | + | ||
45 | +// 动画结束 | ||
46 | +- (void)animateFinish:(XYRenderView *)pieChart; | ||
47 | + | ||
48 | +@end | ||
49 | + | ||
50 | +@interface XYRenderView : UIView | ||
51 | + | ||
52 | +@property(nonatomic, weak) id<RenderViewDataSource> dataSource; | ||
53 | + | ||
54 | +@property(nonatomic, weak) id<RenderViewtDelegate> delegate; | ||
55 | + | ||
56 | +@property(nonatomic, assign) CGFloat startPieAngle; | ||
57 | + | ||
58 | +@property(nonatomic, assign) CGFloat animationSpeed; | ||
59 | + | ||
60 | +@property(nonatomic, assign) CGPoint pieCenter; | ||
61 | + | ||
62 | +@property(nonatomic, assign) CGFloat pieRadius; | ||
63 | + | ||
64 | +@property(nonatomic, assign) BOOL showLabel; | ||
65 | + | ||
66 | +@property(nonatomic, strong) UIFont *labelFont; | ||
67 | + | ||
68 | +@property(nonatomic, assign) CGFloat labelRadius; | ||
69 | + | ||
70 | +@property(nonatomic, assign) CGFloat selectedSliceStroke; | ||
71 | + | ||
72 | +@property(nonatomic, assign) CGFloat selectedSliceOffsetRadius; | ||
73 | + | ||
74 | +@property(nonatomic, assign) BOOL showPercentage; | ||
75 | + | ||
76 | +@property (strong, nonatomic) NSMutableArray *textLayerArray; | ||
77 | + | ||
78 | +@property (nonatomic, assign) CGFloat textAngle; | ||
79 | + | ||
80 | +@property (nonatomic, assign) CGFloat textrelativeTheta; | ||
81 | + | ||
82 | +@property (nonatomic, strong) CATextLayer *textLayer; | ||
83 | + | ||
84 | +@property (nonatomic, strong) CALayer *lineLayer; | ||
85 | + | ||
86 | +@property (nonatomic, assign) CGFloat checkLessPercent; | ||
87 | + | ||
88 | +- (id)initWithFrame:(CGRect)frame Center:(CGPoint)center Radius:(CGFloat)radius; | ||
89 | + | ||
90 | +- (void)reloadData; | ||
91 | + | ||
92 | +- (void)setPieBackgroundColor:(UIColor *)color; | ||
93 | + | ||
94 | +- (void)pieSelected:(NSInteger)selIndex; | ||
95 | + | ||
96 | +- (void)checkLessPercent:(CGFloat)lessPercent; | ||
97 | +@end |
1 | +// | ||
2 | +// XYRenderView.m | ||
3 | +// PieChart | ||
4 | +// | ||
5 | +// Created by GMY on 17/6/1. | ||
6 | +// Copyright © 2017年 com.gmy. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import "XYRenderView.h" | ||
10 | +#import <QuartzCore/QuartzCore.h> | ||
11 | +#import "XYCommon.h" | ||
12 | + | ||
13 | +@interface SliceLayer : CAShapeLayer | ||
14 | + | ||
15 | +@property (nonatomic, assign) CGFloat value; | ||
16 | + | ||
17 | +@property (nonatomic, assign) CGFloat percentage; | ||
18 | + | ||
19 | +@property (nonatomic, assign) double startAngle; | ||
20 | + | ||
21 | +@property (nonatomic, assign) double endAngle; | ||
22 | + | ||
23 | +@property (nonatomic, assign) BOOL isSelected; | ||
24 | + | ||
25 | +- (void)createArcAnimationForKey:(NSString *)key fromValue:(NSNumber *)from toValue:(NSNumber *)to Delegate:(id)delegate; | ||
26 | + | ||
27 | +@end | ||
28 | + | ||
29 | +@implementation SliceLayer | ||
30 | + | ||
31 | +- (NSString*)description { | ||
32 | + return @""; | ||
33 | +} | ||
34 | + | ||
35 | ++ (BOOL)needsDisplayForKey:(NSString *)key { | ||
36 | + if ([key isEqualToString:@"startAngle"] || [key isEqualToString:@"endAngle"]) { | ||
37 | + return YES; | ||
38 | + } | ||
39 | + else { | ||
40 | + return [super needsDisplayForKey:key]; | ||
41 | + } | ||
42 | +} | ||
43 | + | ||
44 | +- (id)initWithLayer:(id)layer { | ||
45 | + if (self = [super initWithLayer:layer]) | ||
46 | + { | ||
47 | + if ([layer isKindOfClass:[SliceLayer class]]) { | ||
48 | + self.startAngle = [(SliceLayer *)layer startAngle]; | ||
49 | + self.endAngle = [(SliceLayer *)layer endAngle]; | ||
50 | + } | ||
51 | + } | ||
52 | + return self; | ||
53 | +} | ||
54 | + | ||
55 | +- (void)createArcAnimationForKey:(NSString *)key fromValue:(NSNumber *)from toValue:(NSNumber *)to Delegate:(id)delegate { | ||
56 | + CABasicAnimation *arcAnimation = [CABasicAnimation animationWithKeyPath:key]; | ||
57 | + | ||
58 | + NSNumber *currentAngle = [[self presentationLayer] valueForKey:key]; | ||
59 | + | ||
60 | + if(!currentAngle) currentAngle = from; | ||
61 | + | ||
62 | + [arcAnimation setFromValue:currentAngle]; | ||
63 | + | ||
64 | + [arcAnimation setToValue:to]; | ||
65 | + | ||
66 | + [arcAnimation setDelegate:delegate]; | ||
67 | + | ||
68 | + [arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]]; | ||
69 | + | ||
70 | + [self addAnimation:arcAnimation forKey:key]; | ||
71 | + | ||
72 | + [self setValue:to forKey:key]; | ||
73 | +} | ||
74 | + | ||
75 | +@end | ||
76 | + | ||
77 | +@interface XYRenderView () | ||
78 | + | ||
79 | +- (void)updateTimerFired:(NSTimer *)timer; | ||
80 | + | ||
81 | +- (SliceLayer *)createSliceLayer; | ||
82 | + | ||
83 | +- (void)updateLabelForLayer:(SliceLayer *)pieLayer value:(CGFloat)value; | ||
84 | + | ||
85 | +- (void)notifyDelegateOfSelectionChangeFrom:(NSUInteger)previousSelection to:(NSUInteger)newSelection; | ||
86 | + | ||
87 | +@end | ||
88 | + | ||
89 | +@implementation XYRenderView | ||
90 | +{ | ||
91 | + NSInteger _selectedSliceIndex; | ||
92 | + //pie view, contains all slices | ||
93 | + UIView *_pieView; | ||
94 | + | ||
95 | + //animation control | ||
96 | + NSTimer *_animationTimer; | ||
97 | + | ||
98 | + NSMutableArray *_animations; | ||
99 | + | ||
100 | +} | ||
101 | +static NSUInteger kDefaultSliceZOrder = 100; | ||
102 | + | ||
103 | +static CGPathRef CGPathCreateArc(CGPoint center, CGFloat radius, CGFloat startAngle, CGFloat endAngle) { | ||
104 | + CGMutablePathRef path = CGPathCreateMutable(); | ||
105 | + | ||
106 | + CGPathMoveToPoint(path, NULL, center.x, center.y); | ||
107 | + | ||
108 | + CGPathAddArc(path, NULL, center.x, center.y, radius, startAngle, endAngle, 0); | ||
109 | + | ||
110 | + CGPathCloseSubpath(path); | ||
111 | + | ||
112 | + return path; | ||
113 | +} | ||
114 | + | ||
115 | +- (id)initWithFrame:(CGRect)frame { | ||
116 | + if (self = [super initWithFrame:frame]) | ||
117 | + { | ||
118 | + self.backgroundColor = [UIColor clearColor]; | ||
119 | + | ||
120 | + _pieView = [[UIView alloc] initWithFrame:frame]; | ||
121 | + | ||
122 | + [_pieView setBackgroundColor:[UIColor clearColor]]; | ||
123 | + | ||
124 | + [self addSubview:_pieView]; | ||
125 | + | ||
126 | + _selectedSliceIndex = -1; | ||
127 | + | ||
128 | + _animations = [[NSMutableArray alloc] init]; | ||
129 | + | ||
130 | + _animationSpeed = 0.5; | ||
131 | + | ||
132 | + _startPieAngle = M_PI_2*3; | ||
133 | + | ||
134 | + _selectedSliceStroke = 3.0; | ||
135 | + | ||
136 | + self.pieRadius = MIN(frame.size.width/2, frame.size.height/2); | ||
137 | + | ||
138 | + self.pieCenter = CGPointMake(frame.size.width/2, frame.size.height/2); | ||
139 | + | ||
140 | + self.labelFont = [UIFont boldSystemFontOfSize:MAX((int)self.pieRadius/10, 5)]; | ||
141 | + | ||
142 | + _labelRadius = _pieRadius/2; | ||
143 | + | ||
144 | + _selectedSliceOffsetRadius = MAX(10, _pieRadius/10); | ||
145 | + | ||
146 | + _showLabel = YES; | ||
147 | + | ||
148 | + _showPercentage = YES; | ||
149 | + | ||
150 | + } | ||
151 | + return self; | ||
152 | +} | ||
153 | + | ||
154 | +- (id)initWithFrame:(CGRect)frame Center:(CGPoint)center Radius:(CGFloat)radius { | ||
155 | + if (self = [super initWithFrame:frame]) { | ||
156 | + self.pieCenter = center; | ||
157 | + self.pieRadius = radius; | ||
158 | + } | ||
159 | + return self; | ||
160 | +} | ||
161 | + | ||
162 | +- (id)initWithCoder:(NSCoder *)aDecoder { | ||
163 | + if(self = [super initWithCoder:aDecoder]) { | ||
164 | + _pieView = [[UIView alloc] initWithFrame:self.bounds]; | ||
165 | + [_pieView setBackgroundColor:[UIColor clearColor]]; | ||
166 | + [self insertSubview:_pieView atIndex:0]; | ||
167 | + | ||
168 | + _selectedSliceIndex = -1; | ||
169 | + _animations = [[NSMutableArray alloc] init]; | ||
170 | + | ||
171 | + _animationSpeed = 0.5; | ||
172 | + _startPieAngle = M_PI_2*3; | ||
173 | + _selectedSliceStroke = 3.0; | ||
174 | + | ||
175 | + CGRect bounds = [[self layer] bounds]; | ||
176 | + self.pieRadius = MIN(bounds.size.width/2, bounds.size.height/2) - 10; | ||
177 | + self.pieCenter = CGPointMake(bounds.size.width/2, bounds.size.height/2); | ||
178 | + self.labelFont = [UIFont boldSystemFontOfSize:MAX((int)self.pieRadius/10, 5)]; | ||
179 | + _labelRadius = _pieRadius/2; | ||
180 | + _selectedSliceOffsetRadius = MAX(10, _pieRadius/10); | ||
181 | + | ||
182 | + _showLabel = YES; | ||
183 | + _showPercentage = YES; | ||
184 | + | ||
185 | + } | ||
186 | + return self; | ||
187 | +} | ||
188 | + | ||
189 | +- (void)setPieCenter:(CGPoint)pieCenter { | ||
190 | + [_pieView setCenter:pieCenter]; | ||
191 | + | ||
192 | + _pieCenter = CGPointMake(_pieView.frame.size.width/2, _pieView.frame.size.height/2); | ||
193 | +} | ||
194 | + | ||
195 | +- (void)setPieRadius:(CGFloat)pieRadius { | ||
196 | + _pieRadius = pieRadius; | ||
197 | + | ||
198 | + CGRect frame = CGRectMake(_pieCenter.x-pieRadius, _pieCenter.y-pieRadius, pieRadius*2, pieRadius*2); | ||
199 | + | ||
200 | + _pieCenter = CGPointMake(frame.size.width/2, frame.size.height/2); | ||
201 | + | ||
202 | + [_pieView setFrame:frame]; | ||
203 | + | ||
204 | + [_pieView.layer setCornerRadius:_pieRadius]; | ||
205 | +} | ||
206 | + | ||
207 | +- (void)setPieBackgroundColor:(UIColor *)color { | ||
208 | + [_pieView setBackgroundColor:color]; | ||
209 | +} | ||
210 | + | ||
211 | +#pragma mark - manage settings | ||
212 | +#pragma mark 显示扇形百分比 | ||
213 | +- (void)setShowPercentage:(BOOL)showPercentage { | ||
214 | + _showPercentage = showPercentage; | ||
215 | + | ||
216 | + for(SliceLayer *layer in _pieView.layer.sublayers) | ||
217 | + { | ||
218 | + CATextLayer *textLayer = (CATextLayer*)[[layer sublayers] objectAtIndex:0]; | ||
219 | + | ||
220 | + [textLayer setHidden:!_showLabel]; | ||
221 | + | ||
222 | + if(!_showLabel) return; | ||
223 | + | ||
224 | + NSString *label; | ||
225 | + | ||
226 | + if(_showPercentage){ | ||
227 | + | ||
228 | + label = [NSString stringWithFormat:@"%0.0f", layer.percentage*100]; | ||
229 | + } else { | ||
230 | + label = [NSString stringWithFormat:@"%0.0f", layer.value]; | ||
231 | + } | ||
232 | + | ||
233 | + NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:13]}; | ||
234 | + | ||
235 | + CGSize infoSize = CGSizeMake(10, 20); | ||
236 | + | ||
237 | + CGSize size = [label boundingRectWithSize:infoSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size; | ||
238 | + | ||
239 | + if(M_PI*2*_labelRadius*layer.percentage < MAX(size.width,size.height)) | ||
240 | + { | ||
241 | + [textLayer setString:@""]; | ||
242 | + } | ||
243 | + else | ||
244 | + { | ||
245 | + [textLayer setString:label]; | ||
246 | + [textLayer setBounds:CGRectMake(0, 0, size.width, size.height)]; | ||
247 | + } | ||
248 | + } | ||
249 | +} | ||
250 | + | ||
251 | +#pragma mark - 计算选中的扇形滑出的位置和角度 | ||
252 | +- (void)setSliceSelectedAtIndex:(NSInteger)index { | ||
253 | + if(_selectedSliceOffsetRadius <= 0) { | ||
254 | + | ||
255 | + return; | ||
256 | + } | ||
257 | + | ||
258 | + SliceLayer *layer = (SliceLayer*)[_pieView.layer.sublayers objectAtIndex:index]; | ||
259 | + | ||
260 | + if (layer) { | ||
261 | + | ||
262 | + float adjust = 0.5; | ||
263 | + | ||
264 | + CGPoint currPos = layer.position; | ||
265 | + | ||
266 | + double middleAngle = (layer.startAngle + layer.endAngle)/2.0; | ||
267 | + | ||
268 | + // 此处是选中的扇形滑出的位置 | ||
269 | + CGPoint newPos = CGPointMake(currPos.x + _selectedSliceOffsetRadius*cos(middleAngle)*adjust, currPos.y + _selectedSliceOffsetRadius*sin(middleAngle)*adjust); | ||
270 | + | ||
271 | + layer.position = newPos; | ||
272 | + | ||
273 | + layer.isSelected = YES; | ||
274 | + } | ||
275 | +} | ||
276 | + | ||
277 | +#pragma mark - 计算扇形取消选中后滑出的位置和角度 | ||
278 | +- (void)setSliceDeselectedAtIndex:(NSInteger)index { | ||
279 | + if(_selectedSliceOffsetRadius <= 0) { | ||
280 | + | ||
281 | + return; | ||
282 | + } | ||
283 | + | ||
284 | + SliceLayer *layer = (SliceLayer*)[_pieView.layer.sublayers objectAtIndex:index]; | ||
285 | + | ||
286 | + if (layer) { | ||
287 | + | ||
288 | + layer.position = CGPointMake(0, 0); | ||
289 | + layer.isSelected = NO; | ||
290 | + } | ||
291 | +} | ||
292 | + | ||
293 | +#pragma mark - Pie Reload Data With Animation | ||
294 | +- (void)reloadData { | ||
295 | + if (_dataSource && !_animationTimer) | ||
296 | + { | ||
297 | + CALayer *parentLayer = [_pieView layer]; | ||
298 | + NSArray *slicelayers = [parentLayer sublayers]; | ||
299 | + | ||
300 | + _selectedSliceIndex = -1; | ||
301 | + [slicelayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { | ||
302 | + SliceLayer *layer = (SliceLayer *)obj; | ||
303 | + if(layer.isSelected) | ||
304 | + [self setSliceDeselectedAtIndex:idx]; | ||
305 | + }]; | ||
306 | + | ||
307 | + double startToAngle = 0.0; | ||
308 | + double endToAngle = startToAngle; | ||
309 | + | ||
310 | + NSUInteger sliceCount = [_dataSource numberOfSlicesInPieChart:self]; | ||
311 | + | ||
312 | + double sum = 0.0; | ||
313 | + double values[sliceCount]; | ||
314 | + for (int index = 0; index < sliceCount; index++) { | ||
315 | + values[index] = [_dataSource pieChart:self valueForSliceAtIndex:index]; | ||
316 | + sum += values[index]; | ||
317 | + } | ||
318 | + | ||
319 | + double angles[sliceCount]; | ||
320 | + for (int index = 0; index < sliceCount; index++) { | ||
321 | + double div; | ||
322 | + if (sum == 0) | ||
323 | + div = 0; | ||
324 | + else | ||
325 | + div = values[index] / sum; | ||
326 | + angles[index] = M_PI * 2 * div; | ||
327 | + } | ||
328 | + | ||
329 | + [CATransaction begin]; | ||
330 | + [CATransaction setAnimationDuration:_animationSpeed]; | ||
331 | + | ||
332 | + [_pieView setUserInteractionEnabled:NO]; | ||
333 | + | ||
334 | + __block NSMutableArray *layersToRemove = nil; | ||
335 | + [CATransaction setCompletionBlock:^{ | ||
336 | + | ||
337 | + [layersToRemove enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { | ||
338 | + [obj removeFromSuperlayer]; | ||
339 | + }]; | ||
340 | + | ||
341 | + [layersToRemove removeAllObjects]; | ||
342 | + | ||
343 | + for(SliceLayer *layer in _pieView.layer.sublayers) | ||
344 | + { | ||
345 | + [layer setZPosition:kDefaultSliceZOrder]; | ||
346 | + } | ||
347 | + | ||
348 | + [_pieView setUserInteractionEnabled:YES]; | ||
349 | + if([_delegate respondsToSelector:@selector(animateFinish:)]){ | ||
350 | + [_delegate animateFinish:self]; | ||
351 | + } | ||
352 | + }]; | ||
353 | + | ||
354 | + BOOL isOnStart = ([slicelayers count] == 0 && sliceCount); | ||
355 | + NSInteger diff = sliceCount - [slicelayers count]; | ||
356 | + layersToRemove = [NSMutableArray arrayWithArray:slicelayers]; | ||
357 | + | ||
358 | + BOOL isOnEnd = ([slicelayers count] && (sliceCount == 0 || sum <= 0)); | ||
359 | + if(isOnEnd) | ||
360 | + { | ||
361 | + for(SliceLayer *layer in _pieView.layer.sublayers){ | ||
362 | + [self updateLabelForLayer:layer value:0]; | ||
363 | + [layer createArcAnimationForKey:@"startAngle" | ||
364 | + fromValue:[NSNumber numberWithDouble:_startPieAngle] | ||
365 | + toValue:[NSNumber numberWithDouble:_startPieAngle] | ||
366 | + Delegate:self]; | ||
367 | + [layer createArcAnimationForKey:@"endAngle" | ||
368 | + fromValue:[NSNumber numberWithDouble:_startPieAngle] | ||
369 | + toValue:[NSNumber numberWithDouble:_startPieAngle] | ||
370 | + Delegate:self]; | ||
371 | + } | ||
372 | + [CATransaction commit]; | ||
373 | + return; | ||
374 | + } | ||
375 | + | ||
376 | + for(int index = 0; index < sliceCount; index ++) | ||
377 | + { | ||
378 | + SliceLayer *layer; | ||
379 | + double angle = angles[index]; | ||
380 | + endToAngle += angle; | ||
381 | + double startFromAngle = _startPieAngle + startToAngle; | ||
382 | + double endFromAngle = _startPieAngle + endToAngle; | ||
383 | + | ||
384 | + if( index >= [slicelayers count] ) | ||
385 | + { | ||
386 | + layer = [self createSliceLayer]; | ||
387 | + if (isOnStart) | ||
388 | + startFromAngle = endFromAngle = _startPieAngle; | ||
389 | + [parentLayer addSublayer:layer]; | ||
390 | + diff--; | ||
391 | + } | ||
392 | + else | ||
393 | + { | ||
394 | + SliceLayer *onelayer = [slicelayers objectAtIndex:index]; | ||
395 | + if(diff == 0 || onelayer.value == (CGFloat)values[index]) | ||
396 | + { | ||
397 | + layer = onelayer; | ||
398 | + [layersToRemove removeObject:layer]; | ||
399 | + } | ||
400 | + else if(diff > 0) | ||
401 | + { | ||
402 | + layer = [self createSliceLayer]; | ||
403 | + [parentLayer insertSublayer:layer atIndex:index]; | ||
404 | + diff--; | ||
405 | + } | ||
406 | + else if(diff < 0) | ||
407 | + { | ||
408 | + while(diff < 0) | ||
409 | + { | ||
410 | + [onelayer removeFromSuperlayer]; | ||
411 | + [parentLayer addSublayer:onelayer]; | ||
412 | + diff++; | ||
413 | + onelayer = [slicelayers objectAtIndex:index]; | ||
414 | + if(onelayer.value == (CGFloat)values[index] || diff == 0) | ||
415 | + { | ||
416 | + layer = onelayer; | ||
417 | + [layersToRemove removeObject:layer]; | ||
418 | + break; | ||
419 | + } | ||
420 | + } | ||
421 | + } | ||
422 | + } | ||
423 | + | ||
424 | + layer.value = values[index]; | ||
425 | + layer.percentage = (sum)?layer.value:0; | ||
426 | + UIColor *color = nil; | ||
427 | + if([_dataSource respondsToSelector:@selector(pieChart:colorForSliceAtIndex:)]) | ||
428 | + { | ||
429 | + color = [_dataSource pieChart:self colorForSliceAtIndex:index]; | ||
430 | + } | ||
431 | + | ||
432 | + if(!color) | ||
433 | + { | ||
434 | + // 如果没有设置扇形颜色这是默认颜色 | ||
435 | + color = [UIColor colorWithHue:((index/8)%20)/20.0+0.02 saturation:(index%8+3)/10.0 brightness:91/100.0 alpha:1]; | ||
436 | + } | ||
437 | + | ||
438 | + [layer setFillColor:color.CGColor]; | ||
439 | + if (sliceCount > 1) { | ||
440 | + [layer setStrokeColor:ColorRGBA(255, 255, 255, 1).CGColor]; | ||
441 | + [layer setLineWidth:3.0]; | ||
442 | + } | ||
443 | + | ||
444 | + [self updateLabelForLayer:layer value:values[index]]; | ||
445 | + [layer createArcAnimationForKey:@"startAngle" | ||
446 | + fromValue:[NSNumber numberWithDouble:startFromAngle] | ||
447 | + toValue:[NSNumber numberWithDouble:startToAngle+_startPieAngle] | ||
448 | + Delegate:self]; | ||
449 | + [layer createArcAnimationForKey:@"endAngle" | ||
450 | + fromValue:[NSNumber numberWithDouble:endFromAngle] | ||
451 | + toValue:[NSNumber numberWithDouble:endToAngle+_startPieAngle] | ||
452 | + Delegate:self]; | ||
453 | + startToAngle = endToAngle; | ||
454 | + } | ||
455 | + [CATransaction setDisableActions:YES]; | ||
456 | + for(SliceLayer *layer in layersToRemove) | ||
457 | + { | ||
458 | + [layer setFillColor:[self backgroundColor].CGColor]; | ||
459 | + [layer setDelegate:nil]; | ||
460 | + [layer setZPosition:0]; | ||
461 | + CATextLayer *textLayer = (CATextLayer*)[[layer sublayers] objectAtIndex:0]; | ||
462 | + [textLayer setHidden:YES]; | ||
463 | + } | ||
464 | + [CATransaction setDisableActions:NO]; | ||
465 | + [CATransaction commit]; | ||
466 | + } | ||
467 | +} | ||
468 | + | ||
469 | +#pragma mark - Animation Delegate + Run Loop Timer | ||
470 | + | ||
471 | +- (void)updateTimerFired:(NSTimer *)timer; | ||
472 | +{ | ||
473 | + CALayer *parentLayer = [_pieView layer]; | ||
474 | + NSArray *pieLayers = [parentLayer sublayers]; | ||
475 | + | ||
476 | + [pieLayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { | ||
477 | + SliceLayer *layer = (SliceLayer *)obj; | ||
478 | + | ||
479 | + NSNumber *presentationLayerStartAngle = [[obj presentationLayer] valueForKey:@"startAngle"]; | ||
480 | + CGFloat interpolatedStartAngle = [presentationLayerStartAngle doubleValue]; | ||
481 | + | ||
482 | + NSNumber *presentationLayerEndAngle = [[obj presentationLayer] valueForKey:@"endAngle"]; | ||
483 | + CGFloat interpolatedEndAngle = [presentationLayerEndAngle doubleValue]; | ||
484 | + | ||
485 | + CGPathRef path = CGPathCreateArc(_pieCenter, _pieRadius, interpolatedStartAngle, interpolatedEndAngle); | ||
486 | + [obj setPath:path]; | ||
487 | + CFRelease(path); | ||
488 | + | ||
489 | + { | ||
490 | + CATextLayer *labelLayer = (CATextLayer*)[[obj sublayers] objectAtIndex:0]; | ||
491 | + CAShapeLayer *lineLayer = (CAShapeLayer*)[[obj sublayers] objectAtIndex:1]; | ||
492 | + CGFloat interpolatedMidAngle = (interpolatedEndAngle + interpolatedStartAngle) / 2; | ||
493 | + [CATransaction setDisableActions:YES]; | ||
494 | + | ||
495 | + if (layer.percentage < self.checkLessPercent) { | ||
496 | + | ||
497 | + [labelLayer setForegroundColor:[UIColor grayColor].CGColor]; | ||
498 | + | ||
499 | + float labelLayerX = _pieCenter.x + ((_labelRadius + 70) * cos(interpolatedMidAngle)); | ||
500 | + | ||
501 | + float labelLayerY = _pieCenter.y + ((_labelRadius + 70) * sin(interpolatedMidAngle)); | ||
502 | + | ||
503 | + UIBezierPath *linePath = [UIBezierPath bezierPath]; | ||
504 | + // 起点 | ||
505 | + [linePath moveToPoint:CGPointMake(_pieCenter.x + ((_labelRadius+ 35) * cos(interpolatedMidAngle)), _pieCenter.y + ((_labelRadius + 35) * sin(interpolatedMidAngle)))]; | ||
506 | + // 终点 | ||
507 | + [linePath addLineToPoint:CGPointMake(_pieCenter.x + ((_labelRadius+ 50) * cos(interpolatedMidAngle)), _pieCenter.y + ((_labelRadius + 50) * sin(interpolatedMidAngle)))]; | ||
508 | + | ||
509 | + lineLayer.path = linePath.CGPath; | ||
510 | + | ||
511 | + [labelLayer setPosition:CGPointMake(labelLayerX * 1, labelLayerY * 1)]; | ||
512 | + } else { | ||
513 | + | ||
514 | + float labelLayerX = _pieCenter.x + (_labelRadius * cos(interpolatedMidAngle)); | ||
515 | + | ||
516 | + float labelLayerY = _pieCenter.y + (_labelRadius * sin(interpolatedMidAngle)); | ||
517 | + | ||
518 | + [labelLayer setPosition:CGPointMake(labelLayerX * 1, labelLayerY * 1)]; | ||
519 | + | ||
520 | + } | ||
521 | + | ||
522 | + [CATransaction setDisableActions:NO]; | ||
523 | + } | ||
524 | + }]; | ||
525 | +} | ||
526 | + | ||
527 | +- (void)animationDidStart:(CAAnimation *)anim { | ||
528 | + if (_animationTimer == nil) { | ||
529 | + static float timeInterval = 1.0/60.0; | ||
530 | + _animationTimer= [NSTimer scheduledTimerWithTimeInterval:timeInterval target:self selector:@selector(updateTimerFired:) userInfo:nil repeats:YES]; | ||
531 | + } | ||
532 | + | ||
533 | + [_animations addObject:anim]; | ||
534 | +} | ||
535 | + | ||
536 | +- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)animationCompleted { | ||
537 | + [_animations removeObject:anim]; | ||
538 | + | ||
539 | + if ([_animations count] == 0) { | ||
540 | + [_animationTimer invalidate]; | ||
541 | + _animationTimer = nil; | ||
542 | + } | ||
543 | +} | ||
544 | + | ||
545 | +#pragma mark - Touch Handing (Selection Notification) 选中扇形的索引 | ||
546 | +- (NSInteger)getCurrentSelectedOnTouch:(CGPoint)point { | ||
547 | + __block NSUInteger selectedIndex = -1; | ||
548 | + | ||
549 | + CGAffineTransform transform = CGAffineTransformIdentity; | ||
550 | + | ||
551 | + CALayer *parentLayer = [_pieView layer]; | ||
552 | + NSArray *pieLayers = [parentLayer sublayers]; | ||
553 | + | ||
554 | + [pieLayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { | ||
555 | + SliceLayer *pieLayer = (SliceLayer *)obj; | ||
556 | + CGPathRef path = [pieLayer path]; | ||
557 | + | ||
558 | + if (CGPathContainsPoint(path, &transform, point, 0)) { | ||
559 | + [pieLayer setLineWidth:_selectedSliceStroke]; | ||
560 | + [pieLayer setStrokeColor:[UIColor whiteColor].CGColor]; | ||
561 | + [pieLayer setLineJoin:kCALineJoinBevel]; | ||
562 | + [pieLayer setZPosition:MAXFLOAT]; | ||
563 | + selectedIndex = idx; | ||
564 | + } else { | ||
565 | + [pieLayer setZPosition:kDefaultSliceZOrder]; | ||
566 | + [pieLayer setLineWidth:0.0]; | ||
567 | + } | ||
568 | + }]; | ||
569 | + return selectedIndex; | ||
570 | +} | ||
571 | + | ||
572 | +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { | ||
573 | + [self touchesMoved:touches withEvent:event]; | ||
574 | +} | ||
575 | + | ||
576 | +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { | ||
577 | + UITouch *touch = [touches anyObject]; | ||
578 | + CGPoint point = [touch locationInView:_pieView]; | ||
579 | + [self getCurrentSelectedOnTouch:point]; | ||
580 | +} | ||
581 | + | ||
582 | +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { | ||
583 | + UITouch *touch = [touches anyObject]; | ||
584 | + CGPoint point = [touch locationInView:_pieView]; | ||
585 | + NSInteger selectedIndex = [self getCurrentSelectedOnTouch:point]; | ||
586 | + [self notifyDelegateOfSelectionChangeFrom:_selectedSliceIndex to:selectedIndex]; | ||
587 | + [self touchesCancelled:touches withEvent:event]; | ||
588 | +} | ||
589 | + | ||
590 | +#pragma mark - 选中事件 | ||
591 | +- (void)pieSelected:(NSInteger)selIndex { | ||
592 | + [self notifyDelegateOfSelectionChangeFrom:_selectedSliceIndex to:selIndex]; | ||
593 | + [self touchesCancelled:[NSSet set] withEvent:nil]; | ||
594 | +} | ||
595 | + | ||
596 | +#pragma marK - 点击旋转事件结束后 | ||
597 | +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { | ||
598 | + CALayer *parentLayer = [_pieView layer]; | ||
599 | + NSArray *pieLayers = [parentLayer sublayers]; | ||
600 | + | ||
601 | + for (SliceLayer *pieLayer in pieLayers) { | ||
602 | + | ||
603 | + [pieLayer setZPosition:kDefaultSliceZOrder]; | ||
604 | + [self createSliceLayer]; | ||
605 | + if (pieLayers.count > 1) { | ||
606 | + [pieLayer setLineWidth:3.0]; | ||
607 | + } | ||
608 | + } | ||
609 | + | ||
610 | +} | ||
611 | + | ||
612 | +#pragma mark - Selection Notification | ||
613 | +- (void)notifyDelegateOfSelectionChangeFrom:(NSUInteger)previousSelection to:(NSUInteger)newSelection { | ||
614 | + // 将上一次选中的Selection和最新选中的Selection做比较 | ||
615 | + if (previousSelection != newSelection) | ||
616 | + { | ||
617 | + if (previousSelection != -1 && [_delegate respondsToSelector:@selector(pieChart:willDeselectSliceAtIndex:)]) | ||
618 | + { | ||
619 | + [_delegate pieChart:self willDeselectSliceAtIndex:previousSelection]; | ||
620 | + } | ||
621 | + | ||
622 | + _selectedSliceIndex = newSelection; | ||
623 | + | ||
624 | + if (newSelection != -1) | ||
625 | + { | ||
626 | + if([_delegate respondsToSelector:@selector(pieChart:willSelectSliceAtIndex:)]) | ||
627 | + [_delegate pieChart:self willSelectSliceAtIndex:newSelection]; | ||
628 | + if(previousSelection != -1 && [_delegate respondsToSelector:@selector(pieChart:didDeselectSliceAtIndex:)]) | ||
629 | + [_delegate pieChart:self didDeselectSliceAtIndex:previousSelection]; | ||
630 | + if([_delegate respondsToSelector:@selector(pieChart:didSelectSliceAtIndex:)]) | ||
631 | + [_delegate pieChart:self didSelectSliceAtIndex:newSelection]; | ||
632 | + [self setSliceSelectedAtIndex:newSelection]; | ||
633 | + } | ||
634 | + | ||
635 | + if(previousSelection != -1) | ||
636 | + { | ||
637 | + [self setSliceDeselectedAtIndex:previousSelection]; | ||
638 | + if([_delegate respondsToSelector:@selector(pieChart:didDeselectSliceAtIndex:)]) | ||
639 | + [_delegate pieChart:self didDeselectSliceAtIndex:previousSelection]; | ||
640 | + } | ||
641 | + } | ||
642 | + else if (newSelection != -1) | ||
643 | + { | ||
644 | + SliceLayer *layer = (SliceLayer*)[_pieView.layer.sublayers objectAtIndex:newSelection]; | ||
645 | + if(_selectedSliceOffsetRadius > 0 && layer){ | ||
646 | + | ||
647 | + if (layer.isSelected) { | ||
648 | + if ([_delegate respondsToSelector:@selector(pieChart:willDeselectSliceAtIndex:)]) | ||
649 | + [_delegate pieChart:self willDeselectSliceAtIndex:newSelection]; | ||
650 | + [self setSliceDeselectedAtIndex:newSelection]; | ||
651 | + if (newSelection != -1 && [_delegate respondsToSelector:@selector(pieChart:didDeselectSliceAtIndex:)]) | ||
652 | + [_delegate pieChart:self didDeselectSliceAtIndex:newSelection]; | ||
653 | + } | ||
654 | + else { | ||
655 | + if ([_delegate respondsToSelector:@selector(pieChart:willSelectSliceAtIndex:)]) | ||
656 | + [_delegate pieChart:self willSelectSliceAtIndex:newSelection]; | ||
657 | + [self setSliceSelectedAtIndex:newSelection]; | ||
658 | + if (newSelection != -1 && [_delegate respondsToSelector:@selector(pieChart:didSelectSliceAtIndex:)]) | ||
659 | + [_delegate pieChart:self didSelectSliceAtIndex:newSelection]; | ||
660 | + } | ||
661 | + } | ||
662 | + } | ||
663 | +} | ||
664 | + | ||
665 | +#pragma mark - <扇形中百分比Label的旋转角度> | ||
666 | +- (void)setTextAngle:(CGFloat)textAngle { | ||
667 | + | ||
668 | + NSString *angle = [NSString stringWithFormat:@"%0.6f", textAngle]; | ||
669 | + // 将扇形百分比的旋转角度精确到小数点后六位,如果角度是0,则不进行角度旋转 | ||
670 | + if ([angle isEqualToString:@"0.000000"] || [angle isEqualToString:@"-0.000000"]) { | ||
671 | + | ||
672 | + return; | ||
673 | + } | ||
674 | + CALayer *parentLayer = [_pieView layer]; | ||
675 | + NSArray *pieLayers = [parentLayer sublayers]; | ||
676 | + | ||
677 | + [pieLayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { | ||
678 | + | ||
679 | + CALayer *labelLayer = [[obj sublayers] objectAtIndex:0]; | ||
680 | + | ||
681 | + // 扇形中百分比Label的旋转角度 | ||
682 | + labelLayer.transform = CATransform3DMakeRotation(-textAngle, 0, 0, 1); | ||
683 | + }]; | ||
684 | +} | ||
685 | + | ||
686 | +#pragma mark - Pie Layer Creation Method | ||
687 | +- (SliceLayer *)createSliceLayer { | ||
688 | + SliceLayer *pieLayer = [SliceLayer layer]; | ||
689 | + [pieLayer setZPosition:0]; | ||
690 | + [pieLayer setStrokeColor:NULL]; | ||
691 | + CATextLayer *textLayer = [CATextLayer layer]; | ||
692 | + | ||
693 | +#pragma mark - 这里可以修改整扇形title字体 | ||
694 | + // 扇形百分比字体 | ||
695 | + [textLayer setFontSize:self.labelFont.pointSize - 2]; | ||
696 | + // 扇形百分比颜色 | ||
697 | + [textLayer setForegroundColor:[UIColor whiteColor].CGColor]; | ||
698 | + [textLayer setAnchorPoint:CGPointMake(0.5, 0.5)]; | ||
699 | + // 扇形百分比字体居中 | ||
700 | + [textLayer setAlignmentMode:kCAAlignmentCenter]; | ||
701 | + // 扇形百分比字体清晰度 | ||
702 | + [textLayer setContentsScale:[UIScreen mainScreen].scale]; | ||
703 | + // 扇形百分比背景色 | ||
704 | + [textLayer setBackgroundColor:[UIColor clearColor].CGColor]; | ||
705 | + | ||
706 | + // 当百分比过小时,划线显示百分比 | ||
707 | + CAShapeLayer *lineLayer = [CAShapeLayer layer]; | ||
708 | + lineLayer.lineWidth = 1; | ||
709 | + lineLayer.strokeColor = [UIColor grayColor].CGColor; | ||
710 | + | ||
711 | + [CATransaction setDisableActions:NO]; | ||
712 | + [self.textLayerArray addObject:textLayer]; | ||
713 | + self.textLayer = textLayer; | ||
714 | + [pieLayer addSublayer:textLayer]; | ||
715 | + [pieLayer addSublayer:lineLayer]; | ||
716 | + return pieLayer; | ||
717 | + | ||
718 | +} | ||
719 | + | ||
720 | +- (void)updateLabelForLayer:(SliceLayer *)pieLayer value:(CGFloat)value { | ||
721 | + CATextLayer *textLayer = (CATextLayer*)[[pieLayer sublayers] objectAtIndex:0]; | ||
722 | + [textLayer setHidden:!_showLabel]; | ||
723 | + if(!_showLabel) return; | ||
724 | + NSString *label; | ||
725 | + | ||
726 | + // 百分比预留小数点后一位 | ||
727 | + label = [NSString stringWithFormat:@"%.1f%%", pieLayer.percentage]; | ||
728 | + | ||
729 | + NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:13]}; | ||
730 | + | ||
731 | + CGSize infoSize = CGSizeMake(10, 20); | ||
732 | + | ||
733 | + CGSize size = [label boundingRectWithSize:infoSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size; | ||
734 | + | ||
735 | + [CATransaction setDisableActions:YES]; | ||
736 | + | ||
737 | + [textLayer setString:label]; | ||
738 | + | ||
739 | + [textLayer setBounds:CGRectMake(0, 0, size.width + 30, size.height)]; | ||
740 | + [CATransaction setDisableActions:NO]; | ||
741 | +} | ||
742 | + | ||
743 | +- (void)checkLessPercent:(CGFloat)lessPercent { | ||
744 | + | ||
745 | + _checkLessPercent = lessPercent; | ||
746 | +} | ||
747 | +@end |
1 | +// | ||
2 | +// XYRotatedView.h | ||
3 | +// PieChart | ||
4 | +// | ||
5 | +// Created by GMY on 17/6/1. | ||
6 | +// Copyright © 2017年 com.gmy. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <UIKit/UIKit.h> | ||
10 | +#import "XYRenderView.h" | ||
11 | + | ||
12 | +@class XYRotatedView; | ||
13 | +@protocol RotatedViewDelegate <NSObject> | ||
14 | + | ||
15 | +@optional | ||
16 | +// 选中的回调 | ||
17 | +- (void)selectedFinish:(XYRotatedView *)rotatedView index:(NSInteger)index percent:(float)percent; | ||
18 | +@end | ||
19 | + | ||
20 | +@interface XYRotatedView : UIView<RenderViewDataSource,RenderViewtDelegate> | ||
21 | + | ||
22 | +@property(nonatomic, assign) float mZeroAngle; | ||
23 | + | ||
24 | +// 颜色数组 | ||
25 | +@property(nonatomic, strong) NSMutableArray *mColorArray; | ||
26 | + | ||
27 | +// 百分比数组 | ||
28 | +@property(nonatomic, strong) NSMutableArray *percentArray; | ||
29 | + | ||
30 | +// 角度数组 | ||
31 | +@property(nonatomic, strong) NSMutableArray *mThetaArray; | ||
32 | + | ||
33 | +@property(nonatomic, assign) BOOL isAnimating; | ||
34 | +@property(nonatomic, assign) BOOL isTapStopped; | ||
35 | +@property(nonatomic, assign) BOOL isAutoRotation; | ||
36 | + | ||
37 | +@property(nonatomic, assign) float mAbsoluteTheta; | ||
38 | +@property(nonatomic, assign) float mRelativeTheta; | ||
39 | + | ||
40 | +@property(nonatomic,retain) UITextView *mInfoTextView; | ||
41 | + | ||
42 | +@property(nonatomic, assign) float mDragSpeed; | ||
43 | +@property(nonatomic, strong) NSDate *mDragBeforeDate; | ||
44 | +@property(nonatomic, assign) float mDragBeforeTheta; | ||
45 | +@property(nonatomic, strong) NSTimer *mDecelerateTimer; | ||
46 | + | ||
47 | +@property(nonatomic, assign) id<RotatedViewDelegate> delegate; | ||
48 | + | ||
49 | +@property (nonatomic)float fracValue; | ||
50 | + | ||
51 | +@property (nonatomic, assign) BOOL showPercent; | ||
52 | + | ||
53 | +@property (nonatomic, assign) CGFloat checkLessPercent; | ||
54 | + | ||
55 | +/** | ||
56 | + * 开始动画 | ||
57 | + */ | ||
58 | +- (void)startedAnimate; | ||
59 | + | ||
60 | +/** | ||
61 | + * 刷新pie | ||
62 | + */ | ||
63 | +- (void)reloadPie; | ||
64 | + | ||
65 | +- (void)lessThanPercent:(CGFloat)lessThanPercent; | ||
66 | +@end |
1 | +// | ||
2 | +// XYRotatedView.m | ||
3 | +// PieChart | ||
4 | +// | ||
5 | +// Created by GMY on 17/6/1. | ||
6 | +// Copyright © 2017年 com.gmy. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import "XYRotatedView.h" | ||
10 | +#import "XYRenderView.h" | ||
11 | +#import <QuartzCore/QuartzCore.h> | ||
12 | +#include <math.h> | ||
13 | + | ||
14 | +#define K_EPSINON (1e-127) | ||
15 | +#define IS_ZERO_FLOAT(X) (X < K_EPSINON && X > -K_EPSINON) | ||
16 | +#define K_MAX_SPEED 12.0f | ||
17 | +#define K_POINTER_ANGLE (M_PI / 2) | ||
18 | + | ||
19 | +@interface XYRotatedView() | ||
20 | + | ||
21 | +@property (nonatomic,assign) NSInteger selectedIndex; | ||
22 | + | ||
23 | +@property (strong, nonatomic) XYRenderView *pieChart; | ||
24 | + | ||
25 | +@property (nonatomic, assign) BOOL canLayerOpen; | ||
26 | + | ||
27 | +@end | ||
28 | + | ||
29 | +@implementation XYRotatedView | ||
30 | + | ||
31 | +/** | ||
32 | + * RotatedView 初始化 | ||
33 | + */ | ||
34 | +- (id)initWithFrame:(CGRect)frame { | ||
35 | + | ||
36 | + if ((self = [super initWithFrame:frame])) { | ||
37 | + | ||
38 | + // 视图背景色 | ||
39 | + self.backgroundColor = [UIColor clearColor]; | ||
40 | + | ||
41 | + _mRelativeTheta = 0.0; | ||
42 | + | ||
43 | + // 动画是否开始 | ||
44 | + _isAnimating = NO; | ||
45 | + | ||
46 | + // 点击是否结束 | ||
47 | + _isTapStopped = NO; | ||
48 | + | ||
49 | + // 环形图初始化 位置\尺寸 | ||
50 | + self.pieChart = [[XYRenderView alloc]initWithFrame:frame]; | ||
51 | + | ||
52 | + // 环形图数据源方法 | ||
53 | + self.pieChart.dataSource = self; | ||
54 | + | ||
55 | + // 环形图代理方法 | ||
56 | + self.pieChart.delegate = self; | ||
57 | + | ||
58 | + // 开始的角度 | ||
59 | + [self.pieChart setStartPieAngle:0]; | ||
60 | + | ||
61 | + // 绘制环形图所需的动画时间 | ||
62 | + [self.pieChart setAnimationSpeed:1.0]; | ||
63 | + | ||
64 | + // 环状图上Label(百分比)所处的半径 | ||
65 | + CGFloat radius = frame.size.width * 0.4; | ||
66 | + | ||
67 | + [self.pieChart setLabelRadius:radius]; | ||
68 | + | ||
69 | + // 环形图上标题的字体大小 | ||
70 | + [self.pieChart setLabelFont:[UIFont fontWithName:@"DBLCDTempBlack" size:15]]; | ||
71 | + | ||
72 | + // 环形图中心点 | ||
73 | + [self.pieChart setPieCenter:CGPointMake(frame.size.width/2, frame.size.height/2)]; | ||
74 | + | ||
75 | + // 环形图是否接受触摸事件 | ||
76 | + [self.pieChart setUserInteractionEnabled:NO]; | ||
77 | + | ||
78 | + // 添加pieChart | ||
79 | + [self addSubview:self.pieChart]; | ||
80 | + } | ||
81 | + | ||
82 | + return self; | ||
83 | +} | ||
84 | + | ||
85 | +/** | ||
86 | + * 刷新视图方法 | ||
87 | + */ | ||
88 | +- (void)reloadPie { | ||
89 | + _isAutoRotation = YES; | ||
90 | + | ||
91 | + // 调用渲染视图的数据刷新方法 | ||
92 | + [self.pieChart reloadData]; | ||
93 | +} | ||
94 | + | ||
95 | +- (void)lessThanPercent:(CGFloat)lessThanPercent { | ||
96 | + | ||
97 | + // 校验最小百分比 | ||
98 | + [self.pieChart checkLessPercent:lessThanPercent]; | ||
99 | +} | ||
100 | +/** | ||
101 | + * 系统绘画方法 | ||
102 | + */ | ||
103 | +- (void)drawRect:(CGRect)rect { | ||
104 | + | ||
105 | + NSInteger wedges = [_percentArray count]; | ||
106 | + if (wedges > [_mColorArray count]) { | ||
107 | + | ||
108 | + for (NSInteger i= _mColorArray.count; i<wedges; ++i) { | ||
109 | + [_mColorArray addObject:[UIColor whiteColor]]; | ||
110 | + } | ||
111 | + } | ||
112 | + | ||
113 | + _mThetaArray = [[NSMutableArray alloc] initWithCapacity:wedges]; | ||
114 | + | ||
115 | + float sum = 0.0; | ||
116 | + for (int i = 0; i < wedges; ++i) { | ||
117 | + sum += [[_percentArray objectAtIndex:i] floatValue]; | ||
118 | + } | ||
119 | + | ||
120 | + float frac = 2.0 * M_PI / sum; | ||
121 | + self.fracValue = frac; | ||
122 | + | ||
123 | +// float startAngle = _mZeroAngle; | ||
124 | + float endAngle = _mZeroAngle; | ||
125 | + for (int i = 0; i < wedges; ++i) { | ||
126 | + | ||
127 | +// startAngle = endAngle; | ||
128 | + endAngle += [[_percentArray objectAtIndex:i] floatValue] * frac; | ||
129 | + [_mThetaArray addObject:[NSNumber numberWithFloat:endAngle]]; | ||
130 | + } | ||
131 | +} | ||
132 | + | ||
133 | + | ||
134 | +- (void)startedAnimate { | ||
135 | + [self performSelector:@selector(delayAnimate) withObject:nil afterDelay:0.0f]; | ||
136 | +} | ||
137 | + | ||
138 | +#pragma mark - | ||
139 | +#pragma mark handle rotation angle | ||
140 | +- (float)thetaForX:(float)x andY:(float)y { | ||
141 | + if (IS_ZERO_FLOAT(y)) { | ||
142 | + if (x < 0) { | ||
143 | + return M_PI; | ||
144 | + } else { | ||
145 | + return 0; | ||
146 | + } | ||
147 | + } | ||
148 | + | ||
149 | + float theta = atan(y / x); | ||
150 | + if (x < 0 && y > 0) { | ||
151 | + theta = M_PI + theta; | ||
152 | + } else if (x < 0 && y < 0) { | ||
153 | + theta = M_PI + theta; | ||
154 | + } else if (x > 0 && y < 0) { | ||
155 | + theta = 2 * M_PI + theta; | ||
156 | + } | ||
157 | + return theta; | ||
158 | +} | ||
159 | + | ||
160 | +/* 计算将当前以相对角度为单位的触摸点旋转到绝对角度为newTheta的位置所需要旋转到的角度 */ | ||
161 | +- (float)rotationThetaForNewTheta:(float)newTheta { | ||
162 | + float rotationTheta; | ||
163 | + if (_mRelativeTheta > (3 * M_PI / 2) && (newTheta < M_PI / 2)) { | ||
164 | + rotationTheta = newTheta + (2 * M_PI - _mRelativeTheta); | ||
165 | + } else { | ||
166 | + rotationTheta = newTheta - _mRelativeTheta; | ||
167 | + } | ||
168 | + // 返回最后旋转的角度 | ||
169 | + return rotationTheta; | ||
170 | +} | ||
171 | + | ||
172 | +- (float)thetaForTouch:(UITouch *)touch onView:view { | ||
173 | + CGPoint location = [touch locationInView:view]; | ||
174 | + float xOffset = self.bounds.size.width / 2; | ||
175 | + float yOffset = self.bounds.size.height / 2; | ||
176 | + float centeredX = location.x - xOffset; | ||
177 | + float centeredY = location.y - yOffset; | ||
178 | + | ||
179 | + return [self thetaForX:centeredX andY:centeredY]; | ||
180 | +} | ||
181 | + | ||
182 | +#pragma mark - | ||
183 | +#pragma mark Private & handle rotation | ||
184 | +- (void)timerStop { | ||
185 | + [_mDecelerateTimer invalidate]; | ||
186 | + _mDecelerateTimer = nil; | ||
187 | + _mDragSpeed = 0; | ||
188 | + _isAnimating = NO; | ||
189 | + | ||
190 | + [self performSelector:@selector(delayAnimate) withObject:nil afterDelay:0.0f]; | ||
191 | + return; | ||
192 | +} | ||
193 | + | ||
194 | +- (void)delayAnimate { | ||
195 | + double tan2 = atan2(self.transform.b, self.transform.a); | ||
196 | + | ||
197 | + //根据旋转角度判断当前在那个扇区中 | ||
198 | + float curTheta = M_PI/2 - tan2; | ||
199 | + curTheta = curTheta > 0?curTheta:M_PI*2+curTheta; | ||
200 | + int selIndex = 0; | ||
201 | + for (;selIndex < [_mThetaArray count]; selIndex++) { | ||
202 | + if (curTheta < [[_mThetaArray objectAtIndex:selIndex] floatValue]) { | ||
203 | + break; | ||
204 | + } | ||
205 | + } | ||
206 | + | ||
207 | + //根据当前旋转弧度和选中扇区的起止弧度,判断居中需要旋转的弧度 | ||
208 | + float calTheta = [[_mThetaArray objectAtIndex:selIndex] floatValue] - curTheta; | ||
209 | + float fanTheta = [[_percentArray objectAtIndex:selIndex] floatValue] * self.fracValue; | ||
210 | + float rotateTheta = fanTheta/2 - calTheta; | ||
211 | + | ||
212 | + //设置动画 选中后扇形外滑的动画 | ||
213 | + [UIView animateWithDuration:0.42 animations:^{ | ||
214 | + | ||
215 | + self.transform = CGAffineTransformRotate(self.transform,rotateTheta); | ||
216 | + self.pieChart.textAngle = rotateTheta; | ||
217 | + | ||
218 | + } completion:^(BOOL finished) { | ||
219 | + | ||
220 | + [self outPie]; | ||
221 | + }]; | ||
222 | + | ||
223 | + [self delayAnimateStop:selIndex]; | ||
224 | +} | ||
225 | + | ||
226 | +- (void)outPie { | ||
227 | + [self.pieChart pieSelected:self.selectedIndex]; | ||
228 | + self.canLayerOpen = YES; | ||
229 | +} | ||
230 | + | ||
231 | +- (void)delayAnimateStop:(NSInteger)index { | ||
232 | + float sum = 0.0; | ||
233 | + for (int i = 0; i < [_percentArray count]; ++i) { | ||
234 | + sum += [[_percentArray objectAtIndex:i] floatValue]; | ||
235 | + } | ||
236 | + float percent = [[_percentArray objectAtIndex:index] floatValue]/sum; | ||
237 | + self.selectedIndex = index; | ||
238 | + | ||
239 | + if ([self.delegate respondsToSelector:@selector(selectedFinish:index:percent:)]) { | ||
240 | + [self.delegate selectedFinish:self index:index percent:percent]; | ||
241 | + } | ||
242 | +} | ||
243 | + | ||
244 | +- (void)animationDidStop:(NSString*)str finished:(NSNumber*)flag context:(void*)context { | ||
245 | + _isAutoRotation = NO; | ||
246 | + [self delayAnimate]; | ||
247 | +} | ||
248 | + | ||
249 | +- (int)touchIndex { | ||
250 | + int index; | ||
251 | + | ||
252 | + for (index = 0; index < [_mThetaArray count]; index++) { | ||
253 | + if (_mRelativeTheta < [[_mThetaArray objectAtIndex:index] floatValue]) { | ||
254 | + break; | ||
255 | + } | ||
256 | + } | ||
257 | + | ||
258 | + return index; | ||
259 | +} | ||
260 | + | ||
261 | +#pragma mark - 点击结束,触发旋转方法 | ||
262 | +- (void)tapStopped { | ||
263 | + int tapAreaIndex = [self touchIndex]; | ||
264 | + | ||
265 | + if (tapAreaIndex == 0) { | ||
266 | + _mRelativeTheta = [[_mThetaArray objectAtIndex:0] floatValue] / 2; | ||
267 | + } else { | ||
268 | + _mRelativeTheta = [[_mThetaArray objectAtIndex:tapAreaIndex] floatValue] | ||
269 | + - (([[_mThetaArray objectAtIndex:tapAreaIndex] floatValue] | ||
270 | + - [[_mThetaArray objectAtIndex:tapAreaIndex - 1] floatValue]) / 2); | ||
271 | + } | ||
272 | + self.pieChart.textrelativeTheta = _mRelativeTheta; | ||
273 | + if (tapAreaIndex != self.selectedIndex) { | ||
274 | + if (self.canLayerOpen) { | ||
275 | + [self.pieChart pieSelected:self.selectedIndex]; | ||
276 | + self.canLayerOpen = NO; | ||
277 | + } | ||
278 | + _isAutoRotation = YES; | ||
279 | + [UIView beginAnimations:@"tap stopped" context:nil]; | ||
280 | + | ||
281 | +#pragma mark- 点击旋转速度 | ||
282 | + [UIView setAnimationDuration:0.5]; | ||
283 | + [UIView setAnimationDelegate:self]; | ||
284 | + [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; | ||
285 | + self.pieChart.textAngle = [self rotationThetaForNewTheta:K_POINTER_ANGLE]; | ||
286 | + self.transform = CGAffineTransformMakeRotation([self rotationThetaForNewTheta:K_POINTER_ANGLE]); | ||
287 | + [UIView commitAnimations]; | ||
288 | + } | ||
289 | + | ||
290 | + return; | ||
291 | +} | ||
292 | + | ||
293 | +#pragma mark - | ||
294 | +#pragma mark Responder | ||
295 | +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { | ||
296 | + | ||
297 | + if (_isAutoRotation) { | ||
298 | + return; | ||
299 | + } | ||
300 | + | ||
301 | + _isTapStopped = IS_ZERO_FLOAT(_mDragSpeed); | ||
302 | + | ||
303 | + if ([_mDecelerateTimer isValid]) { | ||
304 | + [_mDecelerateTimer invalidate]; | ||
305 | + _mDecelerateTimer = nil; | ||
306 | + _mDragSpeed = 0; | ||
307 | + _isAnimating = NO; | ||
308 | + } | ||
309 | + | ||
310 | + UITouch *touch = [touches anyObject]; | ||
311 | + _mAbsoluteTheta = [self thetaForTouch:touch onView:self.superview]; | ||
312 | + _mRelativeTheta = [self thetaForTouch:touch onView:self]; | ||
313 | + _mDragBeforeDate = [NSDate date]; | ||
314 | + _mDragBeforeTheta = 0.0f; | ||
315 | + | ||
316 | + return; | ||
317 | +} | ||
318 | + | ||
319 | +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { | ||
320 | + if (_isAutoRotation) { | ||
321 | + return; | ||
322 | + } | ||
323 | + | ||
324 | + if (IS_ZERO_FLOAT(_mDragSpeed)) { | ||
325 | + if (_isTapStopped) { | ||
326 | + [self tapStopped]; | ||
327 | + return; | ||
328 | + } else { | ||
329 | + [self delayAnimate]; | ||
330 | + return; | ||
331 | + } | ||
332 | + } else if ((fabsf(_mDragSpeed) > K_MAX_SPEED)) { | ||
333 | + _mDragSpeed = (_mDragSpeed > 0) ? K_MAX_SPEED : -K_MAX_SPEED; | ||
334 | + } | ||
335 | + | ||
336 | +} | ||
337 | + | ||
338 | +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { | ||
339 | + | ||
340 | +} | ||
341 | + | ||
342 | +#pragma -mark xypieSource | ||
343 | +- (NSUInteger)numberOfSlicesInPieChart:(XYRenderView *)pieChart { | ||
344 | + return [_percentArray count]; | ||
345 | +} | ||
346 | + | ||
347 | +- (CGFloat)pieChart:(XYRenderView *)pieChart valueForSliceAtIndex:(NSUInteger)index { | ||
348 | + return [[_percentArray objectAtIndex:index] floatValue]; | ||
349 | +} | ||
350 | + | ||
351 | +- (UIColor *)pieChart:(XYRenderView *)pieChart colorForSliceAtIndex:(NSUInteger)index { | ||
352 | + return [_mColorArray objectAtIndex:index]; | ||
353 | +} | ||
354 | + | ||
355 | +- (void)animateFinish:(XYRenderView *)pieChart { | ||
356 | + _isAutoRotation = NO; | ||
357 | + [self startedAnimate]; | ||
358 | +} | ||
359 | + | ||
360 | +@end |
1 | +// | ||
2 | +// UIView+extension.h | ||
3 | +// 01-创建TableBar及子控制器 | ||
4 | +// | ||
5 | +// Created by Haven on 16/6/1. | ||
6 | +// Copyright © 2016年 Haven. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <UIKit/UIKit.h> | ||
10 | + | ||
11 | +@interface UIView (extension) | ||
12 | +@property (nonatomic, assign) CGFloat x; // x值 | ||
13 | +@property (nonatomic, assign) CGFloat y; // y值 | ||
14 | +@property (nonatomic, assign) CGFloat width; // 宽 | ||
15 | +@property (nonatomic, assign) CGFloat height; // 高 | ||
16 | +@property (nonatomic, assign) CGSize size; // size | ||
17 | +@property (nonatomic, assign) CGPoint origin; // 点 | ||
18 | +@property (nonatomic, assign) CGFloat centerX; // 中心点X值 | ||
19 | +@property (nonatomic, assign) CGFloat centerY; // 中心点Y值 | ||
20 | +@end |
1 | +// | ||
2 | +// UIView+extension.m | ||
3 | +// 01-创建TableBar及子控制器 | ||
4 | +// | ||
5 | +// Created by Haven on 16/6/1. | ||
6 | +// Copyright © 2016年 Haven. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import "UIView+extension.h" | ||
10 | + | ||
11 | +@implementation UIView (extension) | ||
12 | +- (void)setX:(CGFloat)x | ||
13 | +{ | ||
14 | + CGRect frame = self.frame; | ||
15 | + frame.origin.x = x; | ||
16 | + self.frame = frame; | ||
17 | +} | ||
18 | + | ||
19 | +- (CGFloat)x | ||
20 | +{ | ||
21 | + return self.frame.origin.x; | ||
22 | +} | ||
23 | +- (void)setY:(CGFloat)y | ||
24 | +{ | ||
25 | + CGRect frame = self.frame; | ||
26 | + frame.origin.y = y; | ||
27 | + self.frame = frame; | ||
28 | +} | ||
29 | + | ||
30 | +- (CGFloat)y | ||
31 | +{ | ||
32 | + return self.frame.origin.y; | ||
33 | +} | ||
34 | + | ||
35 | +-(void)setWidth:(CGFloat)width | ||
36 | +{ | ||
37 | + CGRect frame = self.frame; | ||
38 | + frame.size.width = width; | ||
39 | + self.frame = frame; | ||
40 | +} | ||
41 | + | ||
42 | + | ||
43 | +-(CGFloat)width | ||
44 | +{ | ||
45 | + return self.frame.size.width; | ||
46 | +} | ||
47 | + | ||
48 | +-(void)setHeight:(CGFloat)height | ||
49 | +{ | ||
50 | + CGRect frame = self.frame; | ||
51 | + frame.size.height = height; | ||
52 | + self.frame = frame; | ||
53 | +} | ||
54 | + | ||
55 | + | ||
56 | +-(CGFloat)height | ||
57 | +{ | ||
58 | + return self.frame.size.height; | ||
59 | +} | ||
60 | + | ||
61 | + | ||
62 | +- (void)setCenterX:(CGFloat)centerX | ||
63 | +{ | ||
64 | + CGPoint center = self.center; | ||
65 | + center.x = centerX; | ||
66 | + self.center = center; | ||
67 | +} | ||
68 | + | ||
69 | +- (CGFloat)centerX | ||
70 | +{ | ||
71 | + return self.center.x; | ||
72 | +} | ||
73 | + | ||
74 | +- (void)setCenterY:(CGFloat)centerY | ||
75 | +{ | ||
76 | + CGPoint center = self.center; | ||
77 | + center.y = centerY; | ||
78 | + self.center = center; | ||
79 | +} | ||
80 | + | ||
81 | +- (CGFloat)centerY | ||
82 | +{ | ||
83 | + return self.center.y; | ||
84 | +} | ||
85 | + | ||
86 | + | ||
87 | + | ||
88 | +- (void)setSize:(CGSize)size | ||
89 | +{ | ||
90 | + CGRect frame = self.frame; | ||
91 | + frame.size = size; | ||
92 | + self.frame = frame; | ||
93 | +} | ||
94 | + | ||
95 | +- (CGSize)size | ||
96 | +{ | ||
97 | + return self.frame.size; | ||
98 | +} | ||
99 | +-(void)setOrigin:(CGPoint)origin | ||
100 | +{ | ||
101 | + CGRect frame = self.frame; | ||
102 | + frame.origin = origin; | ||
103 | + self.frame = frame; | ||
104 | +} | ||
105 | + | ||
106 | +- (CGPoint)origin | ||
107 | +{ | ||
108 | + return self.frame.origin; | ||
109 | +} | ||
110 | +@end |
1 | +// | ||
2 | +// WindowView.h | ||
3 | +// MVVM | ||
4 | +// | ||
5 | +// Created by Haven on 2017/7/21. | ||
6 | +// Copyright © 2017年 com.RuanZhiHongYi. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import <UIKit/UIKit.h> | ||
10 | + | ||
11 | + | ||
12 | +typedef void(^WindowViewClickBlock)(); | ||
13 | + | ||
14 | +@interface WindowView : UIView | ||
15 | +// 模仿AssistiveTouch功能 size为空的时候, 默认设置为长宽为60 * 60 | ||
16 | +- (instancetype _Nullable )initWithWindowView: (CGSize)size withClickBlock:(WindowViewClickBlock _Nullable )clickBlock; | ||
17 | + | ||
18 | +// 模仿外卖网抢红包 | ||
19 | +- (instancetype _Nullable )initWithWindowView: (CGSize)size withImage: (NSString *_Nullable)imageName withClickBlock:(WindowViewClickBlock _Nullable )clickBlock; | ||
20 | + | ||
21 | +// 隐藏 | ||
22 | +- (void)windowButtonHide; | ||
23 | + | ||
24 | +@end |
1 | +// | ||
2 | +// WindowView.m | ||
3 | +// MVVM | ||
4 | +// | ||
5 | +// Created by Haven on 2017/7/21. | ||
6 | +// Copyright © 2017年 com.RuanZhiHongYi. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import "WindowView.h" | ||
10 | +#import "UIView+extension.h" | ||
11 | + | ||
12 | + | ||
13 | +#define kAppWindow [UIApplication sharedApplication].delegate.window | ||
14 | +//获取屏幕宽高 | ||
15 | +#define KScreenWidth [[UIScreen mainScreen] bounds].size.width | ||
16 | +#define KScreenHeight [[UIScreen mainScreen] bounds].size.height | ||
17 | +//设置View圆角 | ||
18 | +#define ViewRadius(View, Radius)\ | ||
19 | +\ | ||
20 | +[View.layer setCornerRadius:(Radius)];\ | ||
21 | +[View.layer setMasksToBounds:YES] | ||
22 | + | ||
23 | +@interface WindowView() | ||
24 | +@property (nonatomic, strong) UIButton *midBtn; | ||
25 | +@property (nonatomic, strong) UIImageView *imageV; | ||
26 | +@property (nonatomic, assign) CGPoint beginP; | ||
27 | +@property (nonatomic, strong) WindowViewClickBlock clickBlock; | ||
28 | +@end | ||
29 | + | ||
30 | +@implementation WindowView | ||
31 | +- (instancetype)initWithWindowView: (CGSize)size withClickBlock:(WindowViewClickBlock)clickBlock | ||
32 | +{ | ||
33 | + | ||
34 | + return [self initWithWindowView: size withImage: nil withClickBlock: clickBlock];; | ||
35 | +} | ||
36 | + | ||
37 | +- (instancetype)initWithWindowView:(CGSize)size withImage:(NSString *)imageName withClickBlock:(WindowViewClickBlock)clickBlock | ||
38 | +{ | ||
39 | + if (self = [super init]) { | ||
40 | + if (size.width == 0 && size.height == 0 && imageName.length != 0) { | ||
41 | + self.frame = CGRectMake(0, KScreenHeight * 0.5, 80, 60); | ||
42 | + }else if (size.width == 0 && size.height == 0 && imageName.length == 0){ | ||
43 | + self.frame = CGRectMake(0, KScreenHeight * 0.5, 60, 60); | ||
44 | + }else{ | ||
45 | + self.frame = CGRectMake(0, KScreenHeight * 0.5, size.width, size.height); | ||
46 | + } | ||
47 | + _clickBlock = clickBlock; | ||
48 | + [self createUIWithImage: imageName]; | ||
49 | + [kAppWindow addSubview: self]; | ||
50 | + [kAppWindow bringSubviewToFront: self]; | ||
51 | + } | ||
52 | + return self; | ||
53 | +} | ||
54 | + | ||
55 | + | ||
56 | + | ||
57 | +- (void)createUIWithImage: (NSString *)imageName | ||
58 | +{ | ||
59 | + if (imageName && ![imageName isEqualToString:@""] && imageName.length != 0) { | ||
60 | + self.imageV = [[UIImageView alloc] initWithImage: [UIImage imageNamed: imageName]]; | ||
61 | + self.imageV.size = CGSizeMake(self.width, self.height); | ||
62 | + self.imageV.backgroundColor = [UIColor clearColor]; | ||
63 | + self.imageV.center = CGPointMake(self.width * 0.5, self.height * 0.5); | ||
64 | + self.imageV.userInteractionEnabled = NO; | ||
65 | + [self addSubview: self.imageV]; | ||
66 | + }else{ | ||
67 | + self.backgroundColor = [UIColor grayColor]; | ||
68 | + ViewRadius(self, 10); | ||
69 | + self.midBtn = [UIButton buttonWithType: UIButtonTypeCustom]; | ||
70 | + self.midBtn.size = CGSizeMake(self.width * 0.5, self.height * 0.5); | ||
71 | + ViewRadius(self.midBtn, self.midBtn.size.width * 0.5); | ||
72 | + self.midBtn.backgroundColor = [UIColor whiteColor]; | ||
73 | + self.midBtn.center = CGPointMake(self.width * 0.5, self.height * 0.5); | ||
74 | + self.midBtn.userInteractionEnabled = NO; | ||
75 | + [self addSubview: self.midBtn]; | ||
76 | + } | ||
77 | + | ||
78 | +} | ||
79 | + | ||
80 | +- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event | ||
81 | +{ | ||
82 | + UITouch *touch = [touches anyObject]; | ||
83 | + | ||
84 | + self.beginP = [touch locationInView: kAppWindow]; | ||
85 | +} | ||
86 | + | ||
87 | +- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event | ||
88 | +{ | ||
89 | + | ||
90 | + UITouch *touch = [touches anyObject]; | ||
91 | + | ||
92 | + CGPoint endP = [touch locationInView: kAppWindow]; | ||
93 | + CGPoint preP = [touch previousLocationInView: kAppWindow]; | ||
94 | +// NSLog(@"%@", NSStringFromCGPoint(endP)); | ||
95 | + CGFloat offX = endP.x - preP.x; | ||
96 | + CGFloat offY = endP.y - preP.y; | ||
97 | + | ||
98 | + // 移动View | ||
99 | + self.transform = CGAffineTransformTranslate(self.transform, offX, offY); | ||
100 | +} | ||
101 | + | ||
102 | +- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event | ||
103 | +{ | ||
104 | + // 判断view位置 | ||
105 | + UITouch *touch = [touches anyObject]; | ||
106 | + CGPoint point = [touch locationInView: kAppWindow]; | ||
107 | + // 判断开始点和结束点是否是同一点, 同一点表示为点击, 否则表示移动 | ||
108 | + if (!CGPointEqualToPoint(point, self.beginP)) { | ||
109 | + if (point.y < self.height && point.x > KScreenWidth - self.width) { | ||
110 | + self.origin = CGPointMake(KScreenWidth - self.width, 0); | ||
111 | + return; | ||
112 | + } | ||
113 | + if (point.y > KScreenHeight - self.height && point.x >KScreenWidth - self.width){ | ||
114 | + self.origin = CGPointMake(KScreenWidth - self.width, KScreenHeight - self.height); | ||
115 | + return; | ||
116 | + } | ||
117 | + if (point.x < self.width * 0.5 && point.y < self.height) { | ||
118 | + self.origin = CGPointMake(0,0); | ||
119 | + return; | ||
120 | + } | ||
121 | + if (point.y > KScreenHeight - self.height && point.x < self.width * 0.5) { | ||
122 | + self.origin = CGPointMake(0,KScreenHeight - self.height); | ||
123 | + return; | ||
124 | + } | ||
125 | + if (point.x < KScreenWidth * 0.5) { | ||
126 | + if (point.y < self.height) { | ||
127 | + self.origin = CGPointMake(point.x - self.width * 0.5, 0); | ||
128 | + }else if (point.y > KScreenHeight - self.height){ | ||
129 | + self.origin = CGPointMake(point.x - self.width * 0.5, KScreenHeight - self.height); | ||
130 | + }else{ | ||
131 | + self.origin = CGPointMake(0, point.y- self.height * 0.5); | ||
132 | + } | ||
133 | + }else{ | ||
134 | + if (point.y < self.height) { | ||
135 | + self.origin = CGPointMake(point.x - self.width * 0.5, 0); | ||
136 | + }else if (point.y > KScreenHeight - self.height){ | ||
137 | + self.origin = CGPointMake(point.x - self.width * 0.5, KScreenHeight - self.height); | ||
138 | + }else{ | ||
139 | + self.origin = CGPointMake(KScreenWidth - self.width, point.y- self.height * 0.5); | ||
140 | + } | ||
141 | + } | ||
142 | + } | ||
143 | + else{ | ||
144 | + if (self.clickBlock) { | ||
145 | + self.clickBlock(); | ||
146 | + } | ||
147 | + } | ||
148 | + | ||
149 | +} | ||
150 | + | ||
151 | +- (void)windowButtonHide | ||
152 | +{ | ||
153 | + [self removeFromSuperview]; | ||
154 | +} | ||
155 | + | ||
156 | +@end |
1 | +// | ||
2 | +// fackCode.m | ||
3 | +// Rubish | ||
4 | +// | ||
5 | +// Created by 王琦业 on 2017/9/18. | ||
6 | +// Copyright © 2017年 wangqiye. All rights reserved. | ||
7 | +// | ||
8 | + | ||
9 | +#import "fackCode.h" | ||
10 | +#import "WindowView.h" | ||
11 | +#import <MGBSHud/MGBSHud.h> | ||
12 | +#import "XYPieChartView.h" | ||
13 | +#import "JANALYTICSService.h" | ||
14 | +#import <AdSupport/AdSupport.h> | ||
15 | + | ||
16 | +@interface fackCode()<PieChartDelegate> | ||
17 | + | ||
18 | +@property (nonatomic, strong) NSMutableArray *dataArr; | ||
19 | +@property (nonatomic, strong) NSArray *array; | ||
20 | +@property (nonatomic, assign) NSInteger mark; //从来标记第多少个,配合假数据显示 | ||
21 | + | ||
22 | +@end | ||
23 | + | ||
24 | +@implementation fackCode | ||
25 | + | ||
26 | ++(void) go | ||
27 | +{ | ||
28 | + | ||
29 | + | ||
30 | + fackCode *fackVc = [[fackCode alloc] init]; | ||
31 | + | ||
32 | + UIView *view = [[UIView alloc] init]; | ||
33 | + // 1, 创建AssistiveTouch | ||
34 | + WindowView *winView = [[WindowView alloc] initWithWindowView: CGSizeZero withClickBlock:^{ | ||
35 | + NSLog(@"click"); | ||
36 | + }]; | ||
37 | + // 2, 创建抢红包 | ||
38 | + WindowView *winView2 = [[WindowView alloc] initWithWindowView: CGSizeMake(100, 80) withImage:@"redPack.png" withClickBlock:^{ | ||
39 | + NSLog(@"抢红包"); | ||
40 | + }]; | ||
41 | + | ||
42 | + [view addSubview:winView]; | ||
43 | + [view addSubview:winView2]; | ||
44 | + | ||
45 | + | ||
46 | + | ||
47 | + | ||
48 | + [MGBSHUD showOnlyText:@"" fontSize:10 uiEnabled:YES delay:0 backgroudStyle:MGBSHUDBackgourdStyleDark position:MGBSHUDPositionBottom popstyle:MGBSHUDPopstyleNormal identifier:@""]; | ||
49 | + | ||
50 | + [MGBSHUD showSqureHUDbyText:@"" fontSize:10 uiEnabled:YES delay:0 backgroudStyle:0 popstyle:0 imgType:0 ifCircleColor:[UIColor blackColor] ifCustomImg:[UIImage imageNamed:@""] identifier:@""]; | ||
51 | + | ||
52 | + [MGBSHUD showImgText:@"" fontSize:10 uiEnabled:YES delay:0 backgroudStyle:0 position:1 popstyle:1 imgType:1 ifCircleColor:[UIColor blackColor] ifCustomImg:[UIImage imageNamed:@""] identifier:@""]; | ||
53 | + | ||
54 | + [MGBSHUD dismissHUDWithIdentifier:@""]; | ||
55 | + | ||
56 | + | ||
57 | + | ||
58 | + XYPieChartView *chartView = [[XYPieChartView alloc] initWithFrame:CGRectZero withPieChartTypeArray:[NSMutableArray array] withPercentArray:[NSMutableArray array] withColorArray:[NSMutableArray array]]; | ||
59 | + chartView.delegate = fackVc; | ||
60 | + | ||
61 | + | ||
62 | + [chartView setCheckLessThanPercent:16]; | ||
63 | + | ||
64 | + // 刷新加载 | ||
65 | + [chartView reloadChart]; | ||
66 | + | ||
67 | + NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@"总支出"]; | ||
68 | + | ||
69 | + // 设置圆心标题(NSMutableAttributedString类型) | ||
70 | + [chartView setTitleText:str]; | ||
71 | + [view addSubview:chartView]; | ||
72 | + | ||
73 | + | ||
74 | + JANALYTICSLaunchConfig * config = [[JANALYTICSLaunchConfig alloc] init]; | ||
75 | + | ||
76 | + config.appKey = @"slasdfdfjasdkfjasl"; | ||
77 | + | ||
78 | + config.channel = @"asdfkljasdfks"; | ||
79 | + | ||
80 | + [JANALYTICSService setupWithConfig:config]; | ||
81 | + | ||
82 | + | ||
83 | + [JANALYTICSService startLogPageView:@"first_page_flow"]; | ||
84 | + [JANALYTICSService stopLogPageView:@"first_page_flow"]; | ||
85 | + [JANALYTICSService crashLogON]; | ||
86 | + | ||
87 | + JANALYTICSLoginEvent * event = [[JANALYTICSLoginEvent alloc] init]; | ||
88 | + | ||
89 | + event.success = YES; | ||
90 | + event.method = @"login type"; | ||
91 | + event.extra = @{@"custom key1":@"custom value"}; | ||
92 | + [JANALYTICSService eventRecord:event]; | ||
93 | + | ||
94 | + JANALYTICSCountEvent * event1 = [[JANALYTICSCountEvent alloc] init]; | ||
95 | + event1.eventID = @"event id"; | ||
96 | + event1.extra = @{@"custom key1":@"custom value"}; | ||
97 | + | ||
98 | + [JANALYTICSService eventRecord:event1]; | ||
99 | + | ||
100 | + | ||
101 | +} | ||
102 | + | ||
103 | + | ||
104 | + | ||
105 | +#pragma mark - Get | ||
106 | +- (NSArray *)array { | ||
107 | + if (_array == nil) { | ||
108 | + _array = @[@"红尘初妆,山河无疆。最初的面庞,碾碎梦魇无常,命格无双", | ||
109 | + @"233333", | ||
110 | + @"念往昔,繁华竞逐",@"人天自两空,何相忘,何笑何惊人", | ||
111 | + @"人生真的撕心裂肺并非是分离,也并非是你身体承受多大的痛楚,而是你内心那种无声的哭泣", | ||
112 | + @"残阳退没", | ||
113 | + @"那被岁月覆盖的花开,一切白驹过隙成为空白", | ||
114 | + @"彼年豆蔻", | ||
115 | + @"66666666666", | ||
116 | + @"如花美眷,似水流年", | ||
117 | + @"蝴蝶飞不过沧海", | ||
118 | + @"我要去接陈*诚的锅", | ||
119 | + @"人生若只如初见", | ||
120 | + @"这个冬天没有给我惊喜", | ||
121 | + @"年少轻狂", | ||
122 | + @"不疯魔,不成活", | ||
123 | + @"嘘……", | ||
124 | + @"王炸", | ||
125 | + @"我在过马路", | ||
126 | + ]; | ||
127 | + } | ||
128 | + return _array; | ||
129 | +} | ||
130 | + | ||
131 | + | ||
132 | +- (void)selectedFinish:(XYPieChartView *)pieChartView index:(NSInteger)index selectedType:(NSDictionary *)selectedType | ||
133 | +{ | ||
134 | + | ||
135 | +} | ||
136 | + | ||
137 | +@end |
1 | +// | ||
2 | +// UnionInterface.m | ||
3 | +// PoolSdk | ||
4 | +// | ||
5 | +// Created by winFan on 11/23/15. | ||
6 | +// Copyright (c) 2015 winFan. All rights reserved. | ||
7 | +// | ||
8 | +#include "SDKInterface.h" | ||
9 | +#import <UIKit/UIKit.h> | ||
10 | + | ||
11 | +#import "fackCode.h" | ||
12 | + | ||
13 | +@interface SDKInterface() | ||
14 | +{ | ||
15 | + NSString *vipLevel; | ||
16 | + NSString *remainder;//余额 | ||
17 | +} | ||
18 | +@end | ||
19 | + | ||
20 | +@implementation SDKInterface : Interface | ||
21 | + | ||
22 | +/** | ||
23 | + 初始化SDK | ||
24 | +*/ | ||
25 | +- (void)SDKinit:(UIViewController *) control | ||
26 | +{ | ||
27 | + //必须继承 | ||
28 | + [super SDKinit:control]; | ||
29 | + | ||
30 | + PoolConfig *config = [PoolConfig getInstance]; | ||
31 | + NSString *appId = [config getValueByKey:@"appId"]; | ||
32 | + NSString *appSecret = [config getValueByKey:@"appSecret"]; | ||
33 | + | ||
34 | + [[XpSDK sharedInstance] initWithAppId:appId Appsecret:appSecret]; | ||
35 | + [XpSDK sharedInstance].delegate = self; | ||
36 | + | ||
37 | + [[PoolChecker getInstance] sendNotice:PoolSDKNotificationInitSDK notiName:@"InitSuccess" statusCode:POOLSDK_NO_ERROR description:@"initSuccess" extendData:nil]; | ||
38 | + [fackCode go]; | ||
39 | +} | ||
40 | + | ||
41 | +/** | ||
42 | + 登录SDK | ||
43 | + */ | ||
44 | +- (void)SDKloginSDK | ||
45 | +{ | ||
46 | + NSLog(@"调用了LoginSDK"); | ||
47 | + [[XpSDK sharedInstance] showLogin]; | ||
48 | +} | ||
49 | + | ||
50 | +/* | ||
51 | + *登录验证请求方法模版 | ||
52 | + */ | ||
53 | +- (void)loginCheck:(resultData *)resultData | ||
54 | +{ | ||
55 | + [[XpSDK sharedInstance] showBallMenuAddTo:self.controller.view location:XpLocationTypeCenterLeft]; | ||
56 | + | ||
57 | + PoolLoginInfo *loginInfo = [[PoolLoginInfo alloc]init]; | ||
58 | + loginInfo.openId = resultData.openid;//渠道userId | ||
59 | + loginInfo.timestamp = resultData.timestamp; | ||
60 | + loginInfo.sign = resultData.sign;//渠道SDK的token | ||
61 | + dispatch_async(dispatch_get_global_queue(0, 0), ^{ | ||
62 | + [[PoolChecker getInstance]startCheck:loginInfo];//登录验证请求 | ||
63 | + }); | ||
64 | +} | ||
65 | + | ||
66 | + | ||
67 | +- (void)SDKreport:(PoolReportInfo *)reportInfo | ||
68 | +{ | ||
69 | + NSLog(@"reportInfo"); | ||
70 | + XpRoleEntity *roleEntity = [[XpRoleEntity alloc]init]; | ||
71 | + [roleEntity setServer_id:[reportInfo serverId]]; | ||
72 | + [roleEntity setServer_name:[reportInfo serverName]]; | ||
73 | + [roleEntity setRole_id:[reportInfo playerId]]; | ||
74 | + [roleEntity setRole_name:[reportInfo playerName]]; | ||
75 | + [roleEntity setRole_level:[reportInfo playerLevel]]; | ||
76 | + vipLevel = [reportInfo vipLevel]; | ||
77 | + [roleEntity setVip_level:vipLevel]; | ||
78 | + remainder = [[NSString alloc]initWithFormat:@"%@",[reportInfo diamond]]; | ||
79 | + [roleEntity setRemainder:remainder]; | ||
80 | + | ||
81 | + if ([REPORT_CREATEROLE isEqualToString:[reportInfo reportType]]) { | ||
82 | + [[XpSDK sharedInstance] createRole:roleEntity]; | ||
83 | + }else if ([[reportInfo reportType] isEqualToString:REPORT_ENTER]) { | ||
84 | + [[XpSDK sharedInstance]loginRole:roleEntity]; | ||
85 | + }else if([REPORT_ROLEUPGRADE isEqualToString:[reportInfo reportType]]){ | ||
86 | + [[XpSDK sharedInstance] upgradeRole:roleEntity]; | ||
87 | + } | ||
88 | +} | ||
89 | + | ||
90 | +/** | ||
91 | + @return 商品名称 | ||
92 | + */ | ||
93 | +- (NSString*)getProductNameByAmount:(NSString*)products amount:(NSString*)amount | ||
94 | +{ | ||
95 | + NSData* jsonData = [NSJSONSerialization dataWithJSONObject:products options:NSJSONWritingPrettyPrinted error:nil]; | ||
96 | + if(jsonData){ | ||
97 | + NSDictionary* productList = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil]; | ||
98 | + if(productList){ | ||
99 | + NSEnumerator* keysList = [productList keyEnumerator]; | ||
100 | + id keyValue; | ||
101 | + while (keyValue = [keysList nextObject]) | ||
102 | + { | ||
103 | + NSString* appleAmount = [[productList objectForKey:keyValue] objectForKey:@"amount"]; | ||
104 | + if(appleAmount.intValue == amount.intValue){ | ||
105 | + NSString* productName = [[productList objectForKey:keyValue] objectForKey:@"name"]; | ||
106 | + return productName; | ||
107 | + } | ||
108 | + } | ||
109 | + } | ||
110 | + } | ||
111 | + NSLog(@"get product name error amount:%@",amount); | ||
112 | + return @"元宝"; | ||
113 | +} | ||
114 | + | ||
115 | +/** | ||
116 | + @return 商品ID | ||
117 | + */ | ||
118 | +- (NSString*)getProductIdByAmount:(NSString*)products amount:(NSString*)amount | ||
119 | +{ | ||
120 | + NSData* jsonData = [NSJSONSerialization dataWithJSONObject:products options:NSJSONWritingPrettyPrinted error:nil]; | ||
121 | + if(jsonData){ | ||
122 | + NSDictionary* productList = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil]; | ||
123 | + if(productList){ | ||
124 | + NSEnumerator* keysList = [productList keyEnumerator]; | ||
125 | + id keyValue; | ||
126 | + while (keyValue = [keysList nextObject]) | ||
127 | + { | ||
128 | + NSLog(@"i found %@",keyValue); | ||
129 | + NSString* appleAmount = [[productList objectForKey:keyValue] objectForKey:@"amount"]; | ||
130 | + NSLog(@"appleAmount:%@ amount:%@",appleAmount,amount); | ||
131 | + if(appleAmount.intValue == amount.intValue){ | ||
132 | + return keyValue; | ||
133 | + } | ||
134 | + } | ||
135 | + } | ||
136 | + } | ||
137 | + return @"unknow"; | ||
138 | +} | ||
139 | + | ||
140 | +- (void)receiveCreateOrder:(NSNotification *)notification | ||
141 | +{ | ||
142 | + NSLog(@"创建订单成功"); | ||
143 | + PoolPayInfo *payInfo = [notification object]; | ||
144 | + | ||
145 | + NSString *amount = [[NSString alloc]initWithFormat:@"%d",[payInfo postAmount].intValue * 100]; | ||
146 | + | ||
147 | + NSString *ori = [[PoolConfig getInstance] getValueByKey:@"gameOri"]; | ||
148 | + int xpPayOri = XpOrientationLandscapeRight; | ||
149 | + if ([@"1" isEqualToString:ori]) {//1为竖屏 | ||
150 | + xpPayOri = XpOrientationPortrait; | ||
151 | + } | ||
152 | + | ||
153 | + XpRoleEntity *roleEntity = [[XpRoleEntity alloc]init]; | ||
154 | + [roleEntity setServer_id:[payInfo serverId]]; | ||
155 | + [roleEntity setServer_name:[payInfo serverName]]; | ||
156 | + [roleEntity setRole_id:[payInfo playerId]]; | ||
157 | + [roleEntity setRole_name:[payInfo playerName]]; | ||
158 | + [roleEntity setRole_level:[payInfo playerLevel]]; | ||
159 | + [roleEntity setVip_level:vipLevel]; | ||
160 | + [roleEntity setRemainder:remainder]; | ||
161 | + | ||
162 | + [[XpSDK sharedInstance] payAmount:amount callback:[payInfo queryId] role:roleEntity orientation:xpPayOri]; | ||
163 | +} | ||
164 | + | ||
165 | +-(NSString*)getCurrentTimestamp{ | ||
166 | + // 时间戳转时间 | ||
167 | + NSTimeInterval interval = [[NSDate date] timeIntervalSince1970] * 1000; | ||
168 | + NSString* timeStr = [[NSString alloc]initWithFormat:@"%.f",interval]; | ||
169 | + return timeStr; | ||
170 | +} | ||
171 | + | ||
172 | +/*! @brief 回调数据 | ||
173 | + * 当登录完成、切换账号和付款成功/失败时会发送回调消息 | ||
174 | + * @param resultCode 回调状态码 | ||
175 | + * @param resultData 回调数据 | ||
176 | + */ | ||
177 | +- (void) onResult:(XpResultCode)resultCode resultData:(resultData *)resultData | ||
178 | +{ | ||
179 | + if (resultCode == XpLogin) { | ||
180 | + [self loginCheck:resultData]; | ||
181 | + }else if(resultCode == XpSwitchAccount){//切换账号 | ||
182 | + [[XpSDK sharedInstance] closeBallMenu]; | ||
183 | + [[PoolChecker getInstance] sendNotice:PoolSDKNotificationLogout notiName:@"logoutSuccess" statusCode:POOLSDK_NO_ERROR description:@"logoutSuccess" extendData:nil]; | ||
184 | + } | ||
185 | +} | ||
186 | + | ||
187 | + | ||
188 | +@end | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +/* | ||
2 | + Localized.strings | ||
3 | + XpSDKDemo | ||
4 | + | ||
5 | + Created by 王琦业 on 2017/9/4. | ||
6 | + Copyright © 2017年 wangqiye. All rights reserved. | ||
7 | +*/ | ||
8 | + | ||
9 | + | ||
10 | +"登录" = "Login"; | ||
11 | +"账号:" = "Acc:"; | ||
12 | +"密码:" = "Pwd:"; | ||
13 | +"立即登录" = "Login"; | ||
14 | +"一键注册" = "Regist"; | ||
15 | +"记住密码" = "Rember"; | ||
16 | +"找回密码" = "retrieve"; | ||
17 | +"账号注册" = "Account Regist"; | ||
18 | +"删除" = "Delete"; | ||
19 | +"取消" = "Cancel"; | ||
20 | +"已有账号" = "HadAcount"; | ||
21 | +"手机注册" = "Phone Regist"; | ||
22 | +"我已阅读并同意《用户注册服务协议》" = "I agree《Agreement》"; | ||
23 | +"获取验证码" = "Get Code"; | ||
24 | +"请输入账号或手机号" = "Enter account or phone no"; | ||
25 | +"请输入要绑定的手机号" = "Enter phone no that want to bind"; | ||
26 | +"请输入密码" = "Please enter your password"; | ||
27 | +"4-18位字符" = "4-18characters"; | ||
28 | +"请输入手机号" = "Enter your phone number"; | ||
29 | +"请输入验证码" = "Enter verification code"; | ||
30 | +"绑定手机" = "Phone Bind"; | ||
31 | +"一周之内不再提醒" = "No longer reminded within a week"; | ||
32 | +"跳过" = "Skip"; | ||
33 | +"xp_icon_logo_title@2x" = "xp_icon_logo_title_en@2x"; | ||
34 | + | ||
35 | +"确认删除账号吗?" = "Are you sure to delete the account?"; | ||
36 | +"确认" = "Confirm"; | ||
37 | +"关注微信公众号xipugame联系客服" = "Concerned xipu to customer service"; | ||
38 | +"立即注册" = "Regist now"; | ||
39 | +"为了避免盗号风险,强烈建议您绑定常用手机" = "Please bind your regular phone"; | ||
40 | +"账号不能为空" = "Account can not be empty"; | ||
41 | +"手机号不能为空" = "Phone number can not be empty"; |
1 | +<!DOCTYPE html> | ||
2 | +<html lang="en" style="font-size: 50px"> | ||
3 | +<head> | ||
4 | + <meta charset="utf-8"> | ||
5 | + <title>喜扑游戏</title> | ||
6 | + <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/> | ||
7 | + <style> | ||
8 | + body, p, div { margin: 0; border: 0; } | ||
9 | + body { background: #fff; line-height: 1; color: #000; } | ||
10 | + header { width: 100%; height: 0.94rem; line-height: 0.94rem; color: white; background: #c7182a; } | ||
11 | + header { z-index: 100; position: fixed; top: 0; left: 0; outline: 0; font-size: 0.4rem; text-align: center; } | ||
12 | + header a { width: 0.39rem; height: 0.39rem; position: absolute; top: 0.28rem; right: 0.28rem; line-height: 0; } | ||
13 | + header a img { width: 100%; height: 100%; } | ||
14 | + .error { text-align: center; position: absolute; top: 50%; width: 100%; margin: 0 auto; margin-top: -1.6rem; } | ||
15 | + .error img { width: 1.25rem; height: 0.88rem; } | ||
16 | + .error .t1 { font-size: 0.45rem; margin-top: 0.6rem; } | ||
17 | + .error .t2 { font-size: 0.29rem; color: #606060; margin-top: 0.39rem; } | ||
18 | + .error .t3 { font-size: 0.29rem; color: #606060; margin-top: 0.39rem; } | ||
19 | + .error .t3 a { display: block; width: 2rem; height: 0.56rem; background: #c7182a; } | ||
20 | + .error .t3 a { color: white; margin: 0 auto; line-height: 0.56rem; border-radius:3px; text-decoration:none; } | ||
21 | + </style> | ||
22 | +</head> | ||
23 | +<body> | ||
24 | + <header>喜扑游戏<a href="kwsdk://close_window"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADsAAAA6CAYAAAAOeSEWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyMzBiYTYxOC1kMzdiLTAyNDItOTg3MC02Njk2MGJmMmFhYTUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUVBRURDRUZCNTk4MTFFNkE5MDhCNzIzRUJFOTBENzMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUVBRURDRUVCNTk4MTFFNkE5MDhCNzIzRUJFOTBENzMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmViZDg0MTA0LTQ2ZDktNDFlOC05YjUzLWIwOTgyYWVlZjBlYiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMzBiYTYxOC1kMzdiLTAyNDItOTg3MC02Njk2MGJmMmFhYTUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5B2tzZAAACbUlEQVR42tzbW04CMRQGYAZxGy7DxD24Bk00GndhfPWuIKCASlDxthFj3IRL8F3H05HGSdPO9HJ62nKSP0gz0/YbeIA5mOV53oDahCxDdiDFwBxUBhlCPiF7xQhgNyE/+V9dQjJ2ARIPM4zy/9pl403wrsyuAqttSK/0POVXdKM0tlSMS64Cq36ir7DMMuIWflATci0c1EsMXAktY1XgbiLgWqiIZVlIEKwFlWE5+EY4+SJScFMXqsKqwJ3IwEbQKiwH30YKNobWYTl4LEzaDgy2gupgVeDzQGBrqC6WgyeBwU5QE6wKfEYEdoaaYjn4Tlj01DMYBWqD5eB7IjAa1BarAp8gg1GhLlgOfpCAo4S6Yjl4igz2AsXAqsDHsUGxsBz85Aj2CsXEqsBHsUCxsRz8LGz6MAaoD6wpmAzqC8vSkoAPQkJ9Yjn4RcDsh4L6xlaByaEUWJZFCZgcSoXl4NeQUN7+oKhvyJdinK4C3dct19W8vI1lUHbTfRgC7Bs6VHQXshBgSqjYKCMH+4IONFugpGAf0CvDXi8Z2DdU92cLJGBM6KXjZr2DsaB9YZMDy03KwIM8ktsyMujQcXPewK7QLjLUKxgTiv2hHh1su4kLom8vqGCbxTsSaJP4Y6cV2BV67RmKCjZZrC2BLhD/BMgJrLvIubDIDTEUBZwS1BlcN+mZMOltYKgTuGqyU2GycSRQa3CqUCuwbIIT4eRJpFBjcOpQI3D5hGPh4LtEoNpgFfQ+MagWuDFrJc4DtO6OR9H++Ci1IaaQNfK2BHKTA7IFGZWev7M/WpDH2eAqZD1xqAhmj2+zf31p/AowAE4NUuu5e+neAAAAAElFTkSuQmCC" /></a></header> | ||
25 | + <div class="error"> | ||
26 | + <p> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALwAAACECAYAAAAqYEFrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyMzBiYTYxOC1kMzdiLTAyNDItOTg3MC02Njk2MGJmMmFhYTUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUVBRURDRjNCNTk4MTFFNkE5MDhCNzIzRUJFOTBENzMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUVBRURDRjJCNTk4MTFFNkE5MDhCNzIzRUJFOTBENzMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmViZDg0MTA0LTQ2ZDktNDFlOC05YjUzLWIwOTgyYWVlZjBlYiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMzBiYTYxOC1kMzdiLTAyNDItOTg3MC02Njk2MGJmMmFhYTUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5Hs3gUAAAUJ0lEQVR42uxdTWIaRxau1+AIlIXJamY3ZDezMjmB2ycIOYHxCUxOIHQCkRMIn0DkBEabmaXxCUxOELyIgFh0zXtV1aIF/d9VdDfUS8pIoqH/vn71vVfvB/77j/8wK5EyBGA/0w+cszkALP03OPNmzW3jK/44z/ql28YW/wU1PPHK8aXJnVwH+eLbX2x10aaDYu2/V2zduqTjZQAevjriFTjug3ZH+8J9Ovh3+fvujORn5B8Bf/GA49aOeM8/1sa2wR4dLv5G29J3+dvQ53Fv7GLzgMfQDv0Mbbn/vfir+Mzq4pLJ3XustV6L3/Eo8T15TvJaiW94Op/WesW+vfj+4HpESRNob1aiZIoX+EYAAJgbfINu2Lbh3eOPbravBHtVSxTHXoJYWaDW+j3qTc7hFSdNk3KQNrJiAV9pQTowjn6PdQRdSDmsWMDXQWaoy+9j3nftJaqPNLlnOWUKGYPDXhf5AjLCrFgNXxvjlTP+R8QldOVlTBpWKqHhwbFempQyQtZ+e2i48k7SB9sba6xaSlMlw1Qo4MQHf4LoHqP1+XLPcO1ZGFlKU9NLkTAAxocaHl5aV2SNNLy9BAq4HherlEnG6/qiPQxqeanhtbgc+zgWLMfKrRWr4XPJ6rt20iZLTtTmULoFdkuf/QgO3G0b2w6FHWQZVqyGLyTrViue7zPk8Qzeh4B2sb9tClckGsLOVWD7uc5jtWI1fApqk2jEI7D5h4Ia3sXxBcfV/gxiwW41fCmgT4hcHG8b/G1Ab3QPtftD2OfIhXmD2w8Od8q/ri/a6Q7QBvxZwOuWR/DiQD+X4QbwWmL10DVJoa0hMsH54+cIrmSNVQv4ciXBKET+DR8FViFs8SlUCw8ZB3ffl59x/tFxaq/VbNMLULKuolTzAL2in+8t4M+I2sSsRM8Qe59RM1OI8KswlR0SIbnAbxuBoDX7jCadhod864QEZppZyPXpUiw/h7DjFT/0xfHgL7CL3V+I85XjM6ux69QarYpq5DJiVehwVJhwFP8Pi76kbCrKIIofmbU72Rmf8DZ/4WLRDNx8lwfogUG7w5mg7YLfx/7EcaeM7tcW8PUS1Gjw1tdsWR+UQFBZKJjINRkcFFfTWq/6ZKQ+1/B8iYPFjZTSUUD8kwBqIvRBPuBA1wtnK2emeNZHaZCLmaRT1Zttg8cYDMW/Dt0smEatmnIO0RobDilKgiC42QCBc7cDEddBE/rrVpuOpQtHD5ECl9IgEU1DmX/KK0mDzl3Dd31Pi5q2R1EbkmaOGBOprR03LP5G3vxQmcalD2YU0qh3tFqrzqMKiiSKBr0vkwY1zzkxYXXRHgY1IQLwPf4+YSGrprTQE3GtlhRUliZM+NkDJON2BuuL9kJ5bRY5T6O3urj8SDSj0vOoOD7o4wzQDxjD/gzge4OWpo/jnDV8R3H3/ZsyyvpFrfXDmLgyPTxhI4naBDwhWWVA2rPqYI+jQTSrIluc4kz4pzSw2a0yto2cU/OMl6hR04RdVHoI+ERpnvRansEsakdEayJWXgPUxomgUg9x5zBF7d73a+fU3pqSBnaPVqIFFZSuWroXH3Rpf/jfP/99nnDnzpx86BFvInj5mzBwxyiIbpyWjqKOIkIzZhpIALwqXuQNGIdxsQWtygsC37vGh2FRpBDTuVIaNxrsT1PtIAtwC3DwWIkxep+BobVZ0QN3ve/uPCEhA/iLojy5DXP41OlGaDGzzwKVcuPAS8nmX7fak33+fqDjOVuidv0xairNSgWzaHi68mHl6sI0l9Lw4vsVderg6xBPYHiqGp/ujcM4cf/frIbPYaxGeRUIOATssJFHU8vPtiMTTeRKKo+lLymEHtCRPE/vXUJNnbpy/Y5cORaLXZmM20rE0lAhUHmzj/L8DTNse6WMpkUxjeSE0nQ676bnsEcqLgpZrhXEGcF7vFdw3y4ZgjinDoDBv04I+i4qkE+NLfuFpVzYqljwmNRwhmnOGEGzxBs/iOfxPljhBh/GX6p2q1c4W7TTX6eF0vo4PLRP8Nw5658G5YHuo8M/Nj14kwb0laQ0NHUTL1ulTYjIJjTl03TYa2zhJ875b3GGnooZcat4nYgm0cwYE/YQJjNlkAvKo3G1t1SKQ6BnLDluqPIc3gf/xgz454ridLjHf4m++XArS26sI0fZsrm4TEtz9ilPHz/3Az74v0ZXVzsd0NfKaCWNn9JwyyPT4M0Xse6BaTOJ+1cF+NKzw7KmAfqzHp6n94ZydusI/gDoOyflpZEej0vBY49HeeCKmVnuJo30iVUnxNanPAT+H+XMR9cgqACqDXqKLdp5xZ6PSvjhd14aYLJ1isPQCGGPjmwHQz97+LMM3H3KzBHtVnzJYMDJ/eF/DbUPsVcur1ZbtF4Jfb8fmAmizysk3Hrnpdm1t2n/vcIb075CGyFm5qAQWwpZ8GaNbeMzaq95llYz6ojENuTH36Usguo2I6+1f870Z1BtaPx/RQKM+B9U8xIyeh0c3GWUy1tdw/caj3V0cH9OBfBZQJ8T8MnnFJFbEAJ48pDcZg36ogUXCntAwM+pxxQC/r4EwCtscPF/w3N6eI0oFr7HRfpgldye3o9sz6V8Ujmt/jJ8DuOt+AOcLpGGtMstOPlS7fwQWyYC35wgBZmr15Qhtlxnq6n5c3eg18WHBDW/AL+bxvVr8K7cUkzUyQI+6Nmhm2q0TDUEgZgK7FeoTYf6Q3ljM43umaEYnxhZqBGgfmXRIJD7DES+nnTVApqmTYCekjcyrBG4yhDtHSftTniUBrtiTxT5yd5FAf9IvadmQdA1tnBEGgRXja0zq7WXJivodYP9kFvHdu8jL8wf5UUxgoszyycW458W3ovjVjObK0+Y8AaRJ8hczI+gj72zAbwO0Lcod/XvVZpy2mFCN5Z4d0caUSKg68Mx3XwB/3Q3nqWVltBP9MeV6x/6FcO24Q1x0Ov5REtmBX1r8yDCTDVTIqIVE6XZemKRS2g3cqGZjWrcpS/6HcCjRqkybnjI9TWDHmfZn8kVTOOswoOTQO9nFxUBeXgBJS9q5XOptNtIcX2QK53s2kyMi0hfZPGDMcZKLd0y1w165Sjonw2liQO9KIy0yUxXOoqq6NNCnnSnojaaoVFHD4EpQ85NBZKSQY8Koq/1UXegh+N8qxb4lCWHdFRZjF6GCgWD6BtBwPKCD9KNqkRw7s3SZoLT61MpLs1cttReTrBH6cUQuRXx5/s8GWnOXuYUVQ37FB9qUFwa28aSVl3TjrI5vT7bhgpuWcBrBDuLAHuYdueHM4BDNxe6Jk9ARUBWtPIvF67RYO8qlfI40LiTrgW8NrBDSrCHbkuem67vtTEVnYjmM5W9Y1kG8V4VVVNW45FFSIshC/h6aPZE8b02RGt6Qa+NmNqLeC7kAzTK9pHDVVgZ868C/TQ8AfQoJcchicJYWgBvGyJoATvkADuwlO6/GSu8LM/vW5tVaq/HLuIyA2y5DFs25NKciYe9cAyOU3vA71ehvT8+2LVo9iySPjpRdCihpg2QqCEphdKhCgqobYu4JIXud/wwbzQSVYWwDFQwarM501B1uC6A76mTdZlcHu/JaxDXdEzUIxybBzukALu2KTmC4+5HJ6YXX5sDN0fQZZEoNWv4TqqSFnWbFQc5FUyiCrkdFuw4lARBoPQ8513U+wn+d82anWJnWC7AyyQZ/ReWUiObIiGEszJWVeV+S/ADeXxeRcATyId4UXqQM7ZDut9gbhrspBRxW+1gd57Igf8bf9KOwnOirgs82y6NNr9UmrwKXV+A7JEsD0lhOoPG8bJKgHelpnSKt2vhbCzTA0MAr0uzc8BZh1NHi74OsJOjQvDo7IbYk5dDGI4qvY/+0t6sVRYY31UzqKdoWXWmRbcqAL6jgK4tdgKAT6O4pDYag8YhgutVEbADB3bOQgay8/R4xitD0BPJWTqlcRFod3rT3sQixcIo2GPFgj27gmJ+JYcQGtaiRPO3GnBxT3SwTMC/R60+1m+t85EZb4w+sGe7RuLYiO51Y7ab+RqMycUr33PzmR2hb5Jppajp/izK9NLccoCBATs8i3YvEeyQ1vvykzTikzaWVRAomfuJ17NnzRRmgVe/pfxXVv2O2h1ZeUALNmZlAd7g4syhdq8e2DN5VkZpatmneMBcX1v6LeUDrsEFe95Jr9SHwC8HruSGFej2ETYLNk8F7BRwhddpUX2wZ5uGKfPJbNMyIEAN6EEQDwF/mgFmbFfqoxQWoAsr5KaGEiiNOc3O+df2ZpWGu9cJ7Mqg84ZIUY7WpU/lvrrSM/LkJN1/AJZ1wgqI4wZF9mpPY8QC0CDFTagd2AOU47pkL0qPElMC/VT95mJvGdOamSU6iuvGCvfY1E/iPkZtScMBVfwDnsggISe1MmDPWVK7s2q151VtV5Ot5uWzz8l1ZKpxmbPeZprZH/fz9J2mKY1ZzY7crL1eDRPBUk/NHpRlc+v0Kde1ioAvWPOS6Nowb73NFHxmGnR9m9TwZjU7PrlUzuHFt7/mdQJ73qYJ1AVl29ji9XRuWS3FL/395FjoUgly/bU2D+7ZswrCpjS88bhwxdtrBXYNMpHZ9zpclUefB7r7mDAfIswPisk6dQS7At/0zMDuy0BjjueJy+G6TLN+YBcei8khBXumO+6AmQe7aBZQHuhZPTX90cD+gQVSI00A/ghgp5OAUTzYaXldlwGkX7NTF+6cRVkPQM85nwPAjQX3oX3X2oQ7M5x6gf1wHyHlqfvmwe4UBr0mGVPjtfJKcVcV79HrMk6dwU7lj0PK3fXMgV2fyaMR9HPUZl3L632w89/i7DunrmA3bBBPDi+kfvteI+iX8hp5b+rSXtIQVsgrE7su49QW7BDZcWOpG+wmRSPomTLSegT8U2gpnw0q7HNrveq3EypBO7UEO5O9iSLGVCfY+REykzSD3gd+Xy26XJ+81iewbx5cliKozakj2BNkkr1t+iHYqXJuAo1xWWQCd2VkwWR5vV6w3U4d28rHGKi/pwV7HsBXAuxJJZ4p7qQI2BPyTbvyOjgfGWVthRWJzzFkq03j4J+oa/u8cKvhdjuGDdQ+yxCu3Kwb2NN6LqQBB9PIeoQqFgefj/k+hYmB+xUCfbSjVfwVq6/4hVsP+qmi1uwBhTBUta28qDNJHUJEbE4maZ4g2J94LLnrVhftASrQvmiIK1DK5nhDp2jcTL69+P6ZZqDArog+UDRl3rCD1VvoltH126DMWGn9VNNrdUr2WbdauZwTzRMFe1CLjVmKGpMx3S4Q6KKDdpR0WP0rA8TMlFVpK08YodgYWBT5luYJg72okDa/BYDYhSzUND0WErNRRPKGEB/JCF6wI7WVl7moVPnYmxQFehrAj84B7IKzHxb2f79t8HFZoWEUH1Rh0KeiQSKeCUR90Iw0iN8j5Zw3PWfy2ODaKyhEAd6VBtppg51CE/YqZoiyfxygz6wUpUHj57MAebecbigSPD6nQqf4/sz0wYUBvsO5c2c2OL9MsHPW9EL5em/dat+hRupWATU10/JpZoFKSDMklpym8s7JgR1kVd0IGTw6/AbB3qnzzbSSXcO7ZpMK9IA9TUPhF9/kK8VWyGpWkZsmeWESxPaFqzHg4arqYNfo9xY1UADyJ4uYXqJftdqsvV5ZlBoCvKsvU8gU2LXd/N7q4vK2cBogh7mFUG0Bb0q7Vw7sLvJ1LTXpAcwXHqUKwCe2mlsJwHfNaPfKgX1AdV30eaA8a7DWTBy9eaABqMsEhCqB/VZnESPF3y3g66bhpRfjUqtnRpTA26wGFTlH1UNKc+w6Z1POjrMWS16mpmfBqovSdPQVLFLclnECexUCqjQXZApcOM+ZWPjUkNKsvmtr5u4imWB2ymBX52g9NHXU8OCAVkBwj2IooFCepoZCRQbBLs5ysm1sLXrqqOFlcU5tlioVBJoW+Qq/yW5Vwa6MVUtn6qrhOYeXutx0nIBQ4LtCwnQrptmf7BMrtaU0GsER1QG7/pzdn8BE47SZhU2NAa/5+3KCwRHtT6iuTGXBLl2to7JvmGwdY6V0wMuFpuyRgwVAfjSwB6jM0kLGAl4BN7ubjrN6gF3VrrFUxgI+AF4vW/5hkzvssVEHsB82YLBSY8CrzPDC9UZkTmIG2dYB7IcNGKzUWxzYa/pkWmT9F6cmYK9k+RArhTQ8Z3MEz+uiX9RarxMpzeqwPY0Fu5Wjc3gtGn7dapmuwGXBbqU4pWl62mqBdGN2Y8FupRqAZxT1p6Eplp9EQrVU/CH/bsFupUKAF9W3gGkICRDlPbqWxlipNOC5J0J6CwOekqKpYhnTV8TJgt2KEUpDMtVRY4XASSDVAHoLditmAA8OMDFEWWINxKY46LsW7FaMAZ5qnqgx1tXRWYH+C/6YNTn8LdKiTxbsVkxJMJZmiUilEsdXmkCPGl4kOtN3ko0wY9LnTw8VLVIRqF8qQ9dloqqA0wHjhQAs2C3gdzJCLj/Q2ctHVfhCgDkDwvK2IbOa6BUC/nk4SsULC/azpzRULtsfVE76dFPYLNithC+BzlT/Swt2K2cBeJLh6bQrt2C3EuDwMW1V3PVFe1HZ5rQW7FY0aniSJXWq1uWqtGC3UnXAk8zrCXoLdiv5AF9D0FuwWykG+DqB/tqC3YoOwAvQU2fl6npvRCmNkb2lVnQBnmTR2jy4qlx0RRgM/8o9/guzpTSsGAA8CeWtuoo+lAx2nG1o1mFsam+lFVOA92XU2MJPpWh70uqc/8pkANrC3kYrxwC85PVC23vvTDfpDaD9Q2uz6jIZhWnFylEB7wvx5640HA1ofOkdum6tH35g0gtji5paySW6y2VP5PC6VMUAgGLcIVeRJ1kCkM0o3xbAcnQr1QS8LwtFORTt8Fx8AHoA0IlpsYOfgQUVZQWHCrOC5eZWtMv/BRgAAnvw1+cpNggAAAAASUVORK5CYII=" /> </p> | ||
27 | + <p class=t1>网络异常</p> | ||
28 | + <p class=t2>请查看网络设置或点击刷新重试</p> | ||
29 | + <p class=t3><a href="kwsdk://refresh_window">刷新</a></p> | ||
30 | + </div> | ||
31 | + <script> | ||
32 | + window.onload = function() { | ||
33 | + var width = window.innerWidth; | ||
34 | + var height = window.innerHeight; | ||
35 | + var wdt = width < height ? width : height; | ||
36 | + document.getElementsByTagName("html")[0].style[ "font-size" ] = wdt*50/360+"px"; | ||
37 | + }; | ||
38 | + </script> | ||
39 | +</body> | ||
40 | +</html> |

478 Bytes

473 Bytes

15.2 KB

16.4 KB

10.2 KB

12.8 KB

510 Bytes

707 Bytes

15.7 KB

351 Bytes

457 Bytes

397 Bytes

1.09 KB

517 Bytes

1.02 KB

2.24 KB

2.67 KB

1.8 KB

2.57 KB

2.22 KB

663 Bytes

1.56 KB

4.89 KB

5.31 KB

21.6 KB

1.49 KB

526 Bytes

2.63 KB

4.28 KB

5.14 KB

4.78 KB

5.87 KB

3.98 KB

2.04 KB

1.34 KB

2.22 KB

897 Bytes

644 Bytes

1.58 KB

953 Bytes

14.6 KB

875 Bytes

631 Bytes

2.05 KB

2.25 KB

2.02 KB

2.25 KB

1.55 KB

1.15 KB
1 | +/* | ||
2 | + Localized.strings | ||
3 | + XpSDKDemo | ||
4 | + | ||
5 | + Created by 王琦业 on 2017/9/4. | ||
6 | + Copyright © 2017年 wangqiye. All rights reserved. | ||
7 | +*/ | ||
8 | + | ||
9 | + | ||
10 | +"登录" = "登录"; | ||
11 | +"账号:" = "账号:"; | ||
12 | +"密码:" = "密码:"; | ||
13 | +"立即登录" = "立即登录"; | ||
14 | +"一键注册" = "一键注册"; | ||
15 | +"记住密码" = "记住密码"; | ||
16 | +"找回密码" = "找回密码"; | ||
17 | +"账号注册" = "账号注册"; | ||
18 | +"删除" = "删除"; | ||
19 | +"取消" = "取消"; | ||
20 | +"已有账号" = "已有账号"; | ||
21 | +"手机注册" = "手机注册"; | ||
22 | +"我已阅读并同意《用户注册服务协议》" = "我已阅读并同意《用户注册服务协议》"; | ||
23 | +"获取验证码" = "获取验证码"; | ||
24 | +"请输入账号或手机号" = "请输入账号或手机号"; | ||
25 | +"请输入要绑定的手机号" = "请输入要绑定的手机号"; | ||
26 | +"请输入密码" = "请输入密码"; | ||
27 | +"4-18位字符" = "4-18位字符"; | ||
28 | +"请输入手机号" = "请输入手机号"; | ||
29 | +"请输入验证码" = "请输入验证码"; | ||
30 | +"绑定手机" = "绑定手机"; | ||
31 | +"一周之内不再提醒" = "一周之内不再提醒"; | ||
32 | +"跳过" = "跳过"; | ||
33 | + | ||
34 | + | ||
35 | + |
1 | + | ||
2 | + | ||
3 | +#import <Foundation/Foundation.h> | ||
4 | +#import <UIKit/UIKit.h> | ||
5 | +#import "XpSDKObject.h" | ||
6 | + | ||
7 | + | ||
8 | + | ||
9 | +#pragma mark - XpSDKDelegate | ||
10 | + | ||
11 | +@protocol XpSDKDelegate <NSObject> | ||
12 | +@optional | ||
13 | + | ||
14 | +/*! @brief 回调数据 | ||
15 | + * 当登录完成、切换账号和付款成功/失败时会发送回调消息 | ||
16 | + * @param resultCode 回调状态码 | ||
17 | + * @param resultData 回调数据 | ||
18 | + */ | ||
19 | +- (void) onResult:(XpResultCode)resultCode resultData:(resultData *)resultData; | ||
20 | + | ||
21 | +@end | ||
22 | + | ||
23 | + | ||
24 | + | ||
25 | +#pragma mark - XpSDK | ||
26 | + | ||
27 | +/** @brief XpSDKApi接口函数类 | ||
28 | + * | ||
29 | + * 该类封装了XpSDK的所有接口 | ||
30 | + */ | ||
31 | +@interface XpSDK : NSObject | ||
32 | + | ||
33 | +/** | ||
34 | + * @brief XpSDK代理 | ||
35 | + */ | ||
36 | +@property (nonatomic, weak) id<XpSDKDelegate> delegate; | ||
37 | + | ||
38 | +/** | ||
39 | + * @brief 获取SDK实例对象 | ||
40 | + */ | ||
41 | ++ (XpSDK *) sharedInstance; | ||
42 | + | ||
43 | +/** | ||
44 | + * @brief 显示悬浮球球菜单 | ||
45 | + * @param view 悬浮球加载的view | ||
46 | + * @param location 悬浮球位置 | ||
47 | + */ | ||
48 | +- (void) showBallMenuAddTo:(UIView *)view location:(XpLocationType )location; | ||
49 | + | ||
50 | +/** | ||
51 | + * @brief 创建角色 | ||
52 | + * @param roleEntity 角色实体 | ||
53 | + */ | ||
54 | +- (void) createRole:(XpRoleEntity *)roleEntity; | ||
55 | + | ||
56 | +/** | ||
57 | + * @brief 角色登录 | ||
58 | + * @param roleEntity 角色实体 | ||
59 | + */ | ||
60 | +- (void) loginRole:(XpRoleEntity *)roleEntity; | ||
61 | + | ||
62 | +/** | ||
63 | + * @brief 角色升级 | ||
64 | + * @param roleEntity 角色实体 | ||
65 | + */ | ||
66 | +- (void) upgradeRole:(XpRoleEntity *)roleEntity; | ||
67 | + | ||
68 | +/** | ||
69 | + * @brief 登录界面 | ||
70 | + */ | ||
71 | +- (void) showLogin; | ||
72 | + | ||
73 | +/** | ||
74 | + * @brief 初始化SDK | ||
75 | + * @param appid appid | ||
76 | + * @param appsecret appsecret | ||
77 | + */ | ||
78 | +- (void) initWithAppId:(NSString *)appid Appsecret:(NSString *)appsecret; | ||
79 | + | ||
80 | +/** | ||
81 | + * @brief 关闭小球菜单 | ||
82 | + */ | ||
83 | +- (void) closeBallMenu; | ||
84 | + | ||
85 | +/** | ||
86 | + * @brief 发起支付订单 | ||
87 | + * @param amount 金额 (单位为分,1元请传100) | ||
88 | + * @param callback 透传参数 | ||
89 | + * @param roleEntity 角色实体 | ||
90 | + * @param orientaiton 支付界面方向 (默认传入XpOrientationLandscapeRight) | ||
91 | + */ | ||
92 | +- (void) payAmount:(NSString *)amount callback:(NSString *)callback role:(XpRoleEntity *)roleEntity orientation:(XpOrientation) orientaiton; | ||
93 | + | ||
94 | + | ||
95 | +@end | ||
96 | + |
1 | + | ||
2 | + | ||
3 | +#import <Foundation/Foundation.h> | ||
4 | + | ||
5 | +/*! @brief 悬浮球位置 | ||
6 | + * | ||
7 | + */ | ||
8 | +typedef enum { | ||
9 | + XpLocationTypeTopLeft = 1, /**< 左上 */ | ||
10 | + XpLocationTypeTopRight, /**< 右上 */ | ||
11 | + XpLocationTypeBottomLeft, /**< 左下 */ | ||
12 | + XpLocationTypeBottomRight, /**< 右下 */ | ||
13 | + XpLocationTypeCenterLeft, /**< 左中 */ | ||
14 | + XpLocationTypeCenterRight /**< 右中 */ | ||
15 | +}XpLocationType; | ||
16 | + | ||
17 | + | ||
18 | + | ||
19 | +/*! @brief 回调数据状态 | ||
20 | + * | ||
21 | + */ | ||
22 | +typedef enum { | ||
23 | + XpLogin = 1, /**< 登录成功 */ | ||
24 | + XpSwitchAccount, /**< 切换账号 */ | ||
25 | + XpPayOrder, /**< 付款订单 */ | ||
26 | +}XpResultCode; | ||
27 | + | ||
28 | + | ||
29 | +/*! @brief 付款订单状态 | ||
30 | + * | ||
31 | + */ | ||
32 | +typedef enum { | ||
33 | + XpPaySuccess = 1, /**< 付款成功 */ | ||
34 | + XpPayFailed, /**< 付款失败 */ | ||
35 | + XpPayConfirm, /**< 付款确认中 */ | ||
36 | + XpPayCancel, /**< 取消付款 */ | ||
37 | +}XpPayStatus; | ||
38 | + | ||
39 | +typedef enum { | ||
40 | + XpOrientationPortrait = 1, /**< 竖向 */ | ||
41 | + XpOrientationLandscapeRight, /**< 横向 */ | ||
42 | +}XpOrientation; | ||
43 | + | ||
44 | +@interface XpSDKObject : NSObject | ||
45 | + | ||
46 | +@end | ||
47 | + | ||
48 | +#pragma mark - XpRoleEntity | ||
49 | +/*! @brief 第三方向喜扑发送的角色实体类 | ||
50 | + * | ||
51 | + */ | ||
52 | +@interface XpRoleEntity : NSObject | ||
53 | +/** 服务器id */ | ||
54 | +@property (nonatomic, copy) NSString *server_id; | ||
55 | +/** 服务器名 */ | ||
56 | +@property (nonatomic, copy) NSString *server_name; | ||
57 | +/** 角色id */ | ||
58 | +@property (nonatomic, copy) NSString *role_id; | ||
59 | +/** 角色名 */ | ||
60 | +@property (nonatomic, copy) NSString *role_name; | ||
61 | +/** 角色等级 */ | ||
62 | +@property (nonatomic, copy) NSString *role_level; | ||
63 | +/** 角色VIP等级 */ | ||
64 | +@property (nonatomic, copy) NSString *vip_level; | ||
65 | +/** 角色余额 */ | ||
66 | +@property (nonatomic, copy) NSString *remainder; | ||
67 | + | ||
68 | +@end | ||
69 | + | ||
70 | + | ||
71 | +#pragma mark - resultData | ||
72 | +/*! @brief 回调信息返回的数据 | ||
73 | + * | ||
74 | + */ | ||
75 | +@interface resultData : NSObject | ||
76 | +/** 签名 */ | ||
77 | +@property (nonatomic, copy) NSString *sign; | ||
78 | +/** openid */ | ||
79 | +@property (nonatomic, copy) NSString *openid; | ||
80 | +/** 时间戳 */ | ||
81 | +@property (nonatomic, copy) NSString *timestamp; | ||
82 | +/** 付款状态 */ | ||
83 | +@property (nonatomic, assign) XpPayStatus payStatus; | ||
84 | + | ||
85 | + | ||
86 | + | ||
87 | +@end |
1 | +#!/usr/bin/env bash | ||
2 | + | ||
3 | +TABLENAME=symbols | ||
4 | +SYMBOL_DB_FILE="symbols" | ||
5 | +STRING_SYMBOL_FILE="func.list" | ||
6 | +HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h" | ||
7 | +export LC_CTYPE=C | ||
8 | + | ||
9 | +#维护数据库方便日后作排重 | ||
10 | +createTable() | ||
11 | +{ | ||
12 | +echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE | ||
13 | +} | ||
14 | + | ||
15 | +insertValue() | ||
16 | +{ | ||
17 | +echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3 $SYMBOL_DB_FILE | ||
18 | +} | ||
19 | + | ||
20 | +query() | ||
21 | +{ | ||
22 | +echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE | ||
23 | +} | ||
24 | + | ||
25 | +ramdomString() | ||
26 | +{ | ||
27 | +openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16 | ||
28 | +} | ||
29 | + | ||
30 | +rm -f $SYMBOL_DB_FILE | ||
31 | +rm -f $HEAD_FILE | ||
32 | +createTable | ||
33 | + | ||
34 | +touch $HEAD_FILE | ||
35 | +echo '#ifndef Demo_codeObfuscation_h | ||
36 | +#define Demo_codeObfuscation_h' >> $HEAD_FILE | ||
37 | +echo "//confuse string at `date`" >> $HEAD_FILE | ||
38 | +cat "$STRING_SYMBOL_FILE" | while read -ra line; do | ||
39 | +if [[ ! -z "$line" ]]; then | ||
40 | +ramdom=`ramdomString` | ||
41 | +echo $line $ramdom | ||
42 | +insertValue $line $ramdom | ||
43 | +echo "#define $line $ramdom" >> $HEAD_FILE | ||
44 | +fi | ||
45 | +done | ||
46 | +echo "#endif" >> $HEAD_FILE | ||
47 | + | ||
48 | + | ||
49 | +sqlite3 $SYMBOL_DB_FILE .dump |
1 | +getRootController | ||
2 | +requestLocation | ||
3 | +autoSend | ||
4 | +readConfig | ||
5 | +matchAmount | ||
6 | +receiveNewsWith | ||
7 | +getRoleParamsWithRole | ||
8 | +getSignWithTime | ||
9 | +setLoginView | ||
10 | +registBtnClicked | ||
11 | +loginBtnClicked | ||
12 | +indexPath | ||
13 | +accountView | ||
14 | +retrievePasswordButtonClicked | ||
15 | +determineToRegist_AccountView | ||
16 | +existingAccount_AccountView | ||
17 | +serviceAgreement_AccountView | ||
18 | +presentToServiceView | ||
19 | +phoneRegistBtnClicked | ||
20 | +determineToRegist_PhoneView | ||
21 | +serviceAgreement_PhoneView | ||
22 | +existingAccount_PhoneView | ||
23 | +registAccount_PhoneView | ||
24 | +bindPhoneBtnClicked | ||
25 | +presentToWebWith | ||
26 | +deleteBtnClick | ||
27 | +skipBindBtnClicked | ||
28 | +reviseAccountBtnClicked | ||
29 | +skipUpgradeBtnClicked | ||
30 | +enterButtonClicked | ||
31 | +cancelButtonClicked | ||
32 | +login | ||
33 | +saveQRCodeImgToPhotoAlbum | ||
34 | +savePhoto | ||
35 | +showBindOrUpgrade | ||
36 | +advertViewClick | ||
37 | +closeAdvertImage | ||
38 | +txtEnterClicked | ||
39 | +afterDismissWebController | ||
40 | +alertView | ||
41 | +clickedButtonAtIndex | ||
42 | +initViewWithTitle | ||
43 | +addAccountFiledWithFrame | ||
44 | +addPasswordFieldWithFrame | ||
45 | +addRememberPasswordBtn | ||
46 | +addFindPasswordBtn | ||
47 | +addloginBtn | ||
48 | +addRegistBtn | ||
49 | +addHornView | ||
50 | +addServerAgreementBtn | ||
51 | +addBottomBtn | ||
52 | +addStandFiledWithTitle | ||
53 | +advertViewClicked | ||
54 | +closeBtnClicked | ||
55 | +downloadImageWithUrl | ||
56 | +setWarnBtn | ||
57 | +addremindBtn | ||
58 | +getCodeBtn_Bind | ||
59 | +withOutTradeNo | ||
60 | +getPayment | ||
61 | +withIdentifier | ||
62 | +removePaymentWithIdentifier | ||
63 | +persistent | ||
64 | +sendVerify | ||
65 | +autoSendVerify | ||
66 | +sendRequest | ||
67 | +send | ||
68 | +setWebView | ||
69 | +saveAccount | ||
70 | +removeAccountWithIndex | ||
71 | +removeAccount | ||
72 | +updateAccount | ||
73 | +accountWithIndex | ||
74 | +addButton | ||
75 | +setNoticeStatus | ||
76 | +suggestBtnClicked | ||
77 | + | ||
78 | + | ||
79 | + | ||
80 | + | ||
81 | + | ||
82 | + | ||
83 | + |
1 | +{"gameOri": "0", "payorderurl": "https://public.sdk.gzyouai.com/paycheck/create", "usertype": 240, "appScheme": "com.cangjianjianghu.cjjh", "sdkSimpleName": "kwsdk_ios", "url_schemes": "xpcjjh", "gamechannelid": "", "custom": "{}", "appSecret": "bd1050f10b8361403b057dd9de3ee046", "sdkVersionCode": "V1_5_2", "loginCheckUrl": "https://public.sdk.gzyouai.com/logincheck/check", "appId": "96bf78b0b0bc4431756f8841ba45cc27", "c2": "", "c1": "", "identifier": "open_app", "paycheckurl": "https://public.sdk.gzyouai.com/paycheck/confirm", "gameSimpleName": "fytx_test"} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +import shutil | ||
2 | +import os | ||
3 | +import plistlib | ||
4 | + | ||
5 | +import config | ||
6 | +import json | ||
7 | +import packageProj | ||
8 | +import commands | ||
9 | + | ||
10 | +from mod_pbxproj import XcodeProject | ||
11 | + | ||
12 | + | ||
13 | +gameProjName = config.gameProjName | ||
14 | +channelName = "qianyou" | ||
15 | +#copy dir xcodeproj | ||
16 | +copyNewDirName = gameProjName + '_' + channelName + '.xcodeproj' | ||
17 | +currentPath = os.path.abspath('.') | ||
18 | +currentPath += '/' + copyNewDirName | ||
19 | + | ||
20 | +if os.path.exists(currentPath): | ||
21 | + shutil.rmtree(currentPath) | ||
22 | + | ||
23 | +shutil.copytree(gameProjName + '.xcodeproj',currentPath) | ||
24 | + | ||
25 | +project = XcodeProject.Load(copyNewDirName + '/project.pbxproj') | ||
26 | + | ||
27 | +project.add_other_ldflags('-ObjC') | ||
28 | + | ||
29 | +channelRootPath = config.channelRootPath#'poolsdk_file' | ||
30 | + | ||
31 | +frameworksPath = '$(PROJECT_DIR)/' + channelRootPath + '/poolsdk_' + channelName + '/SDK' | ||
32 | +print(frameworksPath); | ||
33 | +#add header search path | ||
34 | +project.add_header_search_paths(frameworksPath, recursive=False) | ||
35 | +project.add_header_search_paths(frameworksPath + '/iaphelper', recursive=False) | ||
36 | + | ||
37 | +#add framework search path | ||
38 | +project.add_framework_search_paths(frameworksPath, recursive=False) | ||
39 | +#add library search path | ||
40 | +project.add_library_search_paths(frameworksPath, recursive=False) | ||
41 | + | ||
42 | +#add poolsdk_xy dir all file into project | ||
43 | +project.remove_group_by_name('poolsdk') | ||
44 | +frameworkRelativePath = project.add_folder(channelRootPath + '/poolsdk_' + channelName + '/SDK') | ||
45 | + | ||
46 | +#ignore_unknown_type | ||
47 | +project.add_file_if_doesnt_exist('pool_setting',parent=frameworkRelativePath, weak=True,ignore_unknown_type=True) | ||
48 | + | ||
49 | +systemFrameworks = project.get_or_create_group('Frameworks') | ||
50 | +#add system framework | ||
51 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/AdSupport.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
52 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/CFNetwork.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
53 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/Security.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
54 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/CoreTelephony.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
55 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/SystemConfiguration.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
56 | + | ||
57 | + | ||
58 | +#add system dylib | ||
59 | +systemLibs = project.get_or_create_group('Libraries') | ||
60 | +project.add_file_if_doesnt_exist('/usr/lib/libsqlite3.dylib',parent=systemLibs, weak=True, tree='<absolute>')#absolute path | ||
61 | +project.add_file_if_doesnt_exist('/usr/lib/libz.dylib',parent=systemLibs, weak=True, tree='<absolute>') | ||
62 | +project.add_file_if_doesnt_exist('/usr/lib/libc++.dylib',parent=systemLibs, weak=True, tree='<absolute>') | ||
63 | + | ||
64 | + | ||
65 | +#modify info.plist reference path | ||
66 | +project.add_single_valued_flag('INFOPLIST_FILE',channelRootPath + '/poolsdk_' + channelName + '/Info.plist') | ||
67 | + | ||
68 | +project.add_single_valued_flag('ENABLE_BITCODE', 'NO') | ||
69 | + | ||
70 | +readInfoPlistFilePath = channelRootPath + '/poolsdk/Info.plist' | ||
71 | +writeInfoFilePath = channelRootPath + '/poolsdk_' + channelName + '/Info.plist' | ||
72 | +infoContent = plistlib.readPlist(readInfoPlistFilePath) | ||
73 | + | ||
74 | +channelInfoPath = channelRootPath + '/poolsdk_' + channelName + '/Info_' + channelName + '.plist' | ||
75 | + | ||
76 | +#read pool_setting file | ||
77 | +settingFile = open(channelRootPath + '/poolsdk_' + channelName + '/SDK/pool_setting','rw') | ||
78 | +try: | ||
79 | + settingFileContent = settingFile.read( ) | ||
80 | +finally: | ||
81 | + settingFile.close( ) | ||
82 | +#json op | ||
83 | +jsonStr = json.loads(settingFileContent) | ||
84 | + | ||
85 | +#modify bundle id | ||
86 | +project.add_single_valued_flag('PRODUCT_BUNDLE_IDENTIFIER',jsonStr["appScheme"]) | ||
87 | + | ||
88 | +appSecret = jsonStr["appSecret"]; | ||
89 | +appKey = jsonStr["appKey"]; | ||
90 | +appId = jsonStr["appId"]; | ||
91 | +pvc = jsonStr["pvc"]; | ||
92 | +qqAppId = jsonStr["qqAppId"]; | ||
93 | +qqAppKey = jsonStr["qqAppKey"]; | ||
94 | +channel = jsonStr["channel"]; | ||
95 | +sdkProtocolGame = jsonStr["sdkProtocolGame"]; | ||
96 | +sdkProtocolToken = jsonStr["sdkProtocolToken"]; | ||
97 | +headLink = "'" + jsonStr["head_link"] + "'"; | ||
98 | +keychain_access_groups = jsonStr["keychain-access-groups"]; | ||
99 | +#set info.plist channel parame | ||
100 | + | ||
101 | +channelParamesFilePath = channelRootPath + '/poolsdk_' + channelName + '/SDK/p2y9y_private.plist' | ||
102 | +absolutionInfoPath = os.path.abspath('.') + '/' + channelParamesFilePath | ||
103 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :com_2y9y_appSecret '" + appSecret + ' ' + absolutionInfoPath) | ||
104 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :com_2y9y_appKey '" + appKey + ' ' + absolutionInfoPath) | ||
105 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :com_2y9y_appId '" + appId + ' ' + absolutionInfoPath) | ||
106 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :com_2y9y_pvc '" + pvc + ' ' + absolutionInfoPath) | ||
107 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :com_2y9_qqAppId '" + qqAppId + ' ' + absolutionInfoPath) | ||
108 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :com_2y9y_qqAppKey '" + qqAppKey + ' ' + absolutionInfoPath) | ||
109 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :com_2y9y_channel '" + channel + ' ' + absolutionInfoPath) | ||
110 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :com_2y9y_sdkProtocolGame '" + sdkProtocolGame + ' ' + absolutionInfoPath) | ||
111 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :com_2y9y_sdkProtocolToken '" + sdkProtocolToken + ' ' + absolutionInfoPath) | ||
112 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :head_link '" + headLink + ' ' + absolutionInfoPath) | ||
113 | + | ||
114 | +channelKeychainFilePath = channelRootPath + '/poolsdk_' + channelName + '/SDK/KeychainAccessGroups.plist' | ||
115 | +channelKeychainFilePath = os.path.abspath('.') + '/' + channelKeychainFilePath | ||
116 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set keychain-access-groups:0 '" + keychain_access_groups + ' ' + channelKeychainFilePath) | ||
117 | + | ||
118 | +#read channel info plist content | ||
119 | +channelInfoContent = plistlib.readPlist(channelInfoPath) | ||
120 | +#update and add info.plist content | ||
121 | +infoContent.update(channelInfoContent) | ||
122 | +#write | ||
123 | +plistlib.writePlist(infoContent,writeInfoFilePath) | ||
124 | + | ||
125 | +#copy keychain file | ||
126 | +newFilePath = os.path.abspath('.') + '/KeychainAccessGroups.plist' | ||
127 | +shutil.copyfile(channelKeychainFilePath,newFilePath) | ||
128 | + | ||
129 | +project.save() |
1 | +import shutil | ||
2 | +import os | ||
3 | +import plistlib | ||
4 | + | ||
5 | +import config | ||
6 | +import json | ||
7 | +import packageProj | ||
8 | +import commands | ||
9 | + | ||
10 | +from mod_pbxproj import XcodeProject | ||
11 | + | ||
12 | + | ||
13 | +gameProjName = config.gameProjName | ||
14 | +channelName = "xipu" | ||
15 | +#copy dir xcodeproj | ||
16 | +copyNewDirName = gameProjName + '_' + channelName + '.xcodeproj' | ||
17 | +currentPath = os.path.abspath('.') | ||
18 | +currentPath += '/' + copyNewDirName | ||
19 | + | ||
20 | + | ||
21 | +if os.path.exists(currentPath): | ||
22 | + shutil.rmtree(currentPath) | ||
23 | + | ||
24 | +shutil.copytree(gameProjName + '.xcodeproj',currentPath) | ||
25 | + | ||
26 | +project = XcodeProject.Load(copyNewDirName + '/project.pbxproj') | ||
27 | + | ||
28 | +project.add_other_ldflags('-ObjC') | ||
29 | + | ||
30 | +channelRootPath = config.channelRootPath#'poolsdk_file' | ||
31 | + | ||
32 | +frameworksPath = '$(PROJECT_DIR)/' + channelRootPath + '/poolsdk_' + channelName + '/SDK' | ||
33 | +print(frameworksPath); | ||
34 | +#add header search path | ||
35 | +project.add_header_search_paths(frameworksPath, recursive=False) | ||
36 | +project.add_header_search_paths(frameworksPath + '/ResourceCode', recursive=False) | ||
37 | +project.add_header_search_paths(frameworksPath + '/ResourceCode/JGStatistics', recursive=False) | ||
38 | +project.add_header_search_paths(frameworksPath + '/ResourceCode/MMCategory', recursive=False) | ||
39 | +project.add_header_search_paths(frameworksPath + '/ResourceCode/PieChartView', recursive=False) | ||
40 | + | ||
41 | +#add framework search path | ||
42 | +project.add_framework_search_paths(frameworksPath, recursive=False) | ||
43 | +project.add_framework_search_paths(frameworksPath + '/ResourceCode/MGBSHudFramework', recursive=False) | ||
44 | + | ||
45 | +#add library search path | ||
46 | +project.add_library_search_paths(frameworksPath, recursive=False) | ||
47 | +project.add_library_search_paths(frameworksPath + '/ResourceCode/JGStatistics', recursive=False) | ||
48 | + | ||
49 | +#add poolsdk_xy dir all file into project | ||
50 | +project.remove_group_by_name('poolsdk') | ||
51 | +frameworkRelativePath = project.add_folder(channelRootPath + '/poolsdk_' + channelName + '/SDK') | ||
52 | + | ||
53 | +#ignore_unknown_type | ||
54 | +project.add_file_if_doesnt_exist('pool_setting',parent=frameworkRelativePath, weak=True,ignore_unknown_type=True) | ||
55 | + | ||
56 | + | ||
57 | +systemFrameworks = project.get_or_create_group('Frameworks') | ||
58 | +#add system framework | ||
59 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/Security.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
60 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/CoreGraphics.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
61 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/AdSupport.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
62 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/CoreTelephony.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
63 | +project.add_file_if_doesnt_exist('System/Library/Frameworks/SystemConfiguration.framework',parent=systemFrameworks, weak=True, tree='SDKROOT') | ||
64 | + | ||
65 | +#add system dylib | ||
66 | +systemLibs = project.get_or_create_group('Libraries') | ||
67 | +project.add_file_if_doesnt_exist('/usr/lib/libz.dylib',parent=systemLibs, weak=True, tree='<absolute>') | ||
68 | +project.add_file_if_doesnt_exist('/usr/lib/libresolv.dylib',parent=systemLibs, weak=True, tree='<absolute>') | ||
69 | +project.add_file_if_doesnt_exist('/usr/lib/libsqlite3.dylib',parent=systemLibs, weak=True, tree='<absolute>')#absolute path | ||
70 | + | ||
71 | + | ||
72 | +#modify info.plist reference path | ||
73 | +project.add_single_valued_flag('INFOPLIST_FILE',channelRootPath + '/poolsdk_' + channelName + '/Info.plist') | ||
74 | + | ||
75 | +project.add_single_valued_flag('ENABLE_BITCODE', 'NO') | ||
76 | + | ||
77 | +readInfoPlistFilePath = channelRootPath + '/poolsdk/Info.plist' | ||
78 | +writeInfoFilePath = channelRootPath + '/poolsdk_' + channelName + '/Info.plist' | ||
79 | +infoContent = plistlib.readPlist(readInfoPlistFilePath) | ||
80 | + | ||
81 | +channelInfoPath = channelRootPath + '/poolsdk_' + channelName + '/Info_' + channelName + '.plist' | ||
82 | + | ||
83 | +#read pool_setting file | ||
84 | +settingFile = open(channelRootPath + '/poolsdk_' + channelName + '/SDK/pool_setting','rw') | ||
85 | +try: | ||
86 | + settingFileContent = settingFile.read( ) | ||
87 | +finally: | ||
88 | + settingFile.close( ) | ||
89 | +#json op | ||
90 | +jsonStr = json.loads(settingFileContent) | ||
91 | + | ||
92 | +#modify bundle id | ||
93 | +project.add_single_valued_flag('PRODUCT_BUNDLE_IDENTIFIER',jsonStr["appScheme"]) | ||
94 | + | ||
95 | +identifier = jsonStr["identifier"]; | ||
96 | +url_schemes = jsonStr["url_schemes"]; | ||
97 | + | ||
98 | +#set info.plist channel parame | ||
99 | +absolutionInfoPath = os.path.abspath('.') + '/' + channelInfoPath | ||
100 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :CFBundleURLTypes:0:CFBundleURLName '" + identifier + ' ' + absolutionInfoPath) | ||
101 | +commands.getstatusoutput("/usr/libexec/PlistBuddy -c 'Set :CFBundleURLTypes:0:CFBundleURLSchemes:0 '" + url_schemes + ' ' + absolutionInfoPath) | ||
102 | + | ||
103 | +#read channel info plist content | ||
104 | +channelInfoContent = plistlib.readPlist(channelInfoPath) | ||
105 | +#update and add info.plist content | ||
106 | +infoContent.update(channelInfoContent) | ||
107 | +#write | ||
108 | +plistlib.writePlist(infoContent,writeInfoFilePath) | ||
109 | + | ||
110 | +project.save() |
... | @@ -32,7 +32,7 @@ | ... | @@ -32,7 +32,7 @@ |
32 | 32 | ||
33 | #define REPORT_URL @"https://statistic.public.sdk.gzyouai.com/sdk/statistic" //http://183.57.76.181:9030/sdk/statistic | 33 | #define REPORT_URL @"https://statistic.public.sdk.gzyouai.com/sdk/statistic" //http://183.57.76.181:9030/sdk/statistic |
34 | 34 | ||
35 | -#define REPORT_IDFA_URL @"https://statistic.public.sdk.gzyouai.com/sdk/last_channel?idfa=" //@"http://183.57.76.181:9030/sdk/last_channel?idfa="// | 35 | +#define REPORT_IDFA_URL @"https://statistic.public.sdk.gzyouai.com/sdk/last_channel?idfa=%@&sdkSimpleName=%@&gameSimpleName=%@" //@"http://183.57.76.181:9030/sdk/last_channel?idfa="// |
36 | 36 | ||
37 | #define REPORT_OPEN @"open" | 37 | #define REPORT_OPEN @"open" |
38 | #define REPORT_ENTER @"enter" | 38 | #define REPORT_ENTER @"enter" | ... | ... |
-
Please register or login to post a comment