├── Resources ├── IDEProductsButton_left.tiff ├── IDEProductsButton_right.tiff ├── IDEProductsButton_center.tiff ├── IDEProductsButton_left_disabled.tiff ├── IDEProductsButton_left_pressed.tiff ├── IDEProductsButton_right_pressed.tiff ├── IDEProductsButton_center_disabled.tiff └── IDEProductsButton_center_pressed.tiff ├── xGhostPreventer ├── XGPSadTim.h ├── XGPMessage.h ├── XGPButtonCellOverride.h ├── xGhostPreventer.h ├── IDEDistributionAssistantWindowController.h ├── XGPButtonCellOverride.m ├── XGPMessage.m ├── Info.plist ├── xGhostPreventer.m └── XGPSadTim.m ├── .gitignore ├── README.md ├── LICENSE └── xGhostPreventer.xcodeproj ├── xcshareddata └── xcschemes │ └── xGhostPreventer.xcscheme └── project.pbxproj /Resources/IDEProductsButton_left.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/xGhostPreventer/HEAD/Resources/IDEProductsButton_left.tiff -------------------------------------------------------------------------------- /Resources/IDEProductsButton_right.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/xGhostPreventer/HEAD/Resources/IDEProductsButton_right.tiff -------------------------------------------------------------------------------- /Resources/IDEProductsButton_center.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/xGhostPreventer/HEAD/Resources/IDEProductsButton_center.tiff -------------------------------------------------------------------------------- /Resources/IDEProductsButton_left_disabled.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/xGhostPreventer/HEAD/Resources/IDEProductsButton_left_disabled.tiff -------------------------------------------------------------------------------- /Resources/IDEProductsButton_left_pressed.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/xGhostPreventer/HEAD/Resources/IDEProductsButton_left_pressed.tiff -------------------------------------------------------------------------------- /Resources/IDEProductsButton_right_pressed.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/xGhostPreventer/HEAD/Resources/IDEProductsButton_right_pressed.tiff -------------------------------------------------------------------------------- /Resources/IDEProductsButton_center_disabled.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/xGhostPreventer/HEAD/Resources/IDEProductsButton_center_disabled.tiff -------------------------------------------------------------------------------- /Resources/IDEProductsButton_center_pressed.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/xGhostPreventer/HEAD/Resources/IDEProductsButton_center_pressed.tiff -------------------------------------------------------------------------------- /xGhostPreventer/XGPSadTim.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Guilherme Rambo on 16/01/17. 3 | // Copyright (c) 2017 Guilherme Rambo. All rights reserved. 4 | // 5 | 6 | @import WebKit; 7 | 8 | @interface XGPSadTim : NSObject 9 | 10 | + (WKWebView *)sadTimView; 11 | 12 | @end -------------------------------------------------------------------------------- /xGhostPreventer/XGPMessage.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Guilherme Rambo on 16/01/17. 3 | // Copyright (c) 2017 Guilherme Rambo. All rights reserved. 4 | // 5 | 6 | #import 7 | 8 | 9 | @interface XGPMessage : NSObject 10 | 11 | + (NSString *)firstAlertTitle; 12 | + (NSString *)firstAlertBody; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | __MACOSX 3 | *.pbxuser 4 | !default.pbxuser 5 | *.mode1v3 6 | !default.mode1v3 7 | *.mode2v3 8 | !default.mode2v3 9 | *.perspectivev3 10 | !default.perspectivev3 11 | *.xcworkspace 12 | !default.xcworkspace 13 | xcuserdata 14 | profile 15 | *.moved-aside 16 | DerivedData 17 | .idea/ 18 | Crashlytics.sh 19 | generatechangelog.sh 20 | Pods/ -------------------------------------------------------------------------------- /xGhostPreventer/XGPButtonCellOverride.h: -------------------------------------------------------------------------------- 1 | // 2 | // XGPButtonCellOverride.h 3 | // xGhostPreventer 4 | // 5 | // Created by Guilherme Rambo on 16/01/17. 6 | // Copyright © 2017 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface XGPButtonCellOverride : NSButtonCell 12 | 13 | + (void)apply; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /xGhostPreventer/xGhostPreventer.h: -------------------------------------------------------------------------------- 1 | // 2 | // xGhostPreventer.h 3 | // xGhostPreventer 4 | // 5 | // Created by Guilherme Rambo on 16/01/17. 6 | // Copyright © 2017 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface xGhostPreventer : NSObject 12 | 13 | + (instancetype)sharedPlugin; 14 | 15 | @property (nonatomic, strong, readonly) NSBundle* bundle; 16 | @end -------------------------------------------------------------------------------- /xGhostPreventer/IDEDistributionAssistantWindowController.h: -------------------------------------------------------------------------------- 1 | // 2 | // IDEDistributionAssistantWindowController.h.h 3 | // xGhostPreventer 4 | // 5 | // Created by Guilherme Rambo on 16/01/17. 6 | // Copyright (c) 2017 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface IDEArchive: NSObject 12 | @end 13 | 14 | @interface IDEDistributionContext: NSObject 15 | 16 | - (instancetype)initWithParent:(id)parent; 17 | - (void)setArchive:(IDEArchive *)archive; 18 | - (void)setDistributionTask:(NSNumber *)task; 19 | 20 | @end 21 | 22 | @interface IDEDistributionAssistantWindowController: NSWindowController 23 | 24 | + (void)beginAssistantWithArchive:(IDEArchive *)archive task:(int)task window:(NSWindow *)windowForSheet; 25 | - (instancetype)initWithArchive:(IDEArchive *)archive task:(int)task; 26 | - (void)setContext:(IDEDistributionContext *)ctx; 27 | - (void)beginSheetModalForWindow:(NSWindow *)window completionBlock:(void(^)())block; 28 | 29 | - (void)primitiveInvalidate; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # xGhostPreventer 2 | 3 | An Xcode plug-in designed to prevent accidental app distribution through an unsafe version of Xcode. 4 | 5 | ### Why shouldn't I distribute my apps using a patched Xcode? 6 | 7 | If your version of Xcode is patched to allow code injection by 3rd parties, it can potentially modify your binaries to run malicious code on your user's machines without your knowledge. 8 | 9 | [This has happened before](https://en.wikipedia.org/wiki/XcodeGhost) and may happen again. 10 | 11 | ### But why would I want to install this? 12 | 13 | I know there are many valid reasons for people to patch their Xcode to run arbitrary plugins, but if you do (and you're a responsible person), you should at least not use your patched version of Xcode to distribute your apps, that's why you should always keep an original version of Xcode around 😉 14 | 15 | ### Technical info 16 | 17 | **Tested only on macOS 10.12.2, Xcode 8.2.1** 18 | 19 | Designed to be installed automatically by [MakeXcodeGr8Again](https://github.com/fpg1503/MakeXcodeGr8Again). 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 Guilherme Rambo 2 | 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions are met: 5 | 6 | - Redistributions of source code must retain the above copyright notice, this 7 | list of conditions and the following disclaimer. 8 | 9 | - Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 14 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 17 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 19 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 20 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 21 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /xGhostPreventer/XGPButtonCellOverride.m: -------------------------------------------------------------------------------- 1 | // 2 | // XGPButtonCellOverride.m 3 | // xGhostPreventer 4 | // 5 | // Created by Guilherme Rambo on 16/01/17. 6 | // Copyright © 2017 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import "XGPButtonCellOverride.h" 10 | 11 | #import 12 | 13 | @implementation XGPButtonCellOverride 14 | 15 | + (void)apply 16 | { 17 | Class originalClass = NSClassFromString(@"IDEProductsButtonCell"); 18 | if (!originalClass) return; 19 | 20 | Method m1 = class_getInstanceMethod(originalClass, @selector(drawBezelWithFrame:inView:)); 21 | Method m2 = class_getInstanceMethod([self class], @selector(drawBezelWithFrame:inView:)); 22 | method_exchangeImplementations(m1, m2); 23 | } 24 | 25 | - (void)drawBezelWithFrame:(NSRect)frame inView:(NSView *)controlView 26 | { 27 | NSString *sufix = @""; 28 | 29 | if (self.isEnabled) { 30 | if (self.isHighlighted) { 31 | sufix = @"_pressed"; 32 | } 33 | } else { 34 | sufix = @"_disabled"; 35 | } 36 | 37 | NSBundle *bundle = [NSBundle bundleForClass:[XGPButtonCellOverride class]]; 38 | 39 | NSImage *left = [bundle imageForResource:[NSString stringWithFormat:@"IDEProductsButton_left%@", sufix]]; 40 | NSImage *center = [bundle imageForResource:[NSString stringWithFormat:@"IDEProductsButton_center%@", sufix]]; 41 | NSImage *right = [bundle imageForResource:[NSString stringWithFormat:@"IDEProductsButton_right%@", sufix]]; 42 | 43 | NSDrawThreePartImage(frame, left, center, right, NO, NSCompositingOperationSourceOver, 1.0, YES); 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /xGhostPreventer/XGPMessage.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Guilherme Rambo on 16/01/17. 3 | // Copyright (c) 2017 Guilherme Rambo. All rights reserved. 4 | // 5 | 6 | #import "XGPMessage.h" 7 | 8 | @interface NSMutableArray (Shuffling) 9 | - (void)shuffle; 10 | @end 11 | 12 | @implementation NSMutableArray (Shuffling) 13 | 14 | - (void)shuffle 15 | { 16 | NSUInteger count = [self count]; 17 | if (count < 1) return; 18 | for (NSUInteger i = 0; i < count - 1; ++i) { 19 | NSInteger remainingCount = count - i; 20 | NSInteger exchangeIndex = i + arc4random_uniform((u_int32_t )remainingCount); 21 | [self exchangeObjectAtIndex:i withObjectAtIndex:exchangeIndex]; 22 | } 23 | } 24 | 25 | @end 26 | 27 | @implementation XGPMessage 28 | 29 | + (NSString *)firstAlertTitle 30 | { 31 | static int current = 0; 32 | static NSMutableArray *messages; 33 | if (!messages) { 34 | messages = [@[@"Whoa! Wait!", 35 | @"Hold your horses!", 36 | @"Abort! Abort! Abort", 37 | @"Warning!!!", 38 | @"Danger, Danger!", 39 | @"Watch Out!", 40 | @"Are you crazy?", 41 | @"Вас взломали"] mutableCopy]; 42 | [messages shuffle]; 43 | } 44 | 45 | current++; 46 | if (current >= messages.count) current = 0; 47 | 48 | return messages[current]; 49 | } 50 | 51 | + (NSString *)firstAlertBody 52 | { 53 | static int current = 0; 54 | static NSMutableArray *messages; 55 | if (!messages) { 56 | messages = [@[@"You are using an unsafe version of Xcode, it is EXTREMELY recommended that you don't use this to distribute your apps.\n\nAre you sure you want to continue?", 57 | @"This version of Xcode is not properly signed by Apple. Distributing apps from this version is very unsafe.\n\nDo you want to put your users in risk?", 58 | @"The original Xcode is signed by Apple for a very good reason: to prevent malicious code injection in distributed apps. It is extremely recomended that you don't use this unsigned version to distribute apps.\n\nDo you want to take this huge risk?", 59 | @"In September 2015, a modified version of Xcode got distributed and caused numerous apps on the App Store to be distributed with malware. This version of Xcode could be suffering from the same issue.\n\nDo you want to run the risk of distributing malware to your users?"] mutableCopy]; 60 | [messages shuffle]; 61 | } 62 | 63 | current++; 64 | if (current >= messages.count) current = 0; 65 | 66 | return messages[current]; 67 | } 68 | 69 | @end 70 | -------------------------------------------------------------------------------- /xGhostPreventer/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleVersion 18 | 1 19 | DVTPlugInCompatibilityUUIDs 20 | 21 | FEC992CC-CA4A-4CFD-8881-77300FCB848A 22 | C4A681B0-4A26-480E-93EC-1218098B9AA0 23 | A2E4D43F-41F4-4FB9-BB94-7177011C9AED 24 | AD68E85B-441B-4301-B564-A45E4919A6AD 25 | 63FC1C47-140D-42B0-BB4D-A10B2D225574 26 | 37B30044-3B14-46BA-ABAA-F01000C27B63 27 | 640F884E-CE55-4B40-87C0-8869546CAB7A 28 | 992275C1-432A-4CF7-B659-D84ED6D42D3F 29 | A16FF353-8441-459E-A50C-B071F53F51B7 30 | 9F75337B-21B4-4ADC-B558-F9CADF7073A7 31 | E969541F-E6F9-4D25-8158-72DC3545A6C6 32 | 8DC44374-2B35-4C57-A6FE-2AD66A36AAD9 33 | AABB7188-E14E-4433-AD3B-5CD791EAD9A3 34 | 7FDF5C7A-131F-4ABB-9EDC-8C5F8F0B8A90 35 | 0420B86A-AA43-4792-9ED0-6FE0F2B16A13 36 | CC0D0F4F-05B3-431A-8F33-F84AFCB2C651 37 | 7265231C-39B4-402C-89E1-16167C4CC990 38 | 9AFF134A-08DC-4096-8CEE-62A4BB123046 39 | F41BD31E-2683-44B8-AE7F-5F09E919790E 40 | E71C2CFE-BFD8-4044-8F06-00AE685A406C 41 | ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C 42 | 8A66E736-A720-4B3C-92F1-33D9962C69DF 43 | E0A62D1F-3C18-4D74-BFE5-A4167D643966 44 | 45 | NSHumanReadableCopyright 46 | Copyright © 2017 Guilherme Rambo. All rights reserved. 47 | NSPrincipalClass 48 | xGhostPreventer 49 | XC4Compatible 50 | 51 | XC5Compatible 52 | 53 | XCPluginHasUI 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /xGhostPreventer.xcodeproj/xcshareddata/xcschemes/xGhostPreventer.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 49 | 50 | 51 | 57 | 58 | 59 | 60 | 63 | 64 | 65 | 66 | 67 | 68 | 74 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /xGhostPreventer/xGhostPreventer.m: -------------------------------------------------------------------------------- 1 | // 2 | // xGhostPreventer.m 3 | // xGhostPreventer 4 | // 5 | // Created by Guilherme Rambo on 16/01/17. 6 | // Copyright © 2017 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | #import "xGhostPreventer.h" 10 | 11 | #import 12 | 13 | #import "IDEDistributionAssistantWindowController.h" 14 | 15 | #import "XGPSadTim.h" 16 | #import "XGPMessage.h" 17 | #import "XGPButtonCellOverride.h" 18 | 19 | static xGhostPreventer *sharedPlugin; 20 | 21 | @interface xGhostPreventer () 22 | 23 | @end 24 | 25 | @implementation xGhostPreventer 26 | 27 | #pragma mark - Initialization 28 | 29 | + (void)pluginDidLoad:(NSBundle *)plugin 30 | { 31 | sharedPlugin = [[self alloc] initWithBundle:plugin]; 32 | } 33 | 34 | + (instancetype)sharedPlugin 35 | { 36 | return sharedPlugin; 37 | } 38 | 39 | - (id)initWithBundle:(NSBundle *)bundle 40 | { 41 | if (self = [super init]) { 42 | // reference to plugin's bundle, for resource access 43 | _bundle = bundle; 44 | // NSApp may be nil if the plugin is loaded from the xcodebuild command line tool 45 | if (NSApp && !NSApp.mainMenu) { 46 | [[NSNotificationCenter defaultCenter] addObserver:self 47 | selector:@selector(applicationDidFinishLaunching:) 48 | name:NSApplicationDidFinishLaunchingNotification 49 | object:nil]; 50 | } else { 51 | [self initializeAndLog]; 52 | } 53 | } 54 | return self; 55 | } 56 | 57 | - (void)applicationDidFinishLaunching:(NSNotification *)notification 58 | { 59 | [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationDidFinishLaunchingNotification object:nil]; 60 | [self initializeAndLog]; 61 | } 62 | 63 | - (void)initializeAndLog 64 | { 65 | if ([self __isCodeSignatureValid]) { 66 | #ifdef DEBUG 67 | NSLog(@"[xGhostPreventer] Not preventing distribution because the app is correctly signed"); 68 | #endif 69 | return; 70 | } 71 | 72 | [XGPButtonCellOverride apply]; 73 | 74 | NSString *name = [self.bundle objectForInfoDictionaryKey:@"CFBundleName"]; 75 | NSString *version = [self.bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; 76 | NSString *status = [self initialize] ? @"loaded successfully" : @"failed to load"; 77 | NSLog(@"🔌 Plugin %@ %@ %@", name, version, status); 78 | } 79 | 80 | #pragma mark - Implementation 81 | 82 | - (BOOL)initialize 83 | { 84 | Class controllerClass = NSClassFromString(@"IDEDistributionAssistantWindowController"); 85 | if (!controllerClass) return NO; 86 | 87 | Method m1 = class_getClassMethod(controllerClass, @selector(beginAssistantWithArchive:task:window:)); 88 | if (!m1) return NO; 89 | 90 | Method m2 = class_getClassMethod([self class], @selector(__override_beginAssistantWithArchive:task:window:)); 91 | if (!m2) return NO; 92 | 93 | method_exchangeImplementations(m1, m2); 94 | 95 | return YES; 96 | } 97 | 98 | + (void)__override_beginAssistantWithArchive:(IDEArchive *)archive task:(int)task window:(NSWindow *)windowForSheet 99 | { 100 | Class controllerClass = NSClassFromString(@"IDEDistributionAssistantWindowController"); 101 | Class contextClass = NSClassFromString(@"IDEDistributionContext"); 102 | 103 | // setup distribution for later, if the user decides to go ahead 104 | id ctx = [(IDEDistributionContext *)[contextClass alloc] initWithParent:nil]; 105 | [ctx setArchive:archive]; 106 | [ctx setDistributionTask:@(task)]; 107 | 108 | id controller = [(IDEDistributionAssistantWindowController *)[controllerClass alloc] initWithArchive:archive task:task]; 109 | [controller setContext:ctx]; 110 | 111 | if (task == 0) { 112 | // validate task doesn't have to be prevented 113 | [controller beginSheetModalForWindow:windowForSheet completionBlock:nil]; 114 | return; 115 | } 116 | 117 | NSAlert *alert = [NSAlert new]; 118 | 119 | alert.messageText = [XGPMessage firstAlertTitle]; 120 | alert.informativeText = [XGPMessage firstAlertBody]; 121 | 122 | [alert addButtonWithTitle:@"No, Let's Be Safe"]; 123 | [alert addButtonWithTitle:@"Yes, I am Irresponsible"]; 124 | 125 | [alert beginSheetModalForWindow:windowForSheet completionHandler:^(NSModalResponse returnCode) { 126 | if (returnCode == NSAlertFirstButtonReturn) { 127 | [controller invalidate]; 128 | return; 129 | } 130 | 131 | NSAlert *alert2 = [NSAlert new]; 132 | 133 | alert2.messageText = @"Sure?"; 134 | alert2.informativeText = @"PEOPLE MAY DIE!!!!1"; 135 | 136 | [alert2 addButtonWithTitle:@"Back to Safety"]; 137 | [alert2 addButtonWithTitle:@"Let's Go!"]; 138 | 139 | [alert2 setAccessoryView:[XGPSadTim sadTimView]]; 140 | 141 | [alert2 beginSheetModalForWindow:windowForSheet completionHandler:^(NSModalResponse returnCode) { 142 | if (returnCode == NSAlertFirstButtonReturn) { 143 | [controller invalidate]; 144 | return; 145 | } 146 | 147 | [controller beginSheetModalForWindow:windowForSheet completionBlock:nil]; 148 | }]; 149 | }]; 150 | } 151 | 152 | - (BOOL)__isCodeSignatureValid 153 | { 154 | CFErrorRef secError; 155 | 156 | SecCodeRef code; 157 | if (SecCodeCopySelf(kSecCSDefaultFlags, &code) != 0) return NO; 158 | 159 | SecStaticCodeRef staticCode; 160 | if (SecCodeCopyStaticCode(code, kSecCSDefaultFlags, &staticCode) != 0) return NO; 161 | 162 | return (SecCodeCheckValidityWithErrors(code, kSecCSDefaultFlags, NULL, &secError) == 0) && (SecStaticCodeCheckValidity(staticCode, kSecCSDefaultFlags, NULL) == 0); 163 | } 164 | 165 | @end 166 | -------------------------------------------------------------------------------- /xGhostPreventer.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | B970CA2B9A12A7C13DCD8A0F /* XGPMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = B970C9605FE28BEA9D2FC987 /* XGPMessage.m */; }; 11 | B970CCD9E0B5703AD546E2ED /* XGPSadTim.m in Sources */ = {isa = PBXBuildFile; fileRef = B970C35520EB77FAF20C0D6C /* XGPSadTim.m */; }; 12 | DD8C3D8A1E2D0FAA00CF079C /* IDEProductsButton_center_disabled.tiff in Resources */ = {isa = PBXBuildFile; fileRef = DD8C3D821E2D0FAA00CF079C /* IDEProductsButton_center_disabled.tiff */; }; 13 | DD8C3D8B1E2D0FAA00CF079C /* IDEProductsButton_center_pressed.tiff in Resources */ = {isa = PBXBuildFile; fileRef = DD8C3D831E2D0FAA00CF079C /* IDEProductsButton_center_pressed.tiff */; }; 14 | DD8C3D8C1E2D0FAA00CF079C /* IDEProductsButton_center.tiff in Resources */ = {isa = PBXBuildFile; fileRef = DD8C3D841E2D0FAA00CF079C /* IDEProductsButton_center.tiff */; }; 15 | DD8C3D8D1E2D0FAA00CF079C /* IDEProductsButton_left_disabled.tiff in Resources */ = {isa = PBXBuildFile; fileRef = DD8C3D851E2D0FAA00CF079C /* IDEProductsButton_left_disabled.tiff */; }; 16 | DD8C3D8E1E2D0FAA00CF079C /* IDEProductsButton_left_pressed.tiff in Resources */ = {isa = PBXBuildFile; fileRef = DD8C3D861E2D0FAA00CF079C /* IDEProductsButton_left_pressed.tiff */; }; 17 | DD8C3D8F1E2D0FAA00CF079C /* IDEProductsButton_left.tiff in Resources */ = {isa = PBXBuildFile; fileRef = DD8C3D871E2D0FAA00CF079C /* IDEProductsButton_left.tiff */; }; 18 | DD8C3D901E2D0FAA00CF079C /* IDEProductsButton_right_pressed.tiff in Resources */ = {isa = PBXBuildFile; fileRef = DD8C3D881E2D0FAA00CF079C /* IDEProductsButton_right_pressed.tiff */; }; 19 | DD8C3D911E2D0FAA00CF079C /* IDEProductsButton_right.tiff in Resources */ = {isa = PBXBuildFile; fileRef = DD8C3D891E2D0FAA00CF079C /* IDEProductsButton_right.tiff */; }; 20 | DD8C3D941E2D0FC900CF079C /* XGPButtonCellOverride.m in Sources */ = {isa = PBXBuildFile; fileRef = DD8C3D931E2D0FC900CF079C /* XGPButtonCellOverride.m */; }; 21 | DD8DAD441E2CEB1900723C55 /* xGhostPreventer.m in Sources */ = {isa = PBXBuildFile; fileRef = DD8DAD431E2CEB1900723C55 /* xGhostPreventer.m */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXFileReference section */ 25 | B970C0A76415E2FAF0D1DBD0 /* XGPMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XGPMessage.h; sourceTree = ""; }; 26 | B970C35520EB77FAF20C0D6C /* XGPSadTim.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XGPSadTim.m; sourceTree = ""; }; 27 | B970C3E99E027ECF9D8A85F4 /* IDEDistributionAssistantWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDEDistributionAssistantWindowController.h; sourceTree = ""; }; 28 | B970C94A2F48C9397F30E443 /* XGPSadTim.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XGPSadTim.h; sourceTree = ""; }; 29 | B970C9605FE28BEA9D2FC987 /* XGPMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XGPMessage.m; sourceTree = ""; }; 30 | DD8C3D821E2D0FAA00CF079C /* IDEProductsButton_center_disabled.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = IDEProductsButton_center_disabled.tiff; path = Resources/IDEProductsButton_center_disabled.tiff; sourceTree = SOURCE_ROOT; }; 31 | DD8C3D831E2D0FAA00CF079C /* IDEProductsButton_center_pressed.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = IDEProductsButton_center_pressed.tiff; path = Resources/IDEProductsButton_center_pressed.tiff; sourceTree = SOURCE_ROOT; }; 32 | DD8C3D841E2D0FAA00CF079C /* IDEProductsButton_center.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = IDEProductsButton_center.tiff; path = Resources/IDEProductsButton_center.tiff; sourceTree = SOURCE_ROOT; }; 33 | DD8C3D851E2D0FAA00CF079C /* IDEProductsButton_left_disabled.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = IDEProductsButton_left_disabled.tiff; path = Resources/IDEProductsButton_left_disabled.tiff; sourceTree = SOURCE_ROOT; }; 34 | DD8C3D861E2D0FAA00CF079C /* IDEProductsButton_left_pressed.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = IDEProductsButton_left_pressed.tiff; path = Resources/IDEProductsButton_left_pressed.tiff; sourceTree = SOURCE_ROOT; }; 35 | DD8C3D871E2D0FAA00CF079C /* IDEProductsButton_left.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = IDEProductsButton_left.tiff; path = Resources/IDEProductsButton_left.tiff; sourceTree = SOURCE_ROOT; }; 36 | DD8C3D881E2D0FAA00CF079C /* IDEProductsButton_right_pressed.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = IDEProductsButton_right_pressed.tiff; path = Resources/IDEProductsButton_right_pressed.tiff; sourceTree = SOURCE_ROOT; }; 37 | DD8C3D891E2D0FAA00CF079C /* IDEProductsButton_right.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = IDEProductsButton_right.tiff; path = Resources/IDEProductsButton_right.tiff; sourceTree = SOURCE_ROOT; }; 38 | DD8C3D921E2D0FC900CF079C /* XGPButtonCellOverride.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XGPButtonCellOverride.h; sourceTree = ""; }; 39 | DD8C3D931E2D0FC900CF079C /* XGPButtonCellOverride.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XGPButtonCellOverride.m; sourceTree = ""; }; 40 | DD8DAD3D1E2CEB1900723C55 /* xGhostPreventer.xcplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = xGhostPreventer.xcplugin; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | DD8DAD411E2CEB1900723C55 /* xGhostPreventer.xcscheme */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = xGhostPreventer.xcscheme; path = xGhostPreventer.xcodeproj/xcshareddata/xcschemes/xGhostPreventer.xcscheme; sourceTree = SOURCE_ROOT; }; 42 | DD8DAD421E2CEB1900723C55 /* xGhostPreventer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xGhostPreventer.h; sourceTree = ""; }; 43 | DD8DAD431E2CEB1900723C55 /* xGhostPreventer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = xGhostPreventer.m; sourceTree = ""; }; 44 | DD8DAD451E2CEB1900723C55 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | DD03D50F1E2CEE8600E657D9 /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | DD8C3D7C1E2D0A5B00CF079C /* Private Headers */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | B970C3E99E027ECF9D8A85F4 /* IDEDistributionAssistantWindowController.h */, 62 | ); 63 | name = "Private Headers"; 64 | sourceTree = ""; 65 | }; 66 | DD8C3D7D1E2D0A6700CF079C /* Util */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | B970C0A76415E2FAF0D1DBD0 /* XGPMessage.h */, 70 | B970C9605FE28BEA9D2FC987 /* XGPMessage.m */, 71 | B970C35520EB77FAF20C0D6C /* XGPSadTim.m */, 72 | B970C94A2F48C9397F30E443 /* XGPSadTim.h */, 73 | DD8C3D921E2D0FC900CF079C /* XGPButtonCellOverride.h */, 74 | DD8C3D931E2D0FC900CF079C /* XGPButtonCellOverride.m */, 75 | ); 76 | name = Util; 77 | sourceTree = ""; 78 | }; 79 | DD8C3D7E1E2D0A7100CF079C /* PlugIn */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | DD8DAD421E2CEB1900723C55 /* xGhostPreventer.h */, 83 | DD8DAD431E2CEB1900723C55 /* xGhostPreventer.m */, 84 | ); 85 | name = PlugIn; 86 | sourceTree = ""; 87 | }; 88 | DD8C3D7F1E2D0F1800CF079C /* Resources */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | DD8C3D821E2D0FAA00CF079C /* IDEProductsButton_center_disabled.tiff */, 92 | DD8C3D831E2D0FAA00CF079C /* IDEProductsButton_center_pressed.tiff */, 93 | DD8C3D841E2D0FAA00CF079C /* IDEProductsButton_center.tiff */, 94 | DD8C3D851E2D0FAA00CF079C /* IDEProductsButton_left_disabled.tiff */, 95 | DD8C3D861E2D0FAA00CF079C /* IDEProductsButton_left_pressed.tiff */, 96 | DD8C3D871E2D0FAA00CF079C /* IDEProductsButton_left.tiff */, 97 | DD8C3D881E2D0FAA00CF079C /* IDEProductsButton_right_pressed.tiff */, 98 | DD8C3D891E2D0FAA00CF079C /* IDEProductsButton_right.tiff */, 99 | ); 100 | name = Resources; 101 | sourceTree = ""; 102 | }; 103 | DD8DAD351E2CEB1800723C55 = { 104 | isa = PBXGroup; 105 | children = ( 106 | DD8DAD3F1E2CEB1900723C55 /* xGhostPreventer */, 107 | DD8DAD3E1E2CEB1900723C55 /* Products */, 108 | ); 109 | sourceTree = ""; 110 | }; 111 | DD8DAD3E1E2CEB1900723C55 /* Products */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | DD8DAD3D1E2CEB1900723C55 /* xGhostPreventer.xcplugin */, 115 | ); 116 | name = Products; 117 | sourceTree = ""; 118 | }; 119 | DD8DAD3F1E2CEB1900723C55 /* xGhostPreventer */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | DD8C3D7F1E2D0F1800CF079C /* Resources */, 123 | DD8C3D7C1E2D0A5B00CF079C /* Private Headers */, 124 | DD8C3D7D1E2D0A6700CF079C /* Util */, 125 | DD8C3D7E1E2D0A7100CF079C /* PlugIn */, 126 | DD8DAD401E2CEB1900723C55 /* Supporting Files */, 127 | ); 128 | path = xGhostPreventer; 129 | sourceTree = ""; 130 | }; 131 | DD8DAD401E2CEB1900723C55 /* Supporting Files */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | DD8DAD451E2CEB1900723C55 /* Info.plist */, 135 | DD8DAD411E2CEB1900723C55 /* xGhostPreventer.xcscheme */, 136 | ); 137 | name = "Supporting Files"; 138 | sourceTree = ""; 139 | }; 140 | /* End PBXGroup section */ 141 | 142 | /* Begin PBXNativeTarget section */ 143 | DD8DAD3C1E2CEB1800723C55 /* xGhostPreventer */ = { 144 | isa = PBXNativeTarget; 145 | buildConfigurationList = DD8DAD481E2CEB1900723C55 /* Build configuration list for PBXNativeTarget "xGhostPreventer" */; 146 | buildPhases = ( 147 | DD8DAD3A1E2CEB1800723C55 /* Sources */, 148 | DD8DAD3B1E2CEB1800723C55 /* Resources */, 149 | DD03D50F1E2CEE8600E657D9 /* Frameworks */, 150 | ); 151 | buildRules = ( 152 | ); 153 | dependencies = ( 154 | ); 155 | name = xGhostPreventer; 156 | productName = xGhostPreventer; 157 | productReference = DD8DAD3D1E2CEB1900723C55 /* xGhostPreventer.xcplugin */; 158 | productType = "com.apple.product-type.bundle"; 159 | }; 160 | /* End PBXNativeTarget section */ 161 | 162 | /* Begin PBXProject section */ 163 | DD8DAD361E2CEB1800723C55 /* Project object */ = { 164 | isa = PBXProject; 165 | attributes = { 166 | LastUpgradeCheck = 0820; 167 | ORGANIZATIONNAME = "Guilherme Rambo"; 168 | TargetAttributes = { 169 | DD8DAD3C1E2CEB1800723C55 = { 170 | CreatedOnToolsVersion = 8.2.1; 171 | DevelopmentTeam = 8C7439RJLG; 172 | ProvisioningStyle = Automatic; 173 | }; 174 | }; 175 | }; 176 | buildConfigurationList = DD8DAD391E2CEB1800723C55 /* Build configuration list for PBXProject "xGhostPreventer" */; 177 | compatibilityVersion = "Xcode 3.2"; 178 | developmentRegion = English; 179 | hasScannedForEncodings = 0; 180 | knownRegions = ( 181 | en, 182 | ); 183 | mainGroup = DD8DAD351E2CEB1800723C55; 184 | productRefGroup = DD8DAD3E1E2CEB1900723C55 /* Products */; 185 | projectDirPath = ""; 186 | projectRoot = ""; 187 | targets = ( 188 | DD8DAD3C1E2CEB1800723C55 /* xGhostPreventer */, 189 | ); 190 | }; 191 | /* End PBXProject section */ 192 | 193 | /* Begin PBXResourcesBuildPhase section */ 194 | DD8DAD3B1E2CEB1800723C55 /* Resources */ = { 195 | isa = PBXResourcesBuildPhase; 196 | buildActionMask = 2147483647; 197 | files = ( 198 | DD8C3D8A1E2D0FAA00CF079C /* IDEProductsButton_center_disabled.tiff in Resources */, 199 | DD8C3D8C1E2D0FAA00CF079C /* IDEProductsButton_center.tiff in Resources */, 200 | DD8C3D911E2D0FAA00CF079C /* IDEProductsButton_right.tiff in Resources */, 201 | DD8C3D8D1E2D0FAA00CF079C /* IDEProductsButton_left_disabled.tiff in Resources */, 202 | DD8C3D8B1E2D0FAA00CF079C /* IDEProductsButton_center_pressed.tiff in Resources */, 203 | DD8C3D8F1E2D0FAA00CF079C /* IDEProductsButton_left.tiff in Resources */, 204 | DD8C3D901E2D0FAA00CF079C /* IDEProductsButton_right_pressed.tiff in Resources */, 205 | DD8C3D8E1E2D0FAA00CF079C /* IDEProductsButton_left_pressed.tiff in Resources */, 206 | ); 207 | runOnlyForDeploymentPostprocessing = 0; 208 | }; 209 | /* End PBXResourcesBuildPhase section */ 210 | 211 | /* Begin PBXSourcesBuildPhase section */ 212 | DD8DAD3A1E2CEB1800723C55 /* Sources */ = { 213 | isa = PBXSourcesBuildPhase; 214 | buildActionMask = 2147483647; 215 | files = ( 216 | DD8DAD441E2CEB1900723C55 /* xGhostPreventer.m in Sources */, 217 | DD8C3D941E2D0FC900CF079C /* XGPButtonCellOverride.m in Sources */, 218 | B970CCD9E0B5703AD546E2ED /* XGPSadTim.m in Sources */, 219 | B970CA2B9A12A7C13DCD8A0F /* XGPMessage.m in Sources */, 220 | ); 221 | runOnlyForDeploymentPostprocessing = 0; 222 | }; 223 | /* End PBXSourcesBuildPhase section */ 224 | 225 | /* Begin XCBuildConfiguration section */ 226 | DD8DAD461E2CEB1900723C55 /* Debug */ = { 227 | isa = XCBuildConfiguration; 228 | buildSettings = { 229 | ALWAYS_SEARCH_USER_PATHS = NO; 230 | CLANG_ANALYZER_NONNULL = YES; 231 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 232 | CLANG_CXX_LIBRARY = "libc++"; 233 | CLANG_ENABLE_MODULES = YES; 234 | CLANG_ENABLE_OBJC_ARC = YES; 235 | CLANG_WARN_BOOL_CONVERSION = YES; 236 | CLANG_WARN_CONSTANT_CONVERSION = YES; 237 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 238 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 239 | CLANG_WARN_EMPTY_BODY = YES; 240 | CLANG_WARN_ENUM_CONVERSION = YES; 241 | CLANG_WARN_INFINITE_RECURSION = YES; 242 | CLANG_WARN_INT_CONVERSION = YES; 243 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 244 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 245 | CLANG_WARN_UNREACHABLE_CODE = YES; 246 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 247 | CODE_SIGN_IDENTITY = ""; 248 | COPY_PHASE_STRIP = NO; 249 | DEBUG_INFORMATION_FORMAT = dwarf; 250 | ENABLE_STRICT_OBJC_MSGSEND = YES; 251 | ENABLE_TESTABILITY = YES; 252 | GCC_C_LANGUAGE_STANDARD = gnu99; 253 | GCC_DYNAMIC_NO_PIC = NO; 254 | GCC_NO_COMMON_BLOCKS = YES; 255 | GCC_OPTIMIZATION_LEVEL = 0; 256 | GCC_PREPROCESSOR_DEFINITIONS = ( 257 | "DEBUG=1", 258 | "$(inherited)", 259 | ); 260 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 261 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 262 | GCC_WARN_UNDECLARED_SELECTOR = YES; 263 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 264 | GCC_WARN_UNUSED_FUNCTION = YES; 265 | GCC_WARN_UNUSED_VARIABLE = YES; 266 | MACOSX_DEPLOYMENT_TARGET = 10.12; 267 | MTL_ENABLE_DEBUG_INFO = YES; 268 | ONLY_ACTIVE_ARCH = YES; 269 | SDKROOT = macosx; 270 | }; 271 | name = Debug; 272 | }; 273 | DD8DAD471E2CEB1900723C55 /* Release */ = { 274 | isa = XCBuildConfiguration; 275 | buildSettings = { 276 | ALWAYS_SEARCH_USER_PATHS = NO; 277 | CLANG_ANALYZER_NONNULL = YES; 278 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 279 | CLANG_CXX_LIBRARY = "libc++"; 280 | CLANG_ENABLE_MODULES = YES; 281 | CLANG_ENABLE_OBJC_ARC = YES; 282 | CLANG_WARN_BOOL_CONVERSION = YES; 283 | CLANG_WARN_CONSTANT_CONVERSION = YES; 284 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 285 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 286 | CLANG_WARN_EMPTY_BODY = YES; 287 | CLANG_WARN_ENUM_CONVERSION = YES; 288 | CLANG_WARN_INFINITE_RECURSION = YES; 289 | CLANG_WARN_INT_CONVERSION = YES; 290 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 291 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 292 | CLANG_WARN_UNREACHABLE_CODE = YES; 293 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 294 | CODE_SIGN_IDENTITY = ""; 295 | COPY_PHASE_STRIP = NO; 296 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 297 | ENABLE_NS_ASSERTIONS = NO; 298 | ENABLE_STRICT_OBJC_MSGSEND = YES; 299 | GCC_C_LANGUAGE_STANDARD = gnu99; 300 | GCC_NO_COMMON_BLOCKS = YES; 301 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 302 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 303 | GCC_WARN_UNDECLARED_SELECTOR = YES; 304 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 305 | GCC_WARN_UNUSED_FUNCTION = YES; 306 | GCC_WARN_UNUSED_VARIABLE = YES; 307 | MACOSX_DEPLOYMENT_TARGET = 10.12; 308 | MTL_ENABLE_DEBUG_INFO = NO; 309 | SDKROOT = macosx; 310 | }; 311 | name = Release; 312 | }; 313 | DD8DAD491E2CEB1900723C55 /* Debug */ = { 314 | isa = XCBuildConfiguration; 315 | buildSettings = { 316 | CODE_SIGN_IDENTITY = ""; 317 | COMBINE_HIDPI_IMAGES = YES; 318 | DEPLOYMENT_LOCATION = YES; 319 | DEVELOPMENT_TEAM = 8C7439RJLG; 320 | DSTROOT = "$(HOME)"; 321 | INFOPLIST_FILE = xGhostPreventer/Info.plist; 322 | INSTALL_PATH = "/Library/Application Support/Developer/Shared/Xcode/Plug-ins"; 323 | MACOSX_DEPLOYMENT_TARGET = 10.11; 324 | PRODUCT_BUNDLE_IDENTIFIER = br.com.guilhermerambo.xGhostPreventer; 325 | PRODUCT_NAME = "$(TARGET_NAME)"; 326 | SKIP_INSTALL = YES; 327 | WRAPPER_EXTENSION = xcplugin; 328 | }; 329 | name = Debug; 330 | }; 331 | DD8DAD4A1E2CEB1900723C55 /* Release */ = { 332 | isa = XCBuildConfiguration; 333 | buildSettings = { 334 | CODE_SIGN_IDENTITY = ""; 335 | COMBINE_HIDPI_IMAGES = YES; 336 | DEPLOYMENT_LOCATION = YES; 337 | DEVELOPMENT_TEAM = 8C7439RJLG; 338 | DSTROOT = "$(HOME)"; 339 | INFOPLIST_FILE = xGhostPreventer/Info.plist; 340 | INSTALL_PATH = "/Library/Application Support/Developer/Shared/Xcode/Plug-ins"; 341 | MACOSX_DEPLOYMENT_TARGET = 10.11; 342 | PRODUCT_BUNDLE_IDENTIFIER = br.com.guilhermerambo.xGhostPreventer; 343 | PRODUCT_NAME = "$(TARGET_NAME)"; 344 | WRAPPER_EXTENSION = xcplugin; 345 | }; 346 | name = Release; 347 | }; 348 | /* End XCBuildConfiguration section */ 349 | 350 | /* Begin XCConfigurationList section */ 351 | DD8DAD391E2CEB1800723C55 /* Build configuration list for PBXProject "xGhostPreventer" */ = { 352 | isa = XCConfigurationList; 353 | buildConfigurations = ( 354 | DD8DAD461E2CEB1900723C55 /* Debug */, 355 | DD8DAD471E2CEB1900723C55 /* Release */, 356 | ); 357 | defaultConfigurationIsVisible = 0; 358 | defaultConfigurationName = Release; 359 | }; 360 | DD8DAD481E2CEB1900723C55 /* Build configuration list for PBXNativeTarget "xGhostPreventer" */ = { 361 | isa = XCConfigurationList; 362 | buildConfigurations = ( 363 | DD8DAD491E2CEB1900723C55 /* Debug */, 364 | DD8DAD4A1E2CEB1900723C55 /* Release */, 365 | ); 366 | defaultConfigurationIsVisible = 0; 367 | defaultConfigurationName = Release; 368 | }; 369 | /* End XCConfigurationList section */ 370 | }; 371 | rootObject = DD8DAD361E2CEB1800723C55 /* Project object */; 372 | } 373 | -------------------------------------------------------------------------------- /xGhostPreventer/XGPSadTim.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Guilherme Rambo on 16/01/17. 3 | // Copyright (c) 2017 Guilherme Rambo. All rights reserved. 4 | // 5 | 6 | #import "XGPSadTim.h" 7 | 8 | NSString * const kXGPSadTimImage = @"\"Sad"; 9 | 10 | @implementation XGPSadTim 11 | 12 | + (WKWebView *)sadTimView 13 | { 14 | WKWebView *wv = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 500, 250) configuration:[WKWebViewConfiguration new]]; 15 | 16 | [wv loadHTMLString:kXGPSadTimImage baseURL:nil]; 17 | 18 | return wv; 19 | } 20 | 21 | @end --------------------------------------------------------------------------------