├── Product
└── EasyResigny.app
│ └── Contents
│ ├── PkgInfo
│ ├── MacOS
│ └── EasyResigny
│ ├── Resources
│ ├── AppIcon.icns
│ ├── Base.lproj
│ │ └── MainMenu.nib
│ ├── ERDashboardViewController.nib
│ └── Info.plist
│ ├── Info.plist
│ └── _CodeSignature
│ └── CodeResources
├── EasyResigny256.png
├── EasyResigny
├── EasyResigny
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ │ │ ├── EasyResigny.png
│ │ │ │ ├── EasyResigny16.png
│ │ │ │ ├── EasyResigny32.png
│ │ │ │ ├── EasyResigny128.png
│ │ │ │ ├── EasyResigny256.png
│ │ │ │ ├── EasyResigny@2x.png
│ │ │ │ ├── EasyResigny128@2x.png
│ │ │ │ ├── EasyResigny16@2x.png
│ │ │ │ ├── EasyResigny256@2x.png
│ │ │ │ ├── EasyResigny32@2x.png
│ │ │ │ └── Contents.json
│ │ ├── Info.plist
│ │ └── Base.lproj
│ │ │ └── MainMenu.xib
│ └── Classes
│ │ ├── Modules
│ │ ├── Views
│ │ │ ├── ERDragTextField.h
│ │ │ └── ERDragTextField.m
│ │ ├── ViewControllers
│ │ │ ├── ERDashboardViewController.h
│ │ │ ├── ERDashboardViewController.m
│ │ │ └── ERDashboardViewController.xib
│ │ └── Model
│ │ │ ├── ERCodesignProcess.h
│ │ │ ├── ERContex.h
│ │ │ ├── ERContex.m
│ │ │ └── ERCodesignProcess.m
│ │ ├── Main
│ │ ├── main.m
│ │ ├── AppDelegate.h
│ │ ├── AppDelegate+ERSetup.h
│ │ ├── AppDelegate+ERSetup.m
│ │ └── AppDelegate.m
│ │ └── Library
│ │ ├── NYCocoaKit.h
│ │ ├── NYCocoaKit.m
│ │ ├── NYCmdTool.h
│ │ └── NYCmdTool.m
├── EasyResigny.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcuserdata
│ │ │ └── niyao.xcuserdatad
│ │ │ └── xcdebugger
│ │ │ └── Expressions.xcexplist
│ ├── xcuserdata
│ │ └── niyao.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── xcschememanagement.plist
│ │ │ └── EasyResigny.xcscheme
│ └── project.pbxproj
├── EasyResignyTests
│ ├── Info.plist
│ └── EasyResignyTests.m
└── EasyResignyUITests
│ ├── Info.plist
│ └── EasyResignyUITests.m
└── README.md
/Product/EasyResigny.app/Contents/PkgInfo:
--------------------------------------------------------------------------------
1 | APPL????
--------------------------------------------------------------------------------
/EasyResigny256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/EasyResigny256.png
--------------------------------------------------------------------------------
/Product/EasyResigny.app/Contents/MacOS/EasyResigny:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/Product/EasyResigny.app/Contents/MacOS/EasyResigny
--------------------------------------------------------------------------------
/Product/EasyResigny.app/Contents/Resources/AppIcon.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/Product/EasyResigny.app/Contents/Resources/AppIcon.icns
--------------------------------------------------------------------------------
/Product/EasyResigny.app/Contents/Resources/Base.lproj/MainMenu.nib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/Product/EasyResigny.app/Contents/Resources/Base.lproj/MainMenu.nib
--------------------------------------------------------------------------------
/Product/EasyResigny.app/Contents/Resources/ERDashboardViewController.nib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/Product/EasyResigny.app/Contents/Resources/ERDashboardViewController.nib
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny.png
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny16.png
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny32.png
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny128.png
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny256.png
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny@2x.png
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny128@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny128@2x.png
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny16@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny16@2x.png
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny256@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny256@2x.png
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny32@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/niyaoyao/EasyResigny/HEAD/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/EasyResigny32@2x.png
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Modules/Views/ERDragTextField.h:
--------------------------------------------------------------------------------
1 | //
2 | // ERDragTextField.h
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ERDragTextField : NSTextField
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Main/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | int main(int argc, const char * argv[]) {
12 | return NSApplicationMain(argc, argv);
13 | }
14 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Main/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AppDelegate : NSObject
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Main/AppDelegate+ERSetup.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate+ERSetup.h
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 |
11 | @interface AppDelegate (ERSetup)
12 |
13 | - (void)applicationDidFinishLaunching;
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Modules/ViewControllers/ERDashboardViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // ERDashboardViewController.h
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ERDashboardViewController : NSViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Main/AppDelegate+ERSetup.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate+ERSetup.m
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate+ERSetup.h"
10 | #import "ERCodesignProcess.h"
11 |
12 | @implementation AppDelegate (ERSetup)
13 |
14 | - (void)applicationDidFinishLaunching {
15 | [ERCodesignProcess easyResignyDidLaunched];
16 | }
17 |
18 | @end
19 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Library/NYCocoaKit.h:
--------------------------------------------------------------------------------
1 | //
2 | // NYCocoaKit.h
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | @interface NYCocoaKit : NSObject
13 |
14 | + (void)showErrorMessage:(NSString *)message;
15 | + (void)showInformationMessage:(NSString *)message;
16 | + (void)showAlertOfKind:(NSAlertStyle)style title:(NSString *)title message:(NSString *)message;
17 |
18 | @end
19 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny.xcodeproj/project.xcworkspace/xcuserdata/niyao.xcuserdatad/xcdebugger/Expressions.xcexplist:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
7 |
8 |
10 |
11 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResignyTests/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 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResignyUITests/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 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny.xcodeproj/xcuserdata/niyao.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | EasyResigny.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | 8CF1909A1E7F94BC00DB3049
16 |
17 | primary
18 |
19 |
20 | 8CF190AD1E7F94BC00DB3049
21 |
22 | primary
23 |
24 |
25 | 8CF190B81E7F94BC00DB3049
26 |
27 | primary
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Main/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 | #import "AppDelegate+ERSetup.h"
11 | #import "ERDashboardViewController.h"
12 |
13 | @interface AppDelegate ()
14 |
15 | @property (weak) IBOutlet NSWindow *window;
16 | @end
17 |
18 | @implementation AppDelegate
19 |
20 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
21 | // Insert code here to initialize your application
22 | [self applicationDidFinishLaunching];
23 | self.window.contentViewController = [[ERDashboardViewController alloc] init];
24 | [self.window makeMainWindow];
25 | }
26 |
27 |
28 | - (void)applicationWillTerminate:(NSNotification *)aNotification {
29 | // Insert code here to tear down your application
30 | }
31 |
32 |
33 | @end
34 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Library/NYCocoaKit.m:
--------------------------------------------------------------------------------
1 | //
2 | // NYCocoaKit.m
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import "NYCocoaKit.h"
10 |
11 | static NSString * const kAlertErrorTitle = @"Error";
12 | static NSString * const kAlertInfoioinforTitle = @"Information";
13 |
14 | @implementation NYCocoaKit
15 |
16 | + (void)showErrorMessage:(NSString *)message {
17 | [self showAlertOfKind:NSAlertStyleCritical title:kAlertErrorTitle message:message];
18 | }
19 |
20 | + (void)showInformationMessage:(NSString *)message {
21 | [self showAlertOfKind:NSAlertStyleCritical title:kAlertInfoioinforTitle message:message];
22 | }
23 |
24 | + (void)showAlertOfKind:(NSAlertStyle)style title:(NSString *)title message:(NSString *)message {
25 | NSAlert *alert = [[NSAlert alloc] init];
26 | [alert addButtonWithTitle:@"OK"];
27 | [alert setMessageText:title];
28 | [alert setInformativeText:message];
29 | [alert setAlertStyle:style];
30 | [alert runModal];
31 | }
32 |
33 | @end
34 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResignyTests/EasyResignyTests.m:
--------------------------------------------------------------------------------
1 | //
2 | // EasyResignyTests.m
3 | // EasyResignyTests
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface EasyResignyTests : XCTestCase
12 |
13 | @end
14 |
15 | @implementation EasyResignyTests
16 |
17 | - (void)setUp {
18 | [super setUp];
19 | // Put setup code here. This method is called before the invocation of each test method in the class.
20 | }
21 |
22 | - (void)tearDown {
23 | // Put teardown code here. This method is called after the invocation of each test method in the class.
24 | [super tearDown];
25 | }
26 |
27 | - (void)testExample {
28 | // This is an example of a functional test case.
29 | // Use XCTAssert and related functions to verify your tests produce the correct results.
30 | }
31 |
32 | - (void)testPerformanceExample {
33 | // This is an example of a performance test case.
34 | [self measureBlock:^{
35 | // Put the code you want to measure the time of here.
36 | }];
37 | }
38 |
39 | @end
40 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Modules/Model/ERCodesignProcess.h:
--------------------------------------------------------------------------------
1 | //
2 | // ERResignProcess.h
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 21/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | typedef void(^ERCodesignCompletion)(NSString *prompt);
12 |
13 | @interface ERCodesignProcess : NSObject
14 |
15 | + (void)easyResignyDidLaunched;
16 |
17 | + (void)startLoadProvisionProfileCompletion:(ERCodesignCompletion)loadProvisionProfileCompletion
18 | unzipIPACompletion:(ERCodesignCompletion)unzipIPACompletion
19 | getExecutableFileCompletion:(ERCodesignCompletion)getExecutableFileCompletion
20 | changeExeModeCompletion:(ERCodesignCompletion)changeExeModeCompletion
21 | writeInfoPlistCompletion:(ERCodesignCompletion)writeInfoPlistCompletion
22 | signCertificateCompletion:(ERCodesignCompletion)signCertificateCompletion
23 | saveIPACompletion:(ERCodesignCompletion)saveIPACompletion;
24 |
25 | + (void)easyResignyDidFinishCodesigning;
26 |
27 | @end
28 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0.2
21 | CFBundleVersion
22 | 3
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSHumanReadableCopyright
26 | Copyright © 2017 suneny. All rights reserved.
27 | NSMainNibFile
28 | MainMenu
29 | NSPrincipalClass
30 | NSApplication
31 |
32 |
33 |
--------------------------------------------------------------------------------
/Product/EasyResigny.app/Contents/Resources/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0.2
21 | CFBundleVersion
22 | 3
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSHumanReadableCopyright
26 | Copyright © 2017 suneny. All rights reserved.
27 | NSMainNibFile
28 | MainMenu
29 | NSPrincipalClass
30 | NSApplication
31 |
32 |
33 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResignyUITests/EasyResignyUITests.m:
--------------------------------------------------------------------------------
1 | //
2 | // EasyResignyUITests.m
3 | // EasyResignyUITests
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface EasyResignyUITests : XCTestCase
12 |
13 | @end
14 |
15 | @implementation EasyResignyUITests
16 |
17 | - (void)setUp {
18 | [super setUp];
19 |
20 | // Put setup code here. This method is called before the invocation of each test method in the class.
21 |
22 | // In UI tests it is usually best to stop immediately when a failure occurs.
23 | self.continueAfterFailure = NO;
24 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
25 | [[[XCUIApplication alloc] init] launch];
26 |
27 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
28 | }
29 |
30 | - (void)tearDown {
31 | // Put teardown code here. This method is called after the invocation of each test method in the class.
32 | [super tearDown];
33 | }
34 |
35 | - (void)testExample {
36 | // Use recording to get started writing UI tests.
37 | // Use XCTAssert and related functions to verify your tests produce the correct results.
38 | }
39 |
40 | @end
41 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Modules/Views/ERDragTextField.m:
--------------------------------------------------------------------------------
1 | //
2 | // ERDragTextField.m
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import "ERDragTextField.h"
10 |
11 | @implementation ERDragTextField
12 |
13 | - (void)awakeFromNib {
14 | [self registerForDraggedTypes:@[NSFilenamesPboardType]];
15 | }
16 |
17 | - (BOOL)performDragOperation:(id)sender {
18 | NSPasteboard *board = [sender draggingPasteboard];
19 | NSArray *files = [board propertyListForType:NSFilenamesPboardType];
20 | if (files.count <= 0) {
21 | return NO;
22 | }
23 | self.stringValue = [files firstObject];
24 | return YES;
25 | }
26 |
27 | - (NSDragOperation)draggingEntered:(id)sender {
28 | if (!self.isEnabled) {
29 | return NSDragOperationNone;
30 | }
31 |
32 | NSPasteboard *board = [sender draggingPasteboard];
33 | NSDragOperation dragOperationMask = [sender draggingSourceOperationMask];
34 |
35 | if ([[board types] containsObject:NSColorPboardType]) {
36 | if (dragOperationMask & NSDragOperationCopy) {
37 | return NSDragOperationCopy;
38 | }
39 | }
40 |
41 | if ([[board types] containsObject:NSFilenamesPboardType]) {
42 | if (dragOperationMask & NSDragOperationCopy) {
43 | return NSDragOperationCopy;
44 | }
45 | }
46 |
47 | return NSDragOperationNone;
48 | }
49 |
50 | @end
51 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "16x16",
5 | "idiom" : "mac",
6 | "filename" : "EasyResigny16.png",
7 | "scale" : "1x"
8 | },
9 | {
10 | "size" : "16x16",
11 | "idiom" : "mac",
12 | "filename" : "EasyResigny16@2x.png",
13 | "scale" : "2x"
14 | },
15 | {
16 | "size" : "32x32",
17 | "idiom" : "mac",
18 | "filename" : "EasyResigny32.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "32x32",
23 | "idiom" : "mac",
24 | "filename" : "EasyResigny32@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "128x128",
29 | "idiom" : "mac",
30 | "filename" : "EasyResigny128.png",
31 | "scale" : "1x"
32 | },
33 | {
34 | "size" : "128x128",
35 | "idiom" : "mac",
36 | "filename" : "EasyResigny128@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "256x256",
41 | "idiom" : "mac",
42 | "filename" : "EasyResigny256.png",
43 | "scale" : "1x"
44 | },
45 | {
46 | "size" : "256x256",
47 | "idiom" : "mac",
48 | "filename" : "EasyResigny256@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "512x512",
53 | "idiom" : "mac",
54 | "filename" : "EasyResigny.png",
55 | "scale" : "1x"
56 | },
57 | {
58 | "size" : "512x512",
59 | "idiom" : "mac",
60 | "filename" : "EasyResigny@2x.png",
61 | "scale" : "2x"
62 | }
63 | ],
64 | "info" : {
65 | "version" : 1,
66 | "author" : "xcode"
67 | }
68 | }
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Modules/Model/ERContex.h:
--------------------------------------------------------------------------------
1 | //
2 | // ERContex.h
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 21/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ERContex : NSObject
12 |
13 | + (instancetype)sharedContex;
14 |
15 | + (void)setIPAOriginPath:(NSString *)originPath;
16 | + (NSString *)getIPAOriginPath;
17 | + (void)clearIPAOriginPath;
18 |
19 | + (void)setSelectCertificate:(NSString *)certificate;
20 | + (NSString *)getSelectCertificate;
21 |
22 | + (void)setSelectProvisionProfilePath:(NSString *)selectProvisionProfilePath;
23 | + (NSString *)getSelectProvisionProfilePath;
24 |
25 | + (NSString *)getResignedAppBundleID;
26 |
27 | + (void)setAppName:(NSString *)appName;
28 | + (NSString *)getAppName;
29 |
30 | + (void)setAppVersion:(NSString *)appVersion;
31 | + (NSString *)getAppVersion;
32 |
33 | + (void)setAppBuildCode:(NSString *)appBuildCode;
34 | + (NSString *)getAppBuildCode;
35 |
36 | + (void)setProvisionPlist:(NSDictionary *)dic;
37 | + (NSDictionary *)getEntitlements;
38 | + (NSString *)getEntitlementsPath;
39 |
40 | + (NSString *)getWorkSpacePath;
41 | + (void)setWorkSpacePath:(NSString *)tempWorkingPath;
42 |
43 | + (void)setPayloadPath;
44 | + (NSString *)getPayloadPath;
45 | + (NSString *)getAppPath;
46 | + (NSString *)getInfoPlistPath;
47 | + (NSString *)getWatchPath;
48 |
49 | + (void)setResignedAppSavePath:(NSString *)savePath;
50 | + (NSString *)getResignedAppSavePath;
51 |
52 | + (void)setCFBundleExecutableName:(NSString *)executableName;
53 | + (NSString *)getCFBundleExecutableName;
54 | + (NSString *)getExecutableFilePath;
55 | + (void)clearAll;
56 |
57 | @end
58 |
--------------------------------------------------------------------------------
/Product/EasyResigny.app/Contents/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | BuildMachineOSBuild
6 | 16D32
7 | CFBundleDevelopmentRegion
8 | en
9 | CFBundleExecutable
10 | EasyResigny
11 | CFBundleIconFile
12 | AppIcon
13 | CFBundleIdentifier
14 | that.boring.bear.ny.easy.resigny
15 | CFBundleInfoDictionaryVersion
16 | 6.0
17 | CFBundleName
18 | EasyResigny
19 | CFBundlePackageType
20 | APPL
21 | CFBundleShortVersionString
22 | 1.0.2
23 | CFBundleSupportedPlatforms
24 |
25 | MacOSX
26 |
27 | CFBundleVersion
28 | 3
29 | DTCompiler
30 | com.apple.compilers.llvm.clang.1_0
31 | DTPlatformBuild
32 | 8A218a
33 | DTPlatformVersion
34 | GM
35 | DTSDKBuild
36 | 16A300
37 | DTSDKName
38 | macosx10.12
39 | DTXcode
40 | 0800
41 | DTXcodeBuild
42 | 8A218a
43 | LSMinimumSystemVersion
44 | 10.12
45 | NSHumanReadableCopyright
46 | Copyright © 2017 suneny. All rights reserved.
47 | NSMainNibFile
48 | MainMenu
49 | NSPrincipalClass
50 | NSApplication
51 |
52 |
53 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Library/NYCmdTool.h:
--------------------------------------------------------------------------------
1 | //
2 | // NYCmd.h
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | typedef void (^NYCmdToolCompletion)(NSError *error, id object);
12 |
13 | @interface NYCmdTool : NSObject
14 |
15 | + (BOOL)fileExistsAtPath:(NSString *)filePath;
16 | + (dispatch_queue_t)cmdTaskQueue;
17 |
18 | #pragma mark - Check
19 | + (void)checkCommandLineTools;
20 | + (void)checkCommandLineToolsCompletion:(NYCmdToolCompletion)completion;
21 |
22 | #pragma mark - Resign Task
23 | + (void)launchFindCertificateIDsTaskCompletion:(NYCmdToolCompletion)completion;
24 | + (void)launchLoadProvisionProfilePath:(NSString *)provisionProfilePath completion:(NYCmdToolCompletion)completion;
25 | + (void)launchUnzipAppTaskWithSource:(NSString *)source destination:(NSString *)destination completion:(NYCmdToolCompletion)completion;
26 |
27 | + (void)launchReadTaskPath:(NSString *)path key:(NSString *)key completion:(NYCmdToolCompletion)completion;
28 | + (void)launchWriteTaskPlistPath:(NSString *)plistPath key:(NSString *)key value:(NSString *)value completion:(NYCmdToolCompletion)completion;
29 | + (void)launchChmodExecutable:(NSString *)executablePath completion:(NYCmdToolCompletion)completion;
30 | + (NSString *)saveEntitlements:(NSDictionary *)entitlements savedDir:(NSString *)savedDir;
31 | + (void)launchCodesignCertificate:(NSString *)certificate entitlementsPlisPath:(NSString *)entitlementsPlisPath
32 | appPath:(NSString *)appPath completion:(NYCmdToolCompletion)completion;
33 | + (void)launchZipCurrentPath:(NSString *)current destinationPath:(NSString *)destination appPath:(NSString *)appPath completion:(NYCmdToolCompletion)completion;
34 | + (void)launchTaskFindPath:(NSString *)path fileName:(NSString *)fileName completion:(NYCmdToolCompletion)completion;
35 | + (void)launchRemovePath:(NSString *)path completion:(NYCmdToolCompletion)completion;
36 | @end
37 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # EasyResigny
2 | 
3 |
4 | ## About
5 | **EasyResigny** is a Mac tool for user to resign iOS App.
6 |
7 | ## Note
8 | - To use **EasyResigny** to resign iOS App, you must ensure your App has been decrypted.You can use [dumpdecrypted](https://github.com/stefanesser/dumpdecrypted) to decrypt your app or download jailbreak Apps. If the App has not been decrypted, it will crash after installing on iDevices.
9 |
10 | - This resign tool will remove files at ```Watch``` and ```Plugins``` directories at present,so that it can make sure verify application codesign success when install.
11 |
12 | - **EasyResigny** cannot codesign the injected dylib, so you'd better codesign it by yourself first.(I will fix it soon.)
13 |
14 | ## Getting Started
15 | - Open ```./Products``` and double click **EasyResigny**, or build project at ```./EasyResigny``` directory.
16 |
17 | - Drag, input or select the options needed.__Certifacate__,__Provision Profile__ and __App IPA__ is required.
18 |
19 | - Click ```Start EasyResigny``` button.
20 |
21 | ## Install IPA
22 | You can use [ideviceinstaller](https://github.com/libimobiledevice/ideviceinstaller) to install on your iDevices.
23 |
24 | ## Getting Help
25 | - If it turns out that you may have found a bug, please open an issue.
26 | - Send email to nycode.jn@gmail.com .
27 |
28 | ## To to List
29 | What should I do next?
30 | ### Required
31 | - Export Command Line Logs.
32 | - Scan Mach-O, check Mach-O decrypted or not.And if it doesn't be decrypted, show error message.
33 | - Import hook dylib file and codesign dylib.
34 |
35 | ### Option
36 | - Codesign Mac App.
37 | - iDevice install IPA automation.
38 |
39 | ## Thanks To
40 | - [maciekish / iReSign](https://github.com/maciekish/iReSign): The basic process was gleaned from the source code of this project.
41 | - [DanTheMan827/ios-app-signer](https://github.com/DanTheMan827/ios-app-signer):This is an app for OS X that can (re)sign apps and bundle them into ipa files that are ready to be installed on an iOS device.
42 |
43 | ## License
44 | MIT
45 |
46 | ## My Sincere Words
47 | EasyResigny is my first Mac App tool, it is inspired by [maciekish / iReSign](https://github.com/maciekish/iReSign) and [DanTheMan827/ios-app-signer](https://github.com/DanTheMan827/ios-app-signer).Though it's not good enough,I will try my best to make it better. And what's more, welcome to open an issue to make the tool become better.Thanks a lot!
48 |
49 | ======
50 | ## 关于
51 | **EasyResigny** 是一款使用简单的重签名 Mac 工具。
52 |
53 | ## 注意
54 | - 在使用 **EasyResigny** 重签名之前,请先确保重签名的 App 已经被破解。你可以使用 [dumpdecrypted](https://github.com/stefanesser/dumpdecrypted) 工具进行动态解密,或者直接在越狱渠道下载 App IPA 包文件。
55 | - 这个重签名工具目前默认会将 ```Watch``` 以及 ```Plugins``` 目录下的文件删除,以确保应用重签名生成的 IPA 文件可以正常安装到苹果设备上。
56 | - **EasyResigny** 目前并不能将注入的 dylib 文件重签名,所以你需要自己先重签名。(我会尽快修复这个 bug 🙈 ~)
57 |
58 | ## 使用
59 | - 打开 ```./Products``` 目录,双击 **EasyResigny** 应用, 或者用 Xcode 编译 ```./EasyResigny``` 目录下的工程文件。
60 | - 将所需要的选项补充完毕。其中 __Certifacate__,__Provision Profile__ 以及 __App IPA__ 是必填项。
61 | - 双击 ```Start EasyResigny``` 开始重签名。
62 |
63 | ## 安装 IPA
64 | 推荐使用 [ideviceinstaller](https://github.com/libimobiledevice/ideviceinstaller) 工具来将重签名后的应用 IPA 安装到设备上。
65 |
66 | ## 获取帮助
67 | - 发现问题,欢迎提 issue 。
68 | - 发送邮件到 nycode.jn@gmail.com
69 |
70 | ## To Do 清单
71 | 后面需要做的任务
72 | ### 必做
73 | - 导出命令行功能。
74 | - 扫描二进制文件,若 Mach-O 未解密则报错提示。
75 | - 导入需注入的 dylib 文件,并对其进行签名。
76 |
77 | ### 可选
78 | - 签名 Mac App。
79 | - 自动安装 IPA 到设备。(研究 IPA 安装原理)
80 |
81 | ## 致谢
82 | - [maciekish / iReSign](https://github.com/maciekish/iReSign)
83 | - [DanTheMan827/ios-app-signer](https://github.com/DanTheMan827/ios-app-signer)
84 |
85 | ## 证书
86 | MIT
87 |
88 | ## 作者的话
89 | **EasyResigny** 是我第一款 Mac App 工具,是受 [maciekish / iReSign](https://github.com/maciekish/iReSign) 以及 [DanTheMan827/ios-app-signer](https://github.com/DanTheMan827/ios-app-signer) 两个产品的启发做的。目前,它还有很多 bug ,但我会尽力完善它~另外,欢迎提 issue 让它变得更好~多谢!!
--------------------------------------------------------------------------------
/Product/EasyResigny.app/Contents/_CodeSignature/CodeResources:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | files
6 |
7 | Resources/AppIcon.icns
8 |
9 | BBL24F2VWDH4T6Wrhm+mRa7Vb6k=
10 |
11 | Resources/Base.lproj/MainMenu.nib
12 |
13 | IusrMfGkK42nVlwklJUhZE4CkJ0=
14 |
15 | Resources/ERDashboardViewController.nib
16 |
17 | TF5NX/dWSy8PlRPyqxNKw6b3Mno=
18 |
19 | Resources/Info.plist
20 |
21 | xcL/nf48tvX41OaextpNvX9gkTc=
22 |
23 |
24 | files2
25 |
26 | Resources/AppIcon.icns
27 |
28 | hash2
29 |
30 | agkbydQr+WHLCcQIc1JbMQ1ApxdFqX0VzIQLeXhi8ZI=
31 |
32 |
33 | Resources/Base.lproj/MainMenu.nib
34 |
35 | hash2
36 |
37 | 2gjNxWPhA5WKB2sebWMCbsrml+NB82DGoDSzuf4b/70=
38 |
39 |
40 | Resources/ERDashboardViewController.nib
41 |
42 | hash2
43 |
44 | vMZQVC8yOX+o8+myg6x/hoJrWVsMGfMEOz9tlo5lMsI=
45 |
46 |
47 | Resources/Info.plist
48 |
49 | hash2
50 |
51 | 6fPznUM1x9oLcYgL4JS8eg3h+I4beeQlLpOz87H8XeQ=
52 |
53 |
54 |
55 | rules
56 |
57 | ^Resources/
58 |
59 | ^Resources/.*\.lproj/
60 |
61 | optional
62 |
63 | weight
64 | 1000
65 |
66 | ^Resources/.*\.lproj/locversion.plist$
67 |
68 | omit
69 |
70 | weight
71 | 1100
72 |
73 | ^Resources/Base\.lproj/
74 |
75 | weight
76 | 1010
77 |
78 | ^version.plist$
79 |
80 |
81 | rules2
82 |
83 | .*\.dSYM($|/)
84 |
85 | weight
86 | 11
87 |
88 | ^(.*/)?\.DS_Store$
89 |
90 | omit
91 |
92 | weight
93 | 2000
94 |
95 | ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/
96 |
97 | nested
98 |
99 | weight
100 | 10
101 |
102 | ^.*
103 |
104 | ^Info\.plist$
105 |
106 | omit
107 |
108 | weight
109 | 20
110 |
111 | ^PkgInfo$
112 |
113 | omit
114 |
115 | weight
116 | 20
117 |
118 | ^Resources/
119 |
120 | weight
121 | 20
122 |
123 | ^Resources/.*\.lproj/
124 |
125 | optional
126 |
127 | weight
128 | 1000
129 |
130 | ^Resources/.*\.lproj/locversion.plist$
131 |
132 | omit
133 |
134 | weight
135 | 1100
136 |
137 | ^Resources/Base\.lproj/
138 |
139 | weight
140 | 1010
141 |
142 | ^[^/]+$
143 |
144 | nested
145 |
146 | weight
147 | 10
148 |
149 | ^embedded\.provisionprofile$
150 |
151 | weight
152 | 20
153 |
154 | ^version\.plist$
155 |
156 | weight
157 | 20
158 |
159 |
160 |
161 |
162 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny.xcodeproj/xcuserdata/niyao.xcuserdatad/xcschemes/EasyResigny.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
43 |
49 |
50 |
51 |
52 |
53 |
59 |
60 |
61 |
62 |
63 |
64 |
74 |
76 |
82 |
83 |
84 |
85 |
86 |
87 |
93 |
95 |
101 |
102 |
103 |
104 |
106 |
107 |
110 |
111 |
112 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Modules/ViewControllers/ERDashboardViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // ERDashboardViewController.m
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import "ERDashboardViewController.h"
10 | #import "NYCmdTool.h"
11 | #import "NYCocoaKit.h"
12 | #import "ERDragTextField.h"
13 | #import "ERContex.h"
14 | #import "ERCodesignProcess.h"
15 |
16 | @interface ERDashboardViewController ()
17 |
18 | @property (weak) IBOutlet NSTextField *promptLabel;
19 | @property (weak) IBOutlet NSProgressIndicator *loadingView;
20 | @property (weak) IBOutlet ERDragTextField *inputIPAPathTextField;
21 | @property (weak) IBOutlet NSComboBox *certListBox;
22 | @property (weak) IBOutlet ERDragTextField *provisionProfileTextField;
23 | @property (weak) IBOutlet ERDragTextField *bundleIDTextField;
24 | @property (weak) IBOutlet ERDragTextField *appNameTextField;
25 | @property (weak) IBOutlet ERDragTextField *appVersionTextField;
26 | @property (weak) IBOutlet ERDragTextField *appBuildCodeTextField;
27 | @property (weak) IBOutlet NSButton *chooseIPAButton;
28 | @property (weak) IBOutlet NSButton *chooseProvisionButton;
29 | @property (weak) IBOutlet NSButton *startButton;
30 |
31 |
32 | @property (nonatomic, copy) NSArray *certificates;
33 |
34 | @end
35 |
36 | @implementation ERDashboardViewController
37 |
38 | - (void)viewDidLoad {
39 | [super viewDidLoad];
40 | // Do view setup here.
41 | [self setupUI];
42 | [self prepareForResign];
43 | }
44 |
45 | - (void)setupUI {
46 | self.promptLabel.editable = NO;
47 | self.promptLabel.stringValue = @"Welcome to Use EasyResigny!^0^~ --NY";
48 | [self.loadingView setHidden:YES];
49 | //self.resignButton.enabled = NO;]
50 | [self setupCertBox];
51 | }
52 |
53 | - (void)setupCertBox {
54 | self.certListBox.usesDataSource = YES;
55 | self.certListBox.dataSource = self;
56 | self.certListBox.delegate = self;
57 | }
58 |
59 | #pragma mark - Resign Process
60 | - (void)prepareForResign {
61 | [self startLoading];
62 | self.promptLabel.stringValue = @"Preparing for Resign...";
63 | [NYCmdTool checkCommandLineTools];
64 |
65 | self.promptLabel.stringValue = @"Finding Certificates on this Mac...";
66 | __weak typeof(self) weakSelf = self;
67 | [self disableButtons];
68 | [NYCmdTool launchFindCertificateIDsTaskCompletion: ^(NSError *error, id object) {
69 | if (error) {
70 | [NYCocoaKit showErrorMessage:error.localizedDescription];
71 | } else {
72 | if ([object isKindOfClass:[NSArray class]]) {
73 | weakSelf.certificates = [(NSArray *)object mutableCopy];
74 | [weakSelf.certListBox reloadData];
75 | weakSelf.promptLabel.stringValue = @"Start to Resign...";
76 | } else {
77 | weakSelf.promptLabel.stringValue = @"There is no certificates on this Mac";
78 | }
79 | }
80 | [weakSelf stopLoading];
81 | [weakSelf enableButtons];
82 | }];
83 |
84 | }
85 |
86 | - (IBAction)beginResignProcess:(id)sender {
87 | self.promptLabel.stringValue = @"Begin to Resign IPA...";
88 | NSLog(@"%@\n%@\n%@\n%@\n%@\n%@\n%@\n",
89 | self.inputIPAPathTextField.stringValue,
90 | self.certListBox.stringValue,
91 | self.provisionProfileTextField.stringValue,
92 | self.bundleIDTextField.stringValue,
93 | self.appNameTextField.stringValue,
94 | self.appVersionTextField.stringValue,
95 | self.appBuildCodeTextField.stringValue);
96 | [self startLoading];
97 | [ERContex setIPAOriginPath:self.inputIPAPathTextField.stringValue];
98 | [ERContex setSelectCertificate:self.certListBox.stringValue];
99 | [ERContex setSelectProvisionProfilePath:self.provisionProfileTextField.stringValue];
100 | [ERContex setAppName:self.appNameTextField.stringValue];
101 | [ERContex setAppVersion:self.appVersionTextField.stringValue];
102 | [ERContex setAppBuildCode:self.appBuildCodeTextField.stringValue];
103 |
104 |
105 | __weak typeof(self) weakSelf = self;
106 | [self disableButtons];
107 | [ERCodesignProcess startLoadProvisionProfileCompletion:^(NSString *prompt) {
108 | weakSelf.bundleIDTextField.stringValue = prompt;
109 | NSLog(@"%@", prompt);
110 | } unzipIPACompletion:^(NSString *prompt) {
111 | weakSelf.promptLabel.stringValue = prompt;
112 | NSLog(@"%@", prompt);
113 | } getExecutableFileCompletion:^(NSString *prompt) {
114 | weakSelf.promptLabel.stringValue = prompt;
115 | NSLog(@"%@", prompt);
116 | } changeExeModeCompletion:^(NSString *prompt) {
117 | weakSelf.promptLabel.stringValue = prompt;
118 | NSLog(@"%@", prompt);
119 | } writeInfoPlistCompletion:^(NSString *prompt) {
120 | weakSelf.promptLabel.stringValue = prompt;
121 | NSLog(@"%@", prompt);
122 | } signCertificateCompletion:^(NSString *prompt) {
123 | weakSelf.promptLabel.stringValue = prompt;
124 | NSLog(@"%@", prompt);
125 | } saveIPACompletion:^(NSString *prompt) {
126 | NSLog(@"%@", prompt);
127 | [weakSelf stopLoading];
128 | weakSelf.inputIPAPathTextField.stringValue = @"";
129 | weakSelf.certListBox.stringValue = @"";
130 | weakSelf.provisionProfileTextField.stringValue = @"";
131 | weakSelf.bundleIDTextField.stringValue = @"";
132 | weakSelf.appNameTextField.stringValue = @"";
133 | weakSelf.appVersionTextField.stringValue = @"";
134 | weakSelf.appBuildCodeTextField.stringValue = @"";
135 | weakSelf.promptLabel.stringValue = prompt;
136 | [weakSelf enableButtons];
137 | }];
138 |
139 | }
140 |
141 | - (IBAction)browseFiles:(NSButton *)sender {
142 | NSString *title = [sender title];
143 | NSRange range = [title rangeOfString:@"IPA"];
144 | dispatch_async(dispatch_get_main_queue(), ^{
145 | if (range.location != NSNotFound) {
146 | [ERDashboardViewController browseFileAllowedFileTypes:@[@"ipa", @"IPA", @"xcarchive"]
147 | textField:self.inputIPAPathTextField];
148 | } else {
149 | [ERDashboardViewController browseFileAllowedFileTypes:@[@"mobileprovision", @"MOBILEPROVISION"]
150 | textField:self.provisionProfileTextField];
151 | }
152 | });
153 | }
154 |
155 |
156 | #pragma mark - NSComboBoxDataSource
157 | - (NSInteger)numberOfItemsInComboBox:(NSComboBox *)comboBox {
158 | return self.certificates.count;
159 | }
160 |
161 | - (id)comboBox:(NSComboBox *)comboBox objectValueForItemAtIndex:(NSInteger)index {
162 | id item = nil;
163 | if ([comboBox isKindOfClass:[NSComboBox class]]) {
164 | item = self.certificates[index];
165 | }
166 | return item;
167 | }
168 |
169 | #pragma mark - Helper
170 |
171 | + (void)browseFileAllowedFileTypes:(NSArray *)allowedFileTypes textField:(NSTextField *)textField {
172 | NSOpenPanel *openDialogue = [NSOpenPanel openPanel];
173 |
174 | [openDialogue setCanChooseFiles:TRUE];
175 | [openDialogue setCanChooseDirectories:FALSE];
176 | [openDialogue setAllowsMultipleSelection:FALSE];
177 | [openDialogue setAllowsOtherFileTypes:FALSE];
178 | [openDialogue setAllowedFileTypes:allowedFileTypes];
179 |
180 | if ([openDialogue runModal] == NSModalResponseOK) {
181 | NSString *fileName = [[[openDialogue URLs] objectAtIndex:0] path];
182 | [textField setStringValue:fileName];
183 | }
184 |
185 | }
186 |
187 | - (void)startLoading {
188 | __weak typeof(self) weakSelf = self;
189 | dispatch_async(dispatch_get_main_queue(), ^{
190 | [weakSelf.loadingView startAnimation:weakSelf];
191 | [weakSelf.loadingView setHidden:NO];
192 | });
193 | }
194 |
195 | - (void)stopLoading {
196 | __weak typeof(self) weakSelf = self;
197 | dispatch_async(dispatch_get_main_queue(), ^{
198 | [weakSelf.loadingView stopAnimation:weakSelf];
199 | [weakSelf.loadingView setHidden:YES];
200 | });
201 | }
202 |
203 | - (void)enableButtons {
204 | self.startButton.enabled = YES;
205 | self.chooseIPAButton.enabled = YES;
206 | self.chooseProvisionButton.enabled = YES;
207 | }
208 |
209 | - (void)disableButtons {
210 | self.startButton.enabled = NO;
211 | self.chooseIPAButton.enabled = NO;
212 | self.chooseProvisionButton.enabled = NO;
213 | }
214 |
215 | @end
216 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Modules/Model/ERContex.m:
--------------------------------------------------------------------------------
1 | //
2 | // ERContex.m
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 21/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import "ERContex.h"
10 | #define USER_DEFAULTS [NSUserDefaults standardUserDefaults]
11 |
12 | static ERContex *context = nil;
13 |
14 | #pragma mark + Input Data
15 | static NSString * const kIPAOriginPathKey = @"IPAOriginPath";
16 | static NSString * const kSelectCertificateKey = @"SelectCertificate";
17 | static NSString * const kSelectProvisionProfilePathKey = @"SelectProvisionProfilePath";
18 | static NSString * const kAppBundleIDKey = @"AppBundleID";
19 | static NSString * const kAppNameKey = @"AppName";
20 | static NSString * const kAppVersionKey = @"AppVersion";
21 | static NSString * const kAppBuildCodeKey = @"AppBuildCode";
22 |
23 | #pragma mark + Meta Data
24 | static NSString * const kProvisionPlistKey = @"ProvisionPlist";
25 | static NSString * const kEntitlementsKey = @"Entitlements";
26 | static NSString * const kInfoPlistBundleIDKey = @"CFBundleIdentifier";
27 | static NSString * const kFrameworksDirName = @"Frameworks";
28 | static NSString * const kProductsDirName = @"Products";
29 |
30 | static NSString * const kWorkSpacePathKey = @"WorkSpace";
31 | static NSString * const kWorkSpacePayloadPathKey = @"WorkSpacePayloadPath";
32 | static NSString * const kWorkSpaceAppPathKey = @"WorkSpaceAppPath";
33 | static NSString * const kWorkSpaceAppInfoPlistPathKey = @"WorkSpaceAppInfoPlistPath";
34 | static NSString * const kWorkSpaceExecutableKey = @"CFBundleExecutableName";
35 |
36 | static NSString * const kResignedAppSavePathKey = @"ResignedAppSavePath";
37 |
38 | @implementation ERContex
39 |
40 | + (instancetype)sharedContex {
41 | static dispatch_once_t onceToken;
42 | dispatch_once(&onceToken, ^{
43 | context = [[ERContex alloc] init];
44 | });
45 | return context;
46 | }
47 |
48 | #pragma mark - Getter & Setter
49 | + (void)setIPAOriginPath:(NSString *)originPath {
50 | [ERContex setContextObject:originPath key:kIPAOriginPathKey];
51 | }
52 |
53 | + (NSString *)getIPAOriginPath {
54 | return [ERContex getContextObjectForKey:kIPAOriginPathKey];
55 | }
56 |
57 | + (void)clearIPAOriginPath {
58 | [ERContex removeContextObjectForKey:kIPAOriginPathKey];
59 | }
60 |
61 | + (void)setSelectCertificate:(NSString *)certificate {
62 | [ERContex setContextObject:certificate key:kSelectCertificateKey];
63 | }
64 |
65 | + (NSString *)getSelectCertificate {
66 | return [ERContex getContextObjectForKey:kSelectCertificateKey];
67 | }
68 |
69 | + (void)setSelectProvisionProfilePath:(NSString *)selectProvisionProfilePath {
70 | [ERContex setContextObject:selectProvisionProfilePath key:kSelectProvisionProfilePathKey];
71 | }
72 |
73 | + (NSString *)getSelectProvisionProfilePath {
74 | return [ERContex getContextObjectForKey:kSelectProvisionProfilePathKey];
75 | }
76 |
77 | + (void)setResignedAppBundleID:(NSString *)appBundleID {
78 | [ERContex setContextObject:appBundleID key:kAppBundleIDKey];
79 | }
80 |
81 | + (NSString *)getResignedAppBundleID {
82 | return [ERContex getContextObjectForKey:kAppBundleIDKey];
83 | }
84 |
85 | + (void)setAppName:(NSString *)appName {
86 | [ERContex setContextObject:appName key:kAppNameKey];
87 | }
88 |
89 | + (NSString *)getAppName {
90 | return [ERContex getContextObjectForKey:kAppNameKey];
91 | }
92 |
93 | + (void)setAppVersion:(NSString *)appVersion {
94 | [ERContex setContextObject:appVersion key:kAppVersionKey];
95 | }
96 |
97 | + (NSString *)getAppVersion {
98 | return [ERContex getContextObjectForKey:kAppVersionKey];
99 | }
100 |
101 | + (void)setAppBuildCode:(NSString *)appBuildCode {
102 | [ERContex setContextObject:appBuildCode key:kAppBuildCodeKey];
103 | }
104 |
105 | + (NSString *)getAppBuildCode {
106 | return [ERContex getContextObjectForKey:kAppBuildCodeKey];
107 | }
108 |
109 | + (void)setProvisionPlist:(NSDictionary *)dic {
110 | [ERContex setContextObject:dic key:kProvisionPlistKey];
111 | [ERContex setEntitlements:[dic objectForKey:kEntitlementsKey]];
112 | }
113 |
114 | + (void)setEntitlements:(NSDictionary *)entitlements {
115 | [ERContex setContextObject:entitlements key:kEntitlementsKey];
116 | NSString *team = [[entitlements objectForKey:@"com.apple.developer.team-identifier"] stringByAppendingString:@"."];
117 | NSString *bundleID = [entitlements objectForKey:@"application-identifier"];
118 | NSRange range = [bundleID rangeOfString:team];
119 | bundleID = [bundleID substringFromIndex:range.length];
120 | [ERContex setResignedAppBundleID:bundleID];
121 | }
122 |
123 | + (NSDictionary *)getEntitlements {
124 | return [ERContex getContextObjectForKey:kEntitlementsKey];
125 | }
126 |
127 | + (NSString *)getEntitlementsPath {
128 | return [[ERContex getWorkSpacePath] stringByAppendingPathComponent:@"entitlements.plist"];
129 | }
130 |
131 | + (void)setWorkSpacePath:(NSString *)tempWorkingPath {
132 | [ERContex setContextObject:tempWorkingPath key:kWorkSpacePathKey];
133 | }
134 |
135 | + (NSString *)getWorkSpacePath {
136 | return [ERContex getContextObjectForKey:kWorkSpacePathKey];
137 | }
138 |
139 | + (void)setPayloadPath {
140 | NSString *path = [[ERContex getWorkSpacePath] stringByAppendingPathComponent:@"Payload"];
141 | [ERContex setContextObject:path key:kWorkSpacePayloadPathKey];
142 | NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[ERContex getPayloadPath] error:nil];
143 |
144 | for (NSString *file in dirContents) {
145 | if ([[[file pathExtension] lowercaseString] isEqualToString:@"app"]) {
146 | NSString *appPath = [[ERContex getPayloadPath] stringByAppendingPathComponent:file];
147 | [ERContex setAppPath:appPath];
148 | [ERContex setInfoPlistPath:[appPath stringByAppendingPathComponent:@"Info.plist"]];
149 | }
150 | }
151 | }
152 |
153 | + (NSString *)getPayloadPath {
154 | return [ERContex getContextObjectForKey:kWorkSpacePayloadPathKey];
155 | }
156 |
157 | + (void)setAppPath:(NSString *)path {
158 | [ERContex setContextObject:path key:kWorkSpaceAppPathKey];
159 | }
160 |
161 | + (NSString *)getAppPath {
162 | return [ERContex getContextObjectForKey:kWorkSpaceAppPathKey];
163 | }
164 |
165 | + (void)setInfoPlistPath:(NSString *)path {
166 | [ERContex setContextObject:path key:kWorkSpaceAppInfoPlistPathKey];
167 | }
168 |
169 | + (NSString *)getInfoPlistPath {
170 | return [ERContex getContextObjectForKey:kWorkSpaceAppInfoPlistPathKey];
171 | }
172 |
173 | + (NSString *)getWatchPath {
174 | return [[ERContex getAppPath] stringByAppendingPathComponent:@"Watch"];
175 | }
176 |
177 | + (void)setCFBundleExecutableName:(NSString *)executableName {
178 | [ERContex setContextObject:executableName key:kWorkSpaceExecutableKey];
179 | }
180 |
181 | + (NSString *)getCFBundleExecutableName {
182 | return [ERContex getContextObjectForKey:kWorkSpaceExecutableKey];
183 | }
184 |
185 | + (NSString *)getExecutableFilePath {
186 | return [[ERContex getAppPath] stringByAppendingPathComponent:[ERContex getContextObjectForKey:kWorkSpaceExecutableKey]];
187 | }
188 |
189 | + (void)setResignedAppSavePath:(NSString *)savePath {
190 | [ERContex setContextObject:savePath key:kResignedAppSavePathKey];
191 | }
192 |
193 | + (NSString *)getResignedAppSavePath {
194 | return [ERContex getContextObjectForKey:kResignedAppSavePathKey];
195 | }
196 |
197 | + (void)clearAll {
198 | [ERContex removeContextObjectForKey:kIPAOriginPathKey];
199 | [ERContex removeContextObjectForKey:kSelectCertificateKey];
200 | [ERContex removeContextObjectForKey:kSelectProvisionProfilePathKey];
201 | [ERContex removeContextObjectForKey:kAppBundleIDKey];
202 | [ERContex removeContextObjectForKey:kAppNameKey];
203 | [ERContex removeContextObjectForKey:kAppVersionKey];
204 | [ERContex removeContextObjectForKey:kAppBuildCodeKey];
205 | [ERContex removeContextObjectForKey:kProvisionPlistKey];
206 | [ERContex removeContextObjectForKey:kEntitlementsKey];
207 | [ERContex removeContextObjectForKey:kInfoPlistBundleIDKey];
208 | [ERContex removeContextObjectForKey:kFrameworksDirName];
209 | [ERContex removeContextObjectForKey:kProductsDirName];
210 |
211 | [ERContex removeContextObjectForKey:kWorkSpacePathKey];
212 | [ERContex removeContextObjectForKey:kWorkSpacePayloadPathKey];
213 | [ERContex removeContextObjectForKey:kWorkSpaceAppPathKey];
214 | [ERContex removeContextObjectForKey:kWorkSpaceAppInfoPlistPathKey];
215 | [ERContex removeContextObjectForKey:kWorkSpaceExecutableKey];
216 | }
217 |
218 | #pragma mark + Helper
219 | + (void)setContextObject:(id)value key:(NSString *)key {
220 | [USER_DEFAULTS removeObjectForKey:key];
221 | [USER_DEFAULTS setObject:value forKey:key];
222 | [USER_DEFAULTS synchronize];
223 | }
224 |
225 | + (void)removeContextObjectForKey:(NSString *)key {
226 | [USER_DEFAULTS removeObjectForKey:key];
227 | }
228 |
229 | + (id)getContextObjectForKey:(NSString *)key {
230 | return [USER_DEFAULTS objectForKey:key];
231 | }
232 |
233 | @end
234 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Library/NYCmdTool.m:
--------------------------------------------------------------------------------
1 | //
2 | // NYCmd.m
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 20/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 |
8 | #import "NYCmdTool.h"
9 | #import "NYCocoaKit.h"
10 | #import
11 |
12 | static NSString * const kCMDZip = @"/usr/bin/zip";
13 | static NSString * const kCMDUnzip = @"/usr/bin/unzip";
14 | static NSString * const kCMDCodesign = @"/usr/bin/codesign";
15 | static NSString * const kCMDSecurity = @"/usr/bin/security";
16 | static NSString * const kCMDDefaults = @"/usr/bin/defaults";
17 | static NSString * const kCMDChmod = @"/bin/chmod";
18 | static NSString * const kCMDPlistBuddy = @"/usr/libexec/PlistBuddy";
19 | static NSString * const kCMDFind = @"/usr/bin/find";
20 | static NSString * const kCMDRM = @"/bin/rm";
21 |
22 | static const char * kCmdTaskQueueLabel = "that.boring.bear.ny.cmdtask.queue";
23 | static NSInteger const kErrorCode = 19999;
24 |
25 | static NYCmdTool *cmdTool = nil;
26 |
27 | @implementation NYCmdTool
28 |
29 |
30 | + (void)printCommand:(NSString *)taskPath arguments:(NSArray *)arguments {
31 |
32 | NSMutableString *cmdString = [NSMutableString stringWithString:taskPath];
33 | for (NSString *arg in arguments) {
34 | [cmdString appendString:[NSString stringWithFormat:@" %@", arg]];
35 | }
36 |
37 | NSLog(@"Command Line:\n%@\n", cmdString);
38 | }
39 |
40 | + (instancetype)commonTool {
41 | static dispatch_once_t onceToken;
42 | dispatch_once(&onceToken, ^{
43 | cmdTool = [[super alloc] init];
44 | });
45 | return cmdTool;
46 | }
47 |
48 | + (void)checkCommandLineTools {
49 | [self checkCommandLineToolsCompletion:nil];
50 | }
51 |
52 | + (void)checkCommandLineToolsCompletion:(NYCmdToolCompletion)completion {
53 | if (![NYCmdTool fileExistsAtPath:kCMDZip]) {
54 | [NYCocoaKit showErrorMessage:@"Cannot run zip"];
55 | exit(0);
56 | }
57 | if (![NYCmdTool fileExistsAtPath:kCMDUnzip]) {
58 | [NYCocoaKit showErrorMessage:@"Cannot run unzip"];
59 | exit(0);
60 | }
61 | if (![NYCmdTool fileExistsAtPath:kCMDCodesign]) {
62 | [NYCocoaKit showErrorMessage:@"Cannot run codesign"];
63 | exit(0);
64 | }
65 | if (![NYCmdTool fileExistsAtPath:kCMDCodesign]) {
66 | [NYCocoaKit showErrorMessage:@"Cannot run security"];
67 | exit(0);
68 | }
69 |
70 | if (completion) {
71 | completion(nil, nil);
72 | }
73 | }
74 |
75 | + (BOOL)fileExistsAtPath:(NSString *)filePath {
76 | return [[NSFileManager defaultManager] fileExistsAtPath:filePath];
77 | }
78 |
79 | #pragma mark - Task
80 | + (dispatch_queue_t)cmdTaskQueue {
81 | static dispatch_queue_t queue;
82 | static dispatch_once_t onceToken;
83 | dispatch_once(&onceToken, ^{
84 | queue = dispatch_queue_create(kCmdTaskQueueLabel, DISPATCH_QUEUE_CONCURRENT);
85 | });
86 | return queue;
87 | }
88 |
89 | #pragma mark - Find Certificate Task
90 | + (void)launchFindCertificateIDsTaskCompletion:(NYCmdToolCompletion)completion {
91 | NYCmdToolCompletion outputHandler = ^(NSError *error, NSString *outputStr) {
92 | NSArray *outputArray = [outputStr componentsSeparatedByString:@"\n"];
93 | NSMutableArray *certificates = [NSMutableArray array];
94 | for (NSString *string in outputArray) {
95 | NSRange range = [string rangeOfString:@"\""];
96 | if (range.location != NSNotFound) {
97 | NSString *certString = [[string substringFromIndex:range.location] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
98 | [certificates addObject:certString];
99 | }
100 | }
101 | if (completion) {
102 | completion(error, certificates);
103 | }
104 | };
105 | [self launchTaskPath:kCMDSecurity arguments:@[@"find-identity", @"-v", @"-p", @"codesigning"] currentPath:nil outputHandler:outputHandler];
106 | }
107 |
108 | #pragma mark - Load Provision Profile Task
109 | + (void)launchLoadProvisionProfilePath:(NSString *)provisionProfilePath completion:(NYCmdToolCompletion)completion {
110 | NYCmdToolCompletion outputHandler = ^(NSError *error, NSString *outputStr) {
111 | NSString *xmlStartStr = @" 0) {
198 | [task setCurrentDirectoryPath:current];
199 | }
200 |
201 | __block NSFileHandle *handle = [pipe fileHandleForReading];
202 |
203 | dispatch_block_t taskDefaultBlock = ^{
204 | NSString *outputStr = [[NSString alloc] initWithData:[handle readDataToEndOfFile] encoding:NSASCIIStringEncoding];
205 | if (outputHandler) {
206 | outputHandler(nil, outputStr);
207 | }
208 | };
209 |
210 | dispatch_async([self cmdTaskQueue], taskDefaultBlock);
211 | [task launch];
212 | [self printCommand:taskPath arguments:arguments];
213 | }
214 |
215 | + (NSTask *)taskWithLaunchPath:(NSString *)launchPath arguments:(NSArray *)arguments {
216 | NSTask *task = [[NSTask alloc] init];
217 | [task setLaunchPath:launchPath];
218 | [task setArguments:arguments];
219 | return task;
220 | }
221 |
222 | + (NSPipe *)pipeWithTask:(NSTask *)task {
223 | NSPipe *pipe = [[NSPipe alloc] init];
224 | [task setStandardOutput:pipe];
225 | [task setStandardError:pipe];
226 | return pipe;
227 | }
228 |
229 | + (NSError *)errorInfo:(NSString *)userInfo {
230 | return [NSError errorWithDomain:@"NYCmdTool"
231 | code:kErrorCode
232 | userInfo:@{NSLocalizedDescriptionKey: userInfo}];
233 | }
234 |
235 | @end
236 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Modules/Model/ERCodesignProcess.m:
--------------------------------------------------------------------------------
1 | //
2 | // ERResignProcess.m
3 | // EasyResigny
4 | //
5 | // Created by NiYao on 21/03/2017.
6 | // Copyright © 2017 suneny. All rights reserved.
7 | //
8 |
9 | #import "ERCodesignProcess.h"
10 | #import "NYCmdTool.h"
11 | #import "ERContex.h"
12 |
13 | @implementation ERCodesignProcess
14 |
15 | + (void)startLoadProvisionProfileCompletion:(ERCodesignCompletion)loadProvisionProfileCompletion
16 | unzipIPACompletion:(ERCodesignCompletion)unzipIPACompletion
17 | getExecutableFileCompletion:(ERCodesignCompletion)getExecutableFileCompletion
18 | changeExeModeCompletion:(ERCodesignCompletion)changeExeModeCompletion
19 | writeInfoPlistCompletion:(ERCodesignCompletion)writeInfoPlistCompletion
20 | signCertificateCompletion:(ERCodesignCompletion)signCertificateCompletion
21 | saveIPACompletion:(ERCodesignCompletion)saveIPACompletion {
22 |
23 | dispatch_async([NYCmdTool cmdTaskQueue], ^{
24 | [self loadProvisionProfileCompletion:loadProvisionProfileCompletion];
25 |
26 | [self unzipIPACompletion:unzipIPACompletion];
27 |
28 | [self getExecutableFileCompletion:getExecutableFileCompletion];
29 |
30 | [self changeExeModeCompletion:changeExeModeCompletion];
31 |
32 | [self writeInfoPlistCompletion:writeInfoPlistCompletion];
33 |
34 | [self signCertificateCompletion:signCertificateCompletion];
35 |
36 | [self saveIPACompletion:saveIPACompletion];
37 | });
38 | }
39 |
40 | + (void)loadProvisionProfileCompletion:(ERCodesignCompletion)completion {
41 | dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
42 | [NYCmdTool launchLoadProvisionProfilePath:[ERContex getSelectProvisionProfilePath] completion:^(NSError *error, NSDictionary *plistDic) {
43 | [ERContex setProvisionPlist:plistDic];
44 | [NYCmdTool saveEntitlements:[ERContex getEntitlements]
45 | savedDir:[ERContex getWorkSpacePath]];
46 | dispatch_semaphore_signal(semaphore);
47 | }];
48 | dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
49 | if (completion) {
50 | completion([ERContex getResignedAppBundleID]);
51 | }
52 | }
53 |
54 | + (void)unzipIPACompletion:(ERCodesignCompletion)unzipIPACompletion {
55 | dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
56 | [NYCmdTool launchUnzipAppTaskWithSource:[ERContex getIPAOriginPath] destination:[ERContex getWorkSpacePath] completion:^(NSError *error, id object) {
57 | [ERContex setPayloadPath];
58 | [ERCodesignProcess rmPath];
59 | dispatch_semaphore_signal(semaphore);
60 |
61 | }];
62 | dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
63 | if (unzipIPACompletion) {
64 | unzipIPACompletion(@"Start to Unzip IPA...");
65 | }
66 | }
67 |
68 | + (void)getExecutableFileCompletion:(ERCodesignCompletion)getExecutableFileCompletion {
69 | dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
70 | [NYCmdTool launchReadTaskPath:[ERContex getInfoPlistPath] key:@"CFBundleExecutable" completion:^(NSError *error, NSString *exeName) {
71 | exeName = [exeName stringByReplacingOccurrencesOfString:@"\n" withString:@""];
72 | [ERContex setCFBundleExecutableName:exeName];
73 | dispatch_semaphore_signal(semaphore);
74 | }];
75 | dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
76 | if (getExecutableFileCompletion) {
77 | getExecutableFileCompletion(@"Start to Find App Executable File...");
78 | }
79 | }
80 |
81 | + (void)changeExeModeCompletion:(ERCodesignCompletion)changeExeModeCompletion {
82 | dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
83 | [NYCmdTool launchChmodExecutable:[ERContex getExecutableFilePath] completion:^(NSError *error, id object) {
84 | NSLog(@"%@", object);
85 | dispatch_semaphore_signal(semaphore);
86 | }];
87 | dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
88 | if (changeExeModeCompletion) {
89 | changeExeModeCompletion(@"Start to Change Executable File Mode...");
90 | }
91 | }
92 |
93 | + (void)writeBundleID {
94 | dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
95 |
96 | [NYCmdTool launchWriteTaskPlistPath:[ERContex getInfoPlistPath] key:@"CFBundleIdentifier" value:[ERContex getResignedAppBundleID] completion:^(NSError *error, id object) {
97 | dispatch_semaphore_signal(semaphore);
98 | }];
99 | dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
100 | }
101 |
102 | + (void)writeInfoPlistCompletion:(ERCodesignCompletion)writeInfoPlistCompletion {
103 | [self writeBundleID];
104 | NSString *appName = [ERContex getAppName];
105 | NSString *appVersion = [ERContex getAppVersion];
106 | NSString *appBuildCode = [ERContex getAppBuildCode];
107 |
108 | if (appName.length > 0) {
109 | dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
110 | [NYCmdTool launchWriteTaskPlistPath:[ERContex getInfoPlistPath] key:@"CFBundleDisplayName" value:appName completion:^(NSError *error, id object) {
111 | dispatch_semaphore_signal(semaphore);
112 | }];
113 | dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
114 | }
115 |
116 | if (appVersion.length > 0) {
117 | dispatch_semaphore_t versionSemaphore = dispatch_semaphore_create(0);
118 | [NYCmdTool launchWriteTaskPlistPath:[ERContex getInfoPlistPath] key:@"CFBundleVersion" value:appVersion completion:^(NSError *error, id object) {
119 | dispatch_semaphore_signal(versionSemaphore);
120 | }];
121 | dispatch_semaphore_wait(versionSemaphore, DISPATCH_TIME_FOREVER);
122 | }
123 |
124 | if (appBuildCode.length > 0) {
125 | dispatch_semaphore_t shortVersionsemaphore = dispatch_semaphore_create(0);
126 | [NYCmdTool launchWriteTaskPlistPath:[ERContex getInfoPlistPath] key:@"CFBundleShortVersionString" value:appBuildCode completion:^(NSError *error, id object) {
127 | dispatch_semaphore_signal(shortVersionsemaphore);
128 | }];
129 | dispatch_semaphore_wait(shortVersionsemaphore, DISPATCH_TIME_FOREVER);
130 | }
131 |
132 | if (writeInfoPlistCompletion) {
133 | writeInfoPlistCompletion(@"Start to Modify Info.plist...");
134 | }
135 | }
136 |
137 | + (void)signCertificateCompletion:(ERCodesignCompletion)signCertificateCompletion {
138 | dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
139 | [NYCmdTool launchCodesignCertificate:[ERContex getSelectCertificate]
140 | entitlementsPlisPath:[ERContex getEntitlementsPath]
141 | appPath:[ERContex getAppPath] completion:^(NSError *error, id object) {
142 | dispatch_semaphore_signal(semaphore);
143 | if (signCertificateCompletion) {
144 | signCertificateCompletion(@"Start to Codesign App...");
145 | }
146 | }];
147 | dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
148 |
149 | }
150 |
151 | + (void)saveIPACompletion:(ERCodesignCompletion)completion {
152 | dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
153 |
154 | NSString *ipa = [[ERContex getIPAOriginPath] lastPathComponent];
155 | NSString *ipaReName = [ipa stringByReplacingOccurrencesOfString:@".ipa" withString:@"-"];
156 | ipaReName = [ipaReName stringByAppendingString:[ERContex getResignedAppBundleID]];
157 | ipaReName = [ipaReName stringByAppendingString:@"-resigny"];
158 | ipaReName = [ipaReName stringByAppendingPathExtension:@"ipa"];
159 |
160 | NSRange range = [[ERContex getIPAOriginPath] rangeOfString:ipa];
161 | NSString *des = [[ERContex getIPAOriginPath] substringToIndex:range.location];
162 | des = [des stringByAppendingPathComponent:ipaReName];
163 | [ERContex setResignedAppSavePath:des];
164 |
165 | [NYCmdTool launchZipCurrentPath:[ERContex getWorkSpacePath] destinationPath:des appPath:[ERContex getAppPath] completion:^(NSError *error, id object) {
166 | [ERCodesignProcess easyResignyDidFinishCodesigning];
167 | dispatch_semaphore_signal(semaphore);
168 | }];
169 | dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
170 | if (completion) {
171 | NSString *str = [NSString stringWithFormat:@"Save IPA :%@", [ERContex getResignedAppSavePath]];
172 | completion(str);
173 | }
174 | }
175 |
176 | + (void)rmPath {
177 | dispatch_semaphore_t watchSemaphore = dispatch_semaphore_create(0);
178 | NSString *watch = [[ERContex getAppPath] stringByAppendingPathComponent:@"Watch"];
179 | [NYCmdTool launchRemovePath:watch completion:^(NSError *error, id object) {
180 | dispatch_semaphore_signal(watchSemaphore);
181 | }];
182 |
183 | dispatch_semaphore_t pluginsSemaphore = dispatch_semaphore_create(0);
184 | NSString *plugins = [[ERContex getAppPath] stringByAppendingPathComponent:@"PlugIns"];
185 | [NYCmdTool launchRemovePath:plugins completion:^(NSError *error, id object) {
186 | dispatch_semaphore_signal(pluginsSemaphore);
187 | }];
188 |
189 | dispatch_semaphore_wait(pluginsSemaphore, DISPATCH_TIME_FOREVER);
190 | dispatch_semaphore_wait(watchSemaphore, DISPATCH_TIME_FOREVER);
191 | }
192 |
193 | + (void)syncMethod:(SEL)selector target:(id)target parameters:(NSArray *)parameters {
194 | dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
195 |
196 | // __block NSMutableDictionary *responseDic = [NSMutableDictionary dictionary];
197 | // NYCmdToolCompletion completion = ^(id _Nonnull result, NSError * _Nullable error) {
198 |
199 | // dispatch_semaphore_signal(semaphore);
200 | // };
201 | NSMethodSignature *signature = [[target class] instanceMethodSignatureForSelector:selector];
202 | NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
203 | [invocation setTarget:target];
204 | [invocation setSelector:selector];
205 |
206 | NSInteger index = 2;
207 | for (int i = 0; i < parameters.count; i++, index++) {
208 | id p = [parameters objectAtIndex:i];
209 | [invocation setArgument:&p atIndex:index];
210 | }
211 |
212 | //[invocation setArgument:&completion atIndex:index];
213 | [invocation invokeWithTarget:target];
214 | dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
215 | }
216 |
217 | #pragma mark - Life Cycle
218 | + (void)easyResignyDidLaunched {
219 | NSString *workSpace = [NSTemporaryDirectory() stringByAppendingString:[[NSBundle mainBundle]bundleIdentifier]];
220 | [[NSFileManager defaultManager] removeItemAtPath:workSpace error:nil];
221 | [[NSFileManager defaultManager] createDirectoryAtPath:workSpace withIntermediateDirectories:TRUE attributes:nil error:nil];
222 | [ERContex setWorkSpacePath:workSpace];
223 | NSLog(@"workSpace: %@\n", workSpace);
224 | }
225 |
226 | + (void)easyResignyDidFinishCodesigning {
227 | [ERContex clearAll];
228 | [self easyResignyDidLaunched];
229 | }
230 |
231 |
232 | @end
233 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Classes/Modules/ViewControllers/ERDashboardViewController.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | Item 1
55 | Item 2
56 | Item 3
57 |
58 |
59 |
60 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 8CD3C1C41E80EA8000A54AB9 /* NYCmdTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD3C1B21E80EA8000A54AB9 /* NYCmdTool.m */; };
11 | 8CD3C1C51E80EA8000A54AB9 /* NYCocoaKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD3C1B41E80EA8000A54AB9 /* NYCocoaKit.m */; };
12 | 8CD3C1C61E80EA8000A54AB9 /* AppDelegate+ERSetup.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD3C1B71E80EA8000A54AB9 /* AppDelegate+ERSetup.m */; };
13 | 8CD3C1C71E80EA8000A54AB9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD3C1B91E80EA8000A54AB9 /* AppDelegate.m */; };
14 | 8CD3C1C81E80EA8000A54AB9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD3C1BA1E80EA8000A54AB9 /* main.m */; };
15 | 8CD3C1C91E80EA8000A54AB9 /* ERDashboardViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD3C1BF1E80EA8000A54AB9 /* ERDashboardViewController.m */; };
16 | 8CD3C1CA1E80EA8000A54AB9 /* ERDashboardViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CD3C1C01E80EA8000A54AB9 /* ERDashboardViewController.xib */; };
17 | 8CD3C1CB1E80EA8000A54AB9 /* ERDragTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD3C1C31E80EA8000A54AB9 /* ERDragTextField.m */; };
18 | 8CD3C1CE1E80EAB200A54AB9 /* ERContex.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD3C1CD1E80EAB200A54AB9 /* ERContex.m */; };
19 | 8CD3C1D11E81333700A54AB9 /* ERCodesignProcess.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD3C1D01E81333700A54AB9 /* ERCodesignProcess.m */; };
20 | 8CF190B31E7F94BC00DB3049 /* EasyResignyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CF190B21E7F94BC00DB3049 /* EasyResignyTests.m */; };
21 | 8CF190BE1E7F94BC00DB3049 /* EasyResignyUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CF190BD1E7F94BC00DB3049 /* EasyResignyUITests.m */; };
22 | 8CF190CD1E7F950900DB3049 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8CF190CC1E7F950900DB3049 /* Cocoa.framework */; };
23 | 8CF190CF1E7F951100DB3049 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8CF190CE1E7F951100DB3049 /* AppKit.framework */; };
24 | 8CF190D11E7F952B00DB3049 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8CF190D01E7F952B00DB3049 /* Foundation.framework */; };
25 | 8CF190F61E7FACCF00DB3049 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8CF190EE1E7FACCF00DB3049 /* Assets.xcassets */; };
26 | 8CF190F71E7FACCF00DB3049 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CF190EF1E7FACCF00DB3049 /* MainMenu.xib */; };
27 | 8CF190F81E7FACCF00DB3049 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8CF190F11E7FACCF00DB3049 /* Info.plist */; };
28 | /* End PBXBuildFile section */
29 |
30 | /* Begin PBXContainerItemProxy section */
31 | 8CF190AF1E7F94BC00DB3049 /* PBXContainerItemProxy */ = {
32 | isa = PBXContainerItemProxy;
33 | containerPortal = 8CF190931E7F94BC00DB3049 /* Project object */;
34 | proxyType = 1;
35 | remoteGlobalIDString = 8CF1909A1E7F94BC00DB3049;
36 | remoteInfo = EasyResigny;
37 | };
38 | 8CF190BA1E7F94BC00DB3049 /* PBXContainerItemProxy */ = {
39 | isa = PBXContainerItemProxy;
40 | containerPortal = 8CF190931E7F94BC00DB3049 /* Project object */;
41 | proxyType = 1;
42 | remoteGlobalIDString = 8CF1909A1E7F94BC00DB3049;
43 | remoteInfo = EasyResigny;
44 | };
45 | /* End PBXContainerItemProxy section */
46 |
47 | /* Begin PBXFileReference section */
48 | 8CD3C1B11E80EA8000A54AB9 /* NYCmdTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYCmdTool.h; sourceTree = ""; };
49 | 8CD3C1B21E80EA8000A54AB9 /* NYCmdTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYCmdTool.m; sourceTree = ""; };
50 | 8CD3C1B31E80EA8000A54AB9 /* NYCocoaKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYCocoaKit.h; sourceTree = ""; };
51 | 8CD3C1B41E80EA8000A54AB9 /* NYCocoaKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYCocoaKit.m; sourceTree = ""; };
52 | 8CD3C1B61E80EA8000A54AB9 /* AppDelegate+ERSetup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AppDelegate+ERSetup.h"; sourceTree = ""; };
53 | 8CD3C1B71E80EA8000A54AB9 /* AppDelegate+ERSetup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppDelegate+ERSetup.m"; sourceTree = ""; };
54 | 8CD3C1B81E80EA8000A54AB9 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
55 | 8CD3C1B91E80EA8000A54AB9 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
56 | 8CD3C1BA1E80EA8000A54AB9 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
57 | 8CD3C1BE1E80EA8000A54AB9 /* ERDashboardViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ERDashboardViewController.h; sourceTree = ""; };
58 | 8CD3C1BF1E80EA8000A54AB9 /* ERDashboardViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ERDashboardViewController.m; sourceTree = ""; };
59 | 8CD3C1C01E80EA8000A54AB9 /* ERDashboardViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ERDashboardViewController.xib; sourceTree = ""; };
60 | 8CD3C1C21E80EA8000A54AB9 /* ERDragTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ERDragTextField.h; sourceTree = ""; };
61 | 8CD3C1C31E80EA8000A54AB9 /* ERDragTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ERDragTextField.m; sourceTree = ""; };
62 | 8CD3C1CC1E80EAB200A54AB9 /* ERContex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ERContex.h; sourceTree = ""; };
63 | 8CD3C1CD1E80EAB200A54AB9 /* ERContex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ERContex.m; sourceTree = ""; };
64 | 8CD3C1CF1E81333700A54AB9 /* ERCodesignProcess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ERCodesignProcess.h; sourceTree = ""; };
65 | 8CD3C1D01E81333700A54AB9 /* ERCodesignProcess.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ERCodesignProcess.m; sourceTree = ""; };
66 | 8CF1909B1E7F94BC00DB3049 /* EasyResigny.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = EasyResigny.app; sourceTree = BUILT_PRODUCTS_DIR; };
67 | 8CF190AE1E7F94BC00DB3049 /* EasyResignyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EasyResignyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
68 | 8CF190B21E7F94BC00DB3049 /* EasyResignyTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EasyResignyTests.m; sourceTree = ""; };
69 | 8CF190B41E7F94BC00DB3049 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
70 | 8CF190B91E7F94BC00DB3049 /* EasyResignyUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EasyResignyUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
71 | 8CF190BD1E7F94BC00DB3049 /* EasyResignyUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EasyResignyUITests.m; sourceTree = ""; };
72 | 8CF190BF1E7F94BC00DB3049 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
73 | 8CF190CC1E7F950900DB3049 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
74 | 8CF190CE1E7F951100DB3049 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
75 | 8CF190D01E7F952B00DB3049 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
76 | 8CF190EE1E7FACCF00DB3049 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
77 | 8CF190F01E7FACCF00DB3049 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
78 | 8CF190F11E7FACCF00DB3049 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
79 | /* End PBXFileReference section */
80 |
81 | /* Begin PBXFrameworksBuildPhase section */
82 | 8CF190981E7F94BC00DB3049 /* Frameworks */ = {
83 | isa = PBXFrameworksBuildPhase;
84 | buildActionMask = 2147483647;
85 | files = (
86 | 8CF190D11E7F952B00DB3049 /* Foundation.framework in Frameworks */,
87 | 8CF190CF1E7F951100DB3049 /* AppKit.framework in Frameworks */,
88 | 8CF190CD1E7F950900DB3049 /* Cocoa.framework in Frameworks */,
89 | );
90 | runOnlyForDeploymentPostprocessing = 0;
91 | };
92 | 8CF190AB1E7F94BC00DB3049 /* Frameworks */ = {
93 | isa = PBXFrameworksBuildPhase;
94 | buildActionMask = 2147483647;
95 | files = (
96 | );
97 | runOnlyForDeploymentPostprocessing = 0;
98 | };
99 | 8CF190B61E7F94BC00DB3049 /* Frameworks */ = {
100 | isa = PBXFrameworksBuildPhase;
101 | buildActionMask = 2147483647;
102 | files = (
103 | );
104 | runOnlyForDeploymentPostprocessing = 0;
105 | };
106 | /* End PBXFrameworksBuildPhase section */
107 |
108 | /* Begin PBXGroup section */
109 | 8CD3C1AF1E80EA8000A54AB9 /* Classes */ = {
110 | isa = PBXGroup;
111 | children = (
112 | 8CD3C1B01E80EA8000A54AB9 /* Library */,
113 | 8CD3C1B51E80EA8000A54AB9 /* Main */,
114 | 8CD3C1BB1E80EA8000A54AB9 /* Modules */,
115 | );
116 | path = Classes;
117 | sourceTree = "";
118 | };
119 | 8CD3C1B01E80EA8000A54AB9 /* Library */ = {
120 | isa = PBXGroup;
121 | children = (
122 | 8CD3C1B11E80EA8000A54AB9 /* NYCmdTool.h */,
123 | 8CD3C1B21E80EA8000A54AB9 /* NYCmdTool.m */,
124 | 8CD3C1B31E80EA8000A54AB9 /* NYCocoaKit.h */,
125 | 8CD3C1B41E80EA8000A54AB9 /* NYCocoaKit.m */,
126 | );
127 | path = Library;
128 | sourceTree = "";
129 | };
130 | 8CD3C1B51E80EA8000A54AB9 /* Main */ = {
131 | isa = PBXGroup;
132 | children = (
133 | 8CD3C1B61E80EA8000A54AB9 /* AppDelegate+ERSetup.h */,
134 | 8CD3C1B71E80EA8000A54AB9 /* AppDelegate+ERSetup.m */,
135 | 8CD3C1B81E80EA8000A54AB9 /* AppDelegate.h */,
136 | 8CD3C1B91E80EA8000A54AB9 /* AppDelegate.m */,
137 | 8CD3C1BA1E80EA8000A54AB9 /* main.m */,
138 | );
139 | path = Main;
140 | sourceTree = "";
141 | };
142 | 8CD3C1BB1E80EA8000A54AB9 /* Modules */ = {
143 | isa = PBXGroup;
144 | children = (
145 | 8CD3C1BC1E80EA8000A54AB9 /* Model */,
146 | 8CD3C1BD1E80EA8000A54AB9 /* ViewControllers */,
147 | 8CD3C1C11E80EA8000A54AB9 /* Views */,
148 | );
149 | path = Modules;
150 | sourceTree = "";
151 | };
152 | 8CD3C1BC1E80EA8000A54AB9 /* Model */ = {
153 | isa = PBXGroup;
154 | children = (
155 | 8CD3C1CC1E80EAB200A54AB9 /* ERContex.h */,
156 | 8CD3C1CD1E80EAB200A54AB9 /* ERContex.m */,
157 | 8CD3C1CF1E81333700A54AB9 /* ERCodesignProcess.h */,
158 | 8CD3C1D01E81333700A54AB9 /* ERCodesignProcess.m */,
159 | );
160 | path = Model;
161 | sourceTree = "";
162 | };
163 | 8CD3C1BD1E80EA8000A54AB9 /* ViewControllers */ = {
164 | isa = PBXGroup;
165 | children = (
166 | 8CD3C1BE1E80EA8000A54AB9 /* ERDashboardViewController.h */,
167 | 8CD3C1BF1E80EA8000A54AB9 /* ERDashboardViewController.m */,
168 | 8CD3C1C01E80EA8000A54AB9 /* ERDashboardViewController.xib */,
169 | );
170 | path = ViewControllers;
171 | sourceTree = "";
172 | };
173 | 8CD3C1C11E80EA8000A54AB9 /* Views */ = {
174 | isa = PBXGroup;
175 | children = (
176 | 8CD3C1C21E80EA8000A54AB9 /* ERDragTextField.h */,
177 | 8CD3C1C31E80EA8000A54AB9 /* ERDragTextField.m */,
178 | );
179 | path = Views;
180 | sourceTree = "";
181 | };
182 | 8CF190921E7F94BC00DB3049 = {
183 | isa = PBXGroup;
184 | children = (
185 | 8CF1909D1E7F94BC00DB3049 /* EasyResigny */,
186 | 8CF190B11E7F94BC00DB3049 /* EasyResignyTests */,
187 | 8CF190BC1E7F94BC00DB3049 /* EasyResignyUITests */,
188 | 8CF1909C1E7F94BC00DB3049 /* Products */,
189 | 8CF190CB1E7F950900DB3049 /* Frameworks */,
190 | );
191 | sourceTree = "";
192 | };
193 | 8CF1909C1E7F94BC00DB3049 /* Products */ = {
194 | isa = PBXGroup;
195 | children = (
196 | 8CF1909B1E7F94BC00DB3049 /* EasyResigny.app */,
197 | 8CF190AE1E7F94BC00DB3049 /* EasyResignyTests.xctest */,
198 | 8CF190B91E7F94BC00DB3049 /* EasyResignyUITests.xctest */,
199 | );
200 | name = Products;
201 | sourceTree = "";
202 | };
203 | 8CF1909D1E7F94BC00DB3049 /* EasyResigny */ = {
204 | isa = PBXGroup;
205 | children = (
206 | 8CD3C1AF1E80EA8000A54AB9 /* Classes */,
207 | 8CF190ED1E7FACCF00DB3049 /* Resources */,
208 | );
209 | path = EasyResigny;
210 | sourceTree = "";
211 | };
212 | 8CF190B11E7F94BC00DB3049 /* EasyResignyTests */ = {
213 | isa = PBXGroup;
214 | children = (
215 | 8CF190B21E7F94BC00DB3049 /* EasyResignyTests.m */,
216 | 8CF190B41E7F94BC00DB3049 /* Info.plist */,
217 | );
218 | path = EasyResignyTests;
219 | sourceTree = "";
220 | };
221 | 8CF190BC1E7F94BC00DB3049 /* EasyResignyUITests */ = {
222 | isa = PBXGroup;
223 | children = (
224 | 8CF190BD1E7F94BC00DB3049 /* EasyResignyUITests.m */,
225 | 8CF190BF1E7F94BC00DB3049 /* Info.plist */,
226 | );
227 | path = EasyResignyUITests;
228 | sourceTree = "";
229 | };
230 | 8CF190CB1E7F950900DB3049 /* Frameworks */ = {
231 | isa = PBXGroup;
232 | children = (
233 | 8CF190D01E7F952B00DB3049 /* Foundation.framework */,
234 | 8CF190CE1E7F951100DB3049 /* AppKit.framework */,
235 | 8CF190CC1E7F950900DB3049 /* Cocoa.framework */,
236 | );
237 | name = Frameworks;
238 | sourceTree = "";
239 | };
240 | 8CF190ED1E7FACCF00DB3049 /* Resources */ = {
241 | isa = PBXGroup;
242 | children = (
243 | 8CF190EE1E7FACCF00DB3049 /* Assets.xcassets */,
244 | 8CF190EF1E7FACCF00DB3049 /* MainMenu.xib */,
245 | 8CF190F11E7FACCF00DB3049 /* Info.plist */,
246 | );
247 | path = Resources;
248 | sourceTree = "";
249 | };
250 | /* End PBXGroup section */
251 |
252 | /* Begin PBXNativeTarget section */
253 | 8CF1909A1E7F94BC00DB3049 /* EasyResigny */ = {
254 | isa = PBXNativeTarget;
255 | buildConfigurationList = 8CF190C21E7F94BC00DB3049 /* Build configuration list for PBXNativeTarget "EasyResigny" */;
256 | buildPhases = (
257 | 8CF190971E7F94BC00DB3049 /* Sources */,
258 | 8CF190981E7F94BC00DB3049 /* Frameworks */,
259 | 8CF190991E7F94BC00DB3049 /* Resources */,
260 | );
261 | buildRules = (
262 | );
263 | dependencies = (
264 | );
265 | name = EasyResigny;
266 | productName = EasyResigny;
267 | productReference = 8CF1909B1E7F94BC00DB3049 /* EasyResigny.app */;
268 | productType = "com.apple.product-type.application";
269 | };
270 | 8CF190AD1E7F94BC00DB3049 /* EasyResignyTests */ = {
271 | isa = PBXNativeTarget;
272 | buildConfigurationList = 8CF190C51E7F94BC00DB3049 /* Build configuration list for PBXNativeTarget "EasyResignyTests" */;
273 | buildPhases = (
274 | 8CF190AA1E7F94BC00DB3049 /* Sources */,
275 | 8CF190AB1E7F94BC00DB3049 /* Frameworks */,
276 | 8CF190AC1E7F94BC00DB3049 /* Resources */,
277 | );
278 | buildRules = (
279 | );
280 | dependencies = (
281 | 8CF190B01E7F94BC00DB3049 /* PBXTargetDependency */,
282 | );
283 | name = EasyResignyTests;
284 | productName = EasyResignyTests;
285 | productReference = 8CF190AE1E7F94BC00DB3049 /* EasyResignyTests.xctest */;
286 | productType = "com.apple.product-type.bundle.unit-test";
287 | };
288 | 8CF190B81E7F94BC00DB3049 /* EasyResignyUITests */ = {
289 | isa = PBXNativeTarget;
290 | buildConfigurationList = 8CF190C81E7F94BC00DB3049 /* Build configuration list for PBXNativeTarget "EasyResignyUITests" */;
291 | buildPhases = (
292 | 8CF190B51E7F94BC00DB3049 /* Sources */,
293 | 8CF190B61E7F94BC00DB3049 /* Frameworks */,
294 | 8CF190B71E7F94BC00DB3049 /* Resources */,
295 | );
296 | buildRules = (
297 | );
298 | dependencies = (
299 | 8CF190BB1E7F94BC00DB3049 /* PBXTargetDependency */,
300 | );
301 | name = EasyResignyUITests;
302 | productName = EasyResignyUITests;
303 | productReference = 8CF190B91E7F94BC00DB3049 /* EasyResignyUITests.xctest */;
304 | productType = "com.apple.product-type.bundle.ui-testing";
305 | };
306 | /* End PBXNativeTarget section */
307 |
308 | /* Begin PBXProject section */
309 | 8CF190931E7F94BC00DB3049 /* Project object */ = {
310 | isa = PBXProject;
311 | attributes = {
312 | CLASSPREFIX = ER;
313 | LastUpgradeCheck = 0800;
314 | ORGANIZATIONNAME = suneny;
315 | TargetAttributes = {
316 | 8CF1909A1E7F94BC00DB3049 = {
317 | CreatedOnToolsVersion = 8.0;
318 | ProvisioningStyle = Automatic;
319 | };
320 | 8CF190AD1E7F94BC00DB3049 = {
321 | CreatedOnToolsVersion = 8.0;
322 | ProvisioningStyle = Automatic;
323 | TestTargetID = 8CF1909A1E7F94BC00DB3049;
324 | };
325 | 8CF190B81E7F94BC00DB3049 = {
326 | CreatedOnToolsVersion = 8.0;
327 | ProvisioningStyle = Automatic;
328 | TestTargetID = 8CF1909A1E7F94BC00DB3049;
329 | };
330 | };
331 | };
332 | buildConfigurationList = 8CF190961E7F94BC00DB3049 /* Build configuration list for PBXProject "EasyResigny" */;
333 | compatibilityVersion = "Xcode 3.2";
334 | developmentRegion = English;
335 | hasScannedForEncodings = 0;
336 | knownRegions = (
337 | en,
338 | Base,
339 | );
340 | mainGroup = 8CF190921E7F94BC00DB3049;
341 | productRefGroup = 8CF1909C1E7F94BC00DB3049 /* Products */;
342 | projectDirPath = "";
343 | projectRoot = "";
344 | targets = (
345 | 8CF1909A1E7F94BC00DB3049 /* EasyResigny */,
346 | 8CF190AD1E7F94BC00DB3049 /* EasyResignyTests */,
347 | 8CF190B81E7F94BC00DB3049 /* EasyResignyUITests */,
348 | );
349 | };
350 | /* End PBXProject section */
351 |
352 | /* Begin PBXResourcesBuildPhase section */
353 | 8CF190991E7F94BC00DB3049 /* Resources */ = {
354 | isa = PBXResourcesBuildPhase;
355 | buildActionMask = 2147483647;
356 | files = (
357 | 8CD3C1CA1E80EA8000A54AB9 /* ERDashboardViewController.xib in Resources */,
358 | 8CF190F61E7FACCF00DB3049 /* Assets.xcassets in Resources */,
359 | 8CF190F71E7FACCF00DB3049 /* MainMenu.xib in Resources */,
360 | 8CF190F81E7FACCF00DB3049 /* Info.plist in Resources */,
361 | );
362 | runOnlyForDeploymentPostprocessing = 0;
363 | };
364 | 8CF190AC1E7F94BC00DB3049 /* Resources */ = {
365 | isa = PBXResourcesBuildPhase;
366 | buildActionMask = 2147483647;
367 | files = (
368 | );
369 | runOnlyForDeploymentPostprocessing = 0;
370 | };
371 | 8CF190B71E7F94BC00DB3049 /* Resources */ = {
372 | isa = PBXResourcesBuildPhase;
373 | buildActionMask = 2147483647;
374 | files = (
375 | );
376 | runOnlyForDeploymentPostprocessing = 0;
377 | };
378 | /* End PBXResourcesBuildPhase section */
379 |
380 | /* Begin PBXSourcesBuildPhase section */
381 | 8CF190971E7F94BC00DB3049 /* Sources */ = {
382 | isa = PBXSourcesBuildPhase;
383 | buildActionMask = 2147483647;
384 | files = (
385 | 8CD3C1C81E80EA8000A54AB9 /* main.m in Sources */,
386 | 8CD3C1C71E80EA8000A54AB9 /* AppDelegate.m in Sources */,
387 | 8CD3C1D11E81333700A54AB9 /* ERCodesignProcess.m in Sources */,
388 | 8CD3C1C91E80EA8000A54AB9 /* ERDashboardViewController.m in Sources */,
389 | 8CD3C1C61E80EA8000A54AB9 /* AppDelegate+ERSetup.m in Sources */,
390 | 8CD3C1C41E80EA8000A54AB9 /* NYCmdTool.m in Sources */,
391 | 8CD3C1CE1E80EAB200A54AB9 /* ERContex.m in Sources */,
392 | 8CD3C1C51E80EA8000A54AB9 /* NYCocoaKit.m in Sources */,
393 | 8CD3C1CB1E80EA8000A54AB9 /* ERDragTextField.m in Sources */,
394 | );
395 | runOnlyForDeploymentPostprocessing = 0;
396 | };
397 | 8CF190AA1E7F94BC00DB3049 /* Sources */ = {
398 | isa = PBXSourcesBuildPhase;
399 | buildActionMask = 2147483647;
400 | files = (
401 | 8CF190B31E7F94BC00DB3049 /* EasyResignyTests.m in Sources */,
402 | );
403 | runOnlyForDeploymentPostprocessing = 0;
404 | };
405 | 8CF190B51E7F94BC00DB3049 /* Sources */ = {
406 | isa = PBXSourcesBuildPhase;
407 | buildActionMask = 2147483647;
408 | files = (
409 | 8CF190BE1E7F94BC00DB3049 /* EasyResignyUITests.m in Sources */,
410 | );
411 | runOnlyForDeploymentPostprocessing = 0;
412 | };
413 | /* End PBXSourcesBuildPhase section */
414 |
415 | /* Begin PBXTargetDependency section */
416 | 8CF190B01E7F94BC00DB3049 /* PBXTargetDependency */ = {
417 | isa = PBXTargetDependency;
418 | target = 8CF1909A1E7F94BC00DB3049 /* EasyResigny */;
419 | targetProxy = 8CF190AF1E7F94BC00DB3049 /* PBXContainerItemProxy */;
420 | };
421 | 8CF190BB1E7F94BC00DB3049 /* PBXTargetDependency */ = {
422 | isa = PBXTargetDependency;
423 | target = 8CF1909A1E7F94BC00DB3049 /* EasyResigny */;
424 | targetProxy = 8CF190BA1E7F94BC00DB3049 /* PBXContainerItemProxy */;
425 | };
426 | /* End PBXTargetDependency section */
427 |
428 | /* Begin PBXVariantGroup section */
429 | 8CF190EF1E7FACCF00DB3049 /* MainMenu.xib */ = {
430 | isa = PBXVariantGroup;
431 | children = (
432 | 8CF190F01E7FACCF00DB3049 /* Base */,
433 | );
434 | name = MainMenu.xib;
435 | sourceTree = "";
436 | };
437 | /* End PBXVariantGroup section */
438 |
439 | /* Begin XCBuildConfiguration section */
440 | 8CF190C01E7F94BC00DB3049 /* Debug */ = {
441 | isa = XCBuildConfiguration;
442 | buildSettings = {
443 | ALWAYS_SEARCH_USER_PATHS = NO;
444 | CLANG_ANALYZER_NONNULL = YES;
445 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
446 | CLANG_CXX_LIBRARY = "libc++";
447 | CLANG_ENABLE_MODULES = YES;
448 | CLANG_ENABLE_OBJC_ARC = YES;
449 | CLANG_WARN_BOOL_CONVERSION = YES;
450 | CLANG_WARN_CONSTANT_CONVERSION = YES;
451 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
452 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
453 | CLANG_WARN_EMPTY_BODY = YES;
454 | CLANG_WARN_ENUM_CONVERSION = YES;
455 | CLANG_WARN_INFINITE_RECURSION = YES;
456 | CLANG_WARN_INT_CONVERSION = YES;
457 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
458 | CLANG_WARN_SUSPICIOUS_MOVES = YES;
459 | CLANG_WARN_UNREACHABLE_CODE = YES;
460 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
461 | CODE_SIGN_IDENTITY = "-";
462 | COPY_PHASE_STRIP = NO;
463 | DEBUG_INFORMATION_FORMAT = dwarf;
464 | ENABLE_STRICT_OBJC_MSGSEND = YES;
465 | ENABLE_TESTABILITY = YES;
466 | GCC_C_LANGUAGE_STANDARD = gnu99;
467 | GCC_DYNAMIC_NO_PIC = NO;
468 | GCC_NO_COMMON_BLOCKS = YES;
469 | GCC_OPTIMIZATION_LEVEL = 0;
470 | GCC_PREPROCESSOR_DEFINITIONS = (
471 | "DEBUG=1",
472 | "$(inherited)",
473 | );
474 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
475 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
476 | GCC_WARN_UNDECLARED_SELECTOR = YES;
477 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
478 | GCC_WARN_UNUSED_FUNCTION = YES;
479 | GCC_WARN_UNUSED_VARIABLE = YES;
480 | MACOSX_DEPLOYMENT_TARGET = 10.12;
481 | MTL_ENABLE_DEBUG_INFO = YES;
482 | ONLY_ACTIVE_ARCH = YES;
483 | SDKROOT = macosx;
484 | };
485 | name = Debug;
486 | };
487 | 8CF190C11E7F94BC00DB3049 /* Release */ = {
488 | isa = XCBuildConfiguration;
489 | buildSettings = {
490 | ALWAYS_SEARCH_USER_PATHS = NO;
491 | CLANG_ANALYZER_NONNULL = YES;
492 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
493 | CLANG_CXX_LIBRARY = "libc++";
494 | CLANG_ENABLE_MODULES = YES;
495 | CLANG_ENABLE_OBJC_ARC = YES;
496 | CLANG_WARN_BOOL_CONVERSION = YES;
497 | CLANG_WARN_CONSTANT_CONVERSION = YES;
498 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
499 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
500 | CLANG_WARN_EMPTY_BODY = YES;
501 | CLANG_WARN_ENUM_CONVERSION = YES;
502 | CLANG_WARN_INFINITE_RECURSION = YES;
503 | CLANG_WARN_INT_CONVERSION = YES;
504 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
505 | CLANG_WARN_SUSPICIOUS_MOVES = YES;
506 | CLANG_WARN_UNREACHABLE_CODE = YES;
507 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
508 | CODE_SIGN_IDENTITY = "-";
509 | COPY_PHASE_STRIP = NO;
510 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
511 | ENABLE_NS_ASSERTIONS = NO;
512 | ENABLE_STRICT_OBJC_MSGSEND = YES;
513 | GCC_C_LANGUAGE_STANDARD = gnu99;
514 | GCC_NO_COMMON_BLOCKS = YES;
515 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
516 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
517 | GCC_WARN_UNDECLARED_SELECTOR = YES;
518 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
519 | GCC_WARN_UNUSED_FUNCTION = YES;
520 | GCC_WARN_UNUSED_VARIABLE = YES;
521 | MACOSX_DEPLOYMENT_TARGET = 10.12;
522 | MTL_ENABLE_DEBUG_INFO = NO;
523 | SDKROOT = macosx;
524 | };
525 | name = Release;
526 | };
527 | 8CF190C31E7F94BC00DB3049 /* Debug */ = {
528 | isa = XCBuildConfiguration;
529 | buildSettings = {
530 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
531 | COMBINE_HIDPI_IMAGES = YES;
532 | INFOPLIST_FILE = "$(SRCROOT)/EasyResigny/Resources/Info.plist";
533 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
534 | PRODUCT_BUNDLE_IDENTIFIER = that.boring.bear.ny.easy.resigny;
535 | PRODUCT_NAME = "$(TARGET_NAME)";
536 | };
537 | name = Debug;
538 | };
539 | 8CF190C41E7F94BC00DB3049 /* Release */ = {
540 | isa = XCBuildConfiguration;
541 | buildSettings = {
542 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
543 | COMBINE_HIDPI_IMAGES = YES;
544 | INFOPLIST_FILE = "$(SRCROOT)/EasyResigny/Resources/Info.plist";
545 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
546 | PRODUCT_BUNDLE_IDENTIFIER = that.boring.bear.ny.easy.resigny;
547 | PRODUCT_NAME = "$(TARGET_NAME)";
548 | };
549 | name = Release;
550 | };
551 | 8CF190C61E7F94BC00DB3049 /* Debug */ = {
552 | isa = XCBuildConfiguration;
553 | buildSettings = {
554 | BUNDLE_LOADER = "$(TEST_HOST)";
555 | COMBINE_HIDPI_IMAGES = YES;
556 | INFOPLIST_FILE = EasyResignyTests/Info.plist;
557 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
558 | PRODUCT_BUNDLE_IDENTIFIER = that.boring.bear.ny.EasyResignyTests;
559 | PRODUCT_NAME = "$(TARGET_NAME)";
560 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/EasyResigny.app/Contents/MacOS/EasyResigny";
561 | };
562 | name = Debug;
563 | };
564 | 8CF190C71E7F94BC00DB3049 /* Release */ = {
565 | isa = XCBuildConfiguration;
566 | buildSettings = {
567 | BUNDLE_LOADER = "$(TEST_HOST)";
568 | COMBINE_HIDPI_IMAGES = YES;
569 | INFOPLIST_FILE = EasyResignyTests/Info.plist;
570 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
571 | PRODUCT_BUNDLE_IDENTIFIER = that.boring.bear.ny.EasyResignyTests;
572 | PRODUCT_NAME = "$(TARGET_NAME)";
573 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/EasyResigny.app/Contents/MacOS/EasyResigny";
574 | };
575 | name = Release;
576 | };
577 | 8CF190C91E7F94BC00DB3049 /* Debug */ = {
578 | isa = XCBuildConfiguration;
579 | buildSettings = {
580 | COMBINE_HIDPI_IMAGES = YES;
581 | INFOPLIST_FILE = EasyResignyUITests/Info.plist;
582 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
583 | PRODUCT_BUNDLE_IDENTIFIER = that.boring.bear.ny.EasyResignyUITests;
584 | PRODUCT_NAME = "$(TARGET_NAME)";
585 | TEST_TARGET_NAME = EasyResigny;
586 | };
587 | name = Debug;
588 | };
589 | 8CF190CA1E7F94BC00DB3049 /* Release */ = {
590 | isa = XCBuildConfiguration;
591 | buildSettings = {
592 | COMBINE_HIDPI_IMAGES = YES;
593 | INFOPLIST_FILE = EasyResignyUITests/Info.plist;
594 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
595 | PRODUCT_BUNDLE_IDENTIFIER = that.boring.bear.ny.EasyResignyUITests;
596 | PRODUCT_NAME = "$(TARGET_NAME)";
597 | TEST_TARGET_NAME = EasyResigny;
598 | };
599 | name = Release;
600 | };
601 | /* End XCBuildConfiguration section */
602 |
603 | /* Begin XCConfigurationList section */
604 | 8CF190961E7F94BC00DB3049 /* Build configuration list for PBXProject "EasyResigny" */ = {
605 | isa = XCConfigurationList;
606 | buildConfigurations = (
607 | 8CF190C01E7F94BC00DB3049 /* Debug */,
608 | 8CF190C11E7F94BC00DB3049 /* Release */,
609 | );
610 | defaultConfigurationIsVisible = 0;
611 | defaultConfigurationName = Release;
612 | };
613 | 8CF190C21E7F94BC00DB3049 /* Build configuration list for PBXNativeTarget "EasyResigny" */ = {
614 | isa = XCConfigurationList;
615 | buildConfigurations = (
616 | 8CF190C31E7F94BC00DB3049 /* Debug */,
617 | 8CF190C41E7F94BC00DB3049 /* Release */,
618 | );
619 | defaultConfigurationIsVisible = 0;
620 | defaultConfigurationName = Release;
621 | };
622 | 8CF190C51E7F94BC00DB3049 /* Build configuration list for PBXNativeTarget "EasyResignyTests" */ = {
623 | isa = XCConfigurationList;
624 | buildConfigurations = (
625 | 8CF190C61E7F94BC00DB3049 /* Debug */,
626 | 8CF190C71E7F94BC00DB3049 /* Release */,
627 | );
628 | defaultConfigurationIsVisible = 0;
629 | defaultConfigurationName = Release;
630 | };
631 | 8CF190C81E7F94BC00DB3049 /* Build configuration list for PBXNativeTarget "EasyResignyUITests" */ = {
632 | isa = XCConfigurationList;
633 | buildConfigurations = (
634 | 8CF190C91E7F94BC00DB3049 /* Debug */,
635 | 8CF190CA1E7F94BC00DB3049 /* Release */,
636 | );
637 | defaultConfigurationIsVisible = 0;
638 | defaultConfigurationName = Release;
639 | };
640 | /* End XCConfigurationList section */
641 | };
642 | rootObject = 8CF190931E7F94BC00DB3049 /* Project object */;
643 | }
644 |
--------------------------------------------------------------------------------
/EasyResigny/EasyResigny/Resources/Base.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
683 |
684 |
685 |
686 |
687 |
688 |
689 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
--------------------------------------------------------------------------------