├── .travis.yml ├── Makefile ├── ISInvocationHookProxy ├── ISInvocationHookProxy.h ├── ISInvocationHookProxy.m └── Info.plist ├── ISInvocationHookProxyTests ├── Info.plist └── ISInvocationHookProxyTests.m ├── ISInvocationHookProxy.podspec ├── README.md └── ISInvocationHookProxy.xcodeproj ├── xcshareddata └── xcschemes │ └── ISInvocationHookProxy.xcscheme └── project.pbxproj /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | 3 | before_install: 4 | - sudo easy_install cpp-coveralls 5 | 6 | script: 7 | - make test 8 | 9 | after_success: 10 | - make coveralls 11 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | test: 2 | xcodebuild test \ 3 | -scheme ISInvocationHookProxy \ 4 | OBJROOT=build \ 5 | GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES \ 6 | GCC_GENERATE_TEST_COVERAGE_FILES=YES 7 | 8 | coveralls: 9 | coveralls -e ISInvocationHookProxyTests 10 | -------------------------------------------------------------------------------- /ISInvocationHookProxy/ISInvocationHookProxy.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | FOUNDATION_EXPORT double ISInvocationHookProxyVersionNumber; 4 | FOUNDATION_EXPORT const unsigned char ISInvocationHookProxyVersionString[]; 5 | 6 | @interface ISInvocationHookProxy : NSProxy 7 | 8 | @property (nonatomic, readonly) id target; 9 | @property (nonatomic, copy) void (^hookBlock)(NSInvocation *); 10 | 11 | - (instancetype)initWithTarget:(id)target; 12 | 13 | @end 14 | 15 | -------------------------------------------------------------------------------- /ISInvocationHookProxy/ISInvocationHookProxy.m: -------------------------------------------------------------------------------- 1 | #import "ISInvocationHookProxy.h" 2 | 3 | @implementation ISInvocationHookProxy 4 | 5 | - (instancetype)initWithTarget:(id)target 6 | { 7 | _target = target; 8 | return target ? self : nil; 9 | } 10 | 11 | - (BOOL)respondsToSelector:(SEL)selector 12 | { 13 | return [super respondsToSelector:selector] || [self.target respondsToSelector:selector]; 14 | } 15 | 16 | - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector 17 | { 18 | return [self.target methodSignatureForSelector:selector]; 19 | } 20 | 21 | - (void)forwardInvocation:(NSInvocation *)invocation 22 | { 23 | [invocation invokeWithTarget:self.target]; 24 | 25 | if (self.hookBlock) { 26 | self.hookBlock(invocation); 27 | } 28 | } 29 | 30 | @end -------------------------------------------------------------------------------- /ISInvocationHookProxyTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | -.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ISInvocationHookProxy/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | -.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ISInvocationHookProxyTests/ISInvocationHookProxyTests.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "ISInvocationHookProxy.h" 4 | 5 | @interface ISInvocationHookProxyTests : XCTestCase 6 | 7 | @end 8 | 9 | @implementation ISInvocationHookProxyTests 10 | 11 | - (void)testInitWithNilTarget 12 | { 13 | ISInvocationHookProxy *proxy = [[ISInvocationHookProxy alloc] initWithTarget:nil]; 14 | XCTAssertNil(proxy); 15 | } 16 | 17 | - (void)testHookInvocation 18 | { 19 | __block NSInvocation *hookedInvocation; 20 | 21 | NSString *object = @"foo"; 22 | ISInvocationHookProxy *proxy = [[ISInvocationHookProxy alloc] initWithTarget:object]; 23 | proxy.hookBlock = ^(NSInvocation *invocation) { 24 | hookedInvocation = invocation; 25 | }; 26 | 27 | [(NSString *)proxy length]; 28 | 29 | XCTAssertEqual(hookedInvocation.selector, @selector(length)); 30 | } 31 | 32 | - (void)testOverwriteReturnValue 33 | { 34 | __block NSInteger length = 10; 35 | NSString *object = @"foo"; 36 | ISInvocationHookProxy *proxy = [[ISInvocationHookProxy alloc] initWithTarget:object]; 37 | proxy.hookBlock = ^(NSInvocation *invocation) { 38 | [invocation setReturnValue:&length]; 39 | }; 40 | 41 | XCTAssertEqual([(NSString *)proxy length], length); 42 | } 43 | 44 | - (void)testRespondsToSelector 45 | { 46 | NSString *object = @"foo"; 47 | ISInvocationHookProxy *proxy = [[ISInvocationHookProxy alloc] initWithTarget:object]; 48 | XCTAssertTrue([proxy respondsToSelector:@selector(length)]); 49 | } 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /ISInvocationHookProxy.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "ISInvocationHookProxy" 3 | s.version = "0.0.2" 4 | s.platform = :ios, '4.3' 5 | s.summary = "A proxy object that hooks each NSInvocation of target." 6 | s.homepage = "https://github.com/ishkawa/ISInvocationHookProxy" 7 | s.author = { "Yosuke Ishikawa" => "y@ishkawa.org" } 8 | s.source = { :git => "https://github.com/ishkawa/ISInvocationHookProxy.git", :tag => "0.0.2" } 9 | s.source_files = 'ISInvocationHookProxy/**/*.{h,m}' 10 | s.requires_arc = true 11 | s.license = { 12 | :type => 'MIT', 13 | :text => <<-LICENSE 14 | Copyright (c) 2014 Yosuke Ishikawa 15 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 16 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18 | LICENSE 19 | } 20 | end 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ISInvocationHookProxy 2 | ===================== 3 | 4 | [![Version](https://img.shields.io/cocoapods/v/ISInvocationHookProxy.svg?style=flat)](http://cocoadocs.org/docsets/ISInvocationHookProxy) 5 | [![Build Status](https://img.shields.io/travis/ishkawa/ISInvocationHookProxy.svg?style=flat)](https://travis-ci.org/ishkawa/ISInvocationHookProxy) 6 | [![Coverage Status](https://img.shields.io/coveralls/ishkawa/ISInvocationHookProxy.svg?style=flat)](https://coveralls.io/r/ishkawa/ISInvocationHookProxy) 7 | 8 | A proxy object that hooks each NSInvocation of target. 9 | 10 | ## Usage 11 | 12 | ```objc 13 | NSString *object = [[NSString alloc] init]; 14 | ISInvocationHookProxy *proxy = [[ISInvocationHookProxy alloc] initWithTarget:object]; 15 | proxy.hookBlock = ^(NSInvocation *invocation) { 16 | // will be called when [(NSString *)proxy length]; is executed 17 | }; 18 | 19 | [(NSString *)proxy length]; 20 | ``` 21 | 22 | ### Overwriting return value of invocation 23 | 24 | ```objc 25 | NSString *object = @"foo"; 26 | ISInvocationHookProxy *proxy = [[ISInvocationHookProxy alloc] initWithTarget:object]; 27 | [(NSString *)proxy length]; // 3 28 | 29 | proxy.hookBlock = ^(NSInvocation *invocation) { 30 | if (invocation.selector == @selector(length)) { 31 | NSInteger length = 10; 32 | [invocation setReturnValue:&length]; 33 | } 34 | }; 35 | 36 | [(NSString *)proxy length]; // 10 37 | ``` 38 | 39 | ## License 40 | 41 | Copyright (c) 2013-2014 Yosuke Ishikawa 42 | 43 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 44 | 45 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 46 | 47 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 48 | -------------------------------------------------------------------------------- /ISInvocationHookProxy.xcodeproj/xcshareddata/xcschemes/ISInvocationHookProxy.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /ISInvocationHookProxy.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 7F6759D71A38488900AE2689 /* ISInvocationHookProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F6759D61A38488900AE2689 /* ISInvocationHookProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 7F6759DD1A38488900AE2689 /* ISInvocationHookProxy.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F6759D11A38488900AE2689 /* ISInvocationHookProxy.framework */; }; 12 | 7F6759E41A38488900AE2689 /* ISInvocationHookProxyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F6759E31A38488900AE2689 /* ISInvocationHookProxyTests.m */; }; 13 | 7F6759EE1A3848BD00AE2689 /* ISInvocationHookProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F6759ED1A3848BD00AE2689 /* ISInvocationHookProxy.m */; }; 14 | /* End PBXBuildFile section */ 15 | 16 | /* Begin PBXContainerItemProxy section */ 17 | 7F6759DE1A38488900AE2689 /* PBXContainerItemProxy */ = { 18 | isa = PBXContainerItemProxy; 19 | containerPortal = 7F6759C81A38488900AE2689 /* Project object */; 20 | proxyType = 1; 21 | remoteGlobalIDString = 7F6759D01A38488900AE2689; 22 | remoteInfo = ISInvocationHookProxy; 23 | }; 24 | /* End PBXContainerItemProxy section */ 25 | 26 | /* Begin PBXFileReference section */ 27 | 7F6759D11A38488900AE2689 /* ISInvocationHookProxy.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ISInvocationHookProxy.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | 7F6759D51A38488900AE2689 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 29 | 7F6759D61A38488900AE2689 /* ISInvocationHookProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ISInvocationHookProxy.h; sourceTree = ""; }; 30 | 7F6759DC1A38488900AE2689 /* ISInvocationHookProxyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ISInvocationHookProxyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 31 | 7F6759E21A38488900AE2689 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 32 | 7F6759E31A38488900AE2689 /* ISInvocationHookProxyTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ISInvocationHookProxyTests.m; sourceTree = ""; }; 33 | 7F6759ED1A3848BD00AE2689 /* ISInvocationHookProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISInvocationHookProxy.m; sourceTree = ""; }; 34 | /* End PBXFileReference section */ 35 | 36 | /* Begin PBXFrameworksBuildPhase section */ 37 | 7F6759CD1A38488900AE2689 /* Frameworks */ = { 38 | isa = PBXFrameworksBuildPhase; 39 | buildActionMask = 2147483647; 40 | files = ( 41 | ); 42 | runOnlyForDeploymentPostprocessing = 0; 43 | }; 44 | 7F6759D91A38488900AE2689 /* Frameworks */ = { 45 | isa = PBXFrameworksBuildPhase; 46 | buildActionMask = 2147483647; 47 | files = ( 48 | 7F6759DD1A38488900AE2689 /* ISInvocationHookProxy.framework in Frameworks */, 49 | ); 50 | runOnlyForDeploymentPostprocessing = 0; 51 | }; 52 | /* End PBXFrameworksBuildPhase section */ 53 | 54 | /* Begin PBXGroup section */ 55 | 7F6759C71A38488900AE2689 = { 56 | isa = PBXGroup; 57 | children = ( 58 | 7F6759D31A38488900AE2689 /* ISInvocationHookProxy */, 59 | 7F6759E01A38488900AE2689 /* ISInvocationHookProxyTests */, 60 | 7F6759D21A38488900AE2689 /* Products */, 61 | ); 62 | sourceTree = ""; 63 | }; 64 | 7F6759D21A38488900AE2689 /* Products */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | 7F6759D11A38488900AE2689 /* ISInvocationHookProxy.framework */, 68 | 7F6759DC1A38488900AE2689 /* ISInvocationHookProxyTests.xctest */, 69 | ); 70 | name = Products; 71 | sourceTree = ""; 72 | }; 73 | 7F6759D31A38488900AE2689 /* ISInvocationHookProxy */ = { 74 | isa = PBXGroup; 75 | children = ( 76 | 7F6759D61A38488900AE2689 /* ISInvocationHookProxy.h */, 77 | 7F6759ED1A3848BD00AE2689 /* ISInvocationHookProxy.m */, 78 | 7F6759D41A38488900AE2689 /* Supporting Files */, 79 | ); 80 | path = ISInvocationHookProxy; 81 | sourceTree = ""; 82 | }; 83 | 7F6759D41A38488900AE2689 /* Supporting Files */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | 7F6759D51A38488900AE2689 /* Info.plist */, 87 | ); 88 | name = "Supporting Files"; 89 | sourceTree = ""; 90 | }; 91 | 7F6759E01A38488900AE2689 /* ISInvocationHookProxyTests */ = { 92 | isa = PBXGroup; 93 | children = ( 94 | 7F6759E31A38488900AE2689 /* ISInvocationHookProxyTests.m */, 95 | 7F6759E11A38488900AE2689 /* Supporting Files */, 96 | ); 97 | path = ISInvocationHookProxyTests; 98 | sourceTree = ""; 99 | }; 100 | 7F6759E11A38488900AE2689 /* Supporting Files */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 7F6759E21A38488900AE2689 /* Info.plist */, 104 | ); 105 | name = "Supporting Files"; 106 | sourceTree = ""; 107 | }; 108 | /* End PBXGroup section */ 109 | 110 | /* Begin PBXHeadersBuildPhase section */ 111 | 7F6759CE1A38488900AE2689 /* Headers */ = { 112 | isa = PBXHeadersBuildPhase; 113 | buildActionMask = 2147483647; 114 | files = ( 115 | 7F6759D71A38488900AE2689 /* ISInvocationHookProxy.h in Headers */, 116 | ); 117 | runOnlyForDeploymentPostprocessing = 0; 118 | }; 119 | /* End PBXHeadersBuildPhase section */ 120 | 121 | /* Begin PBXNativeTarget section */ 122 | 7F6759D01A38488900AE2689 /* ISInvocationHookProxy */ = { 123 | isa = PBXNativeTarget; 124 | buildConfigurationList = 7F6759E71A38488900AE2689 /* Build configuration list for PBXNativeTarget "ISInvocationHookProxy" */; 125 | buildPhases = ( 126 | 7F6759CC1A38488900AE2689 /* Sources */, 127 | 7F6759CD1A38488900AE2689 /* Frameworks */, 128 | 7F6759CE1A38488900AE2689 /* Headers */, 129 | 7F6759CF1A38488900AE2689 /* Resources */, 130 | ); 131 | buildRules = ( 132 | ); 133 | dependencies = ( 134 | ); 135 | name = ISInvocationHookProxy; 136 | productName = ISInvocationHookProxy; 137 | productReference = 7F6759D11A38488900AE2689 /* ISInvocationHookProxy.framework */; 138 | productType = "com.apple.product-type.framework"; 139 | }; 140 | 7F6759DB1A38488900AE2689 /* ISInvocationHookProxyTests */ = { 141 | isa = PBXNativeTarget; 142 | buildConfigurationList = 7F6759EA1A38488900AE2689 /* Build configuration list for PBXNativeTarget "ISInvocationHookProxyTests" */; 143 | buildPhases = ( 144 | 7F6759D81A38488900AE2689 /* Sources */, 145 | 7F6759D91A38488900AE2689 /* Frameworks */, 146 | 7F6759DA1A38488900AE2689 /* Resources */, 147 | ); 148 | buildRules = ( 149 | ); 150 | dependencies = ( 151 | 7F6759DF1A38488900AE2689 /* PBXTargetDependency */, 152 | ); 153 | name = ISInvocationHookProxyTests; 154 | productName = ISInvocationHookProxyTests; 155 | productReference = 7F6759DC1A38488900AE2689 /* ISInvocationHookProxyTests.xctest */; 156 | productType = "com.apple.product-type.bundle.unit-test"; 157 | }; 158 | /* End PBXNativeTarget section */ 159 | 160 | /* Begin PBXProject section */ 161 | 7F6759C81A38488900AE2689 /* Project object */ = { 162 | isa = PBXProject; 163 | attributes = { 164 | LastUpgradeCheck = 0610; 165 | ORGANIZATIONNAME = "Yosuke Ishikawa"; 166 | TargetAttributes = { 167 | 7F6759D01A38488900AE2689 = { 168 | CreatedOnToolsVersion = 6.1.1; 169 | }; 170 | 7F6759DB1A38488900AE2689 = { 171 | CreatedOnToolsVersion = 6.1.1; 172 | }; 173 | }; 174 | }; 175 | buildConfigurationList = 7F6759CB1A38488900AE2689 /* Build configuration list for PBXProject "ISInvocationHookProxy" */; 176 | compatibilityVersion = "Xcode 3.2"; 177 | developmentRegion = English; 178 | hasScannedForEncodings = 0; 179 | knownRegions = ( 180 | en, 181 | ); 182 | mainGroup = 7F6759C71A38488900AE2689; 183 | productRefGroup = 7F6759D21A38488900AE2689 /* Products */; 184 | projectDirPath = ""; 185 | projectRoot = ""; 186 | targets = ( 187 | 7F6759D01A38488900AE2689 /* ISInvocationHookProxy */, 188 | 7F6759DB1A38488900AE2689 /* ISInvocationHookProxyTests */, 189 | ); 190 | }; 191 | /* End PBXProject section */ 192 | 193 | /* Begin PBXResourcesBuildPhase section */ 194 | 7F6759CF1A38488900AE2689 /* Resources */ = { 195 | isa = PBXResourcesBuildPhase; 196 | buildActionMask = 2147483647; 197 | files = ( 198 | ); 199 | runOnlyForDeploymentPostprocessing = 0; 200 | }; 201 | 7F6759DA1A38488900AE2689 /* Resources */ = { 202 | isa = PBXResourcesBuildPhase; 203 | buildActionMask = 2147483647; 204 | files = ( 205 | ); 206 | runOnlyForDeploymentPostprocessing = 0; 207 | }; 208 | /* End PBXResourcesBuildPhase section */ 209 | 210 | /* Begin PBXSourcesBuildPhase section */ 211 | 7F6759CC1A38488900AE2689 /* Sources */ = { 212 | isa = PBXSourcesBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | 7F6759EE1A3848BD00AE2689 /* ISInvocationHookProxy.m in Sources */, 216 | ); 217 | runOnlyForDeploymentPostprocessing = 0; 218 | }; 219 | 7F6759D81A38488900AE2689 /* Sources */ = { 220 | isa = PBXSourcesBuildPhase; 221 | buildActionMask = 2147483647; 222 | files = ( 223 | 7F6759E41A38488900AE2689 /* ISInvocationHookProxyTests.m in Sources */, 224 | ); 225 | runOnlyForDeploymentPostprocessing = 0; 226 | }; 227 | /* End PBXSourcesBuildPhase section */ 228 | 229 | /* Begin PBXTargetDependency section */ 230 | 7F6759DF1A38488900AE2689 /* PBXTargetDependency */ = { 231 | isa = PBXTargetDependency; 232 | target = 7F6759D01A38488900AE2689 /* ISInvocationHookProxy */; 233 | targetProxy = 7F6759DE1A38488900AE2689 /* PBXContainerItemProxy */; 234 | }; 235 | /* End PBXTargetDependency section */ 236 | 237 | /* Begin XCBuildConfiguration section */ 238 | 7F6759E51A38488900AE2689 /* Debug */ = { 239 | isa = XCBuildConfiguration; 240 | buildSettings = { 241 | ALWAYS_SEARCH_USER_PATHS = NO; 242 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 243 | CLANG_CXX_LIBRARY = "libc++"; 244 | CLANG_ENABLE_MODULES = YES; 245 | CLANG_ENABLE_OBJC_ARC = YES; 246 | CLANG_WARN_BOOL_CONVERSION = YES; 247 | CLANG_WARN_CONSTANT_CONVERSION = YES; 248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 249 | CLANG_WARN_EMPTY_BODY = YES; 250 | CLANG_WARN_ENUM_CONVERSION = YES; 251 | CLANG_WARN_INT_CONVERSION = YES; 252 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 253 | CLANG_WARN_UNREACHABLE_CODE = YES; 254 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 255 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 256 | COPY_PHASE_STRIP = NO; 257 | CURRENT_PROJECT_VERSION = 1; 258 | ENABLE_STRICT_OBJC_MSGSEND = YES; 259 | GCC_C_LANGUAGE_STANDARD = gnu99; 260 | GCC_DYNAMIC_NO_PIC = NO; 261 | GCC_OPTIMIZATION_LEVEL = 0; 262 | GCC_PREPROCESSOR_DEFINITIONS = ( 263 | "DEBUG=1", 264 | "$(inherited)", 265 | ); 266 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 267 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 268 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 269 | GCC_WARN_UNDECLARED_SELECTOR = YES; 270 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 271 | GCC_WARN_UNUSED_FUNCTION = YES; 272 | GCC_WARN_UNUSED_VARIABLE = YES; 273 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 274 | MTL_ENABLE_DEBUG_INFO = YES; 275 | ONLY_ACTIVE_ARCH = YES; 276 | SDKROOT = iphoneos; 277 | TARGETED_DEVICE_FAMILY = "1,2"; 278 | VERSIONING_SYSTEM = "apple-generic"; 279 | VERSION_INFO_PREFIX = ""; 280 | }; 281 | name = Debug; 282 | }; 283 | 7F6759E61A38488900AE2689 /* Release */ = { 284 | isa = XCBuildConfiguration; 285 | buildSettings = { 286 | ALWAYS_SEARCH_USER_PATHS = NO; 287 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 288 | CLANG_CXX_LIBRARY = "libc++"; 289 | CLANG_ENABLE_MODULES = YES; 290 | CLANG_ENABLE_OBJC_ARC = YES; 291 | CLANG_WARN_BOOL_CONVERSION = YES; 292 | CLANG_WARN_CONSTANT_CONVERSION = YES; 293 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 294 | CLANG_WARN_EMPTY_BODY = YES; 295 | CLANG_WARN_ENUM_CONVERSION = YES; 296 | CLANG_WARN_INT_CONVERSION = YES; 297 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 298 | CLANG_WARN_UNREACHABLE_CODE = YES; 299 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 300 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 301 | COPY_PHASE_STRIP = YES; 302 | CURRENT_PROJECT_VERSION = 1; 303 | ENABLE_NS_ASSERTIONS = NO; 304 | ENABLE_STRICT_OBJC_MSGSEND = YES; 305 | GCC_C_LANGUAGE_STANDARD = gnu99; 306 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 307 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 308 | GCC_WARN_UNDECLARED_SELECTOR = YES; 309 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 310 | GCC_WARN_UNUSED_FUNCTION = YES; 311 | GCC_WARN_UNUSED_VARIABLE = YES; 312 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 313 | MTL_ENABLE_DEBUG_INFO = NO; 314 | SDKROOT = iphoneos; 315 | TARGETED_DEVICE_FAMILY = "1,2"; 316 | VALIDATE_PRODUCT = YES; 317 | VERSIONING_SYSTEM = "apple-generic"; 318 | VERSION_INFO_PREFIX = ""; 319 | }; 320 | name = Release; 321 | }; 322 | 7F6759E81A38488900AE2689 /* Debug */ = { 323 | isa = XCBuildConfiguration; 324 | buildSettings = { 325 | DEFINES_MODULE = YES; 326 | DYLIB_COMPATIBILITY_VERSION = 1; 327 | DYLIB_CURRENT_VERSION = 1; 328 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 329 | INFOPLIST_FILE = ISInvocationHookProxy/Info.plist; 330 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 331 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 332 | PRODUCT_NAME = "$(TARGET_NAME)"; 333 | SKIP_INSTALL = YES; 334 | }; 335 | name = Debug; 336 | }; 337 | 7F6759E91A38488900AE2689 /* Release */ = { 338 | isa = XCBuildConfiguration; 339 | buildSettings = { 340 | DEFINES_MODULE = YES; 341 | DYLIB_COMPATIBILITY_VERSION = 1; 342 | DYLIB_CURRENT_VERSION = 1; 343 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 344 | INFOPLIST_FILE = ISInvocationHookProxy/Info.plist; 345 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 346 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 347 | PRODUCT_NAME = "$(TARGET_NAME)"; 348 | SKIP_INSTALL = YES; 349 | }; 350 | name = Release; 351 | }; 352 | 7F6759EB1A38488900AE2689 /* Debug */ = { 353 | isa = XCBuildConfiguration; 354 | buildSettings = { 355 | FRAMEWORK_SEARCH_PATHS = ( 356 | "$(SDKROOT)/Developer/Library/Frameworks", 357 | "$(inherited)", 358 | ); 359 | GCC_PREPROCESSOR_DEFINITIONS = ( 360 | "DEBUG=1", 361 | "$(inherited)", 362 | ); 363 | INFOPLIST_FILE = ISInvocationHookProxyTests/Info.plist; 364 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 365 | PRODUCT_NAME = "$(TARGET_NAME)"; 366 | }; 367 | name = Debug; 368 | }; 369 | 7F6759EC1A38488900AE2689 /* Release */ = { 370 | isa = XCBuildConfiguration; 371 | buildSettings = { 372 | FRAMEWORK_SEARCH_PATHS = ( 373 | "$(SDKROOT)/Developer/Library/Frameworks", 374 | "$(inherited)", 375 | ); 376 | INFOPLIST_FILE = ISInvocationHookProxyTests/Info.plist; 377 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 378 | PRODUCT_NAME = "$(TARGET_NAME)"; 379 | }; 380 | name = Release; 381 | }; 382 | /* End XCBuildConfiguration section */ 383 | 384 | /* Begin XCConfigurationList section */ 385 | 7F6759CB1A38488900AE2689 /* Build configuration list for PBXProject "ISInvocationHookProxy" */ = { 386 | isa = XCConfigurationList; 387 | buildConfigurations = ( 388 | 7F6759E51A38488900AE2689 /* Debug */, 389 | 7F6759E61A38488900AE2689 /* Release */, 390 | ); 391 | defaultConfigurationIsVisible = 0; 392 | defaultConfigurationName = Release; 393 | }; 394 | 7F6759E71A38488900AE2689 /* Build configuration list for PBXNativeTarget "ISInvocationHookProxy" */ = { 395 | isa = XCConfigurationList; 396 | buildConfigurations = ( 397 | 7F6759E81A38488900AE2689 /* Debug */, 398 | 7F6759E91A38488900AE2689 /* Release */, 399 | ); 400 | defaultConfigurationIsVisible = 0; 401 | }; 402 | 7F6759EA1A38488900AE2689 /* Build configuration list for PBXNativeTarget "ISInvocationHookProxyTests" */ = { 403 | isa = XCConfigurationList; 404 | buildConfigurations = ( 405 | 7F6759EB1A38488900AE2689 /* Debug */, 406 | 7F6759EC1A38488900AE2689 /* Release */, 407 | ); 408 | defaultConfigurationIsVisible = 0; 409 | }; 410 | /* End XCConfigurationList section */ 411 | }; 412 | rootObject = 7F6759C81A38488900AE2689 /* Project object */; 413 | } 414 | --------------------------------------------------------------------------------