├── .gitignore
├── README.md
├── iReSign.app
└── Contents
│ ├── Info.plist
│ ├── MacOS
│ └── iReSign
│ ├── PkgInfo
│ └── Resources
│ ├── Icon.icns
│ ├── ResourceRules.plist
│ ├── en.lproj
│ ├── InfoPlist.strings
│ └── MainMenu.nib
│ └── zh-Hans.lproj
│ ├── InfoPlist.strings
│ └── MainMenu.nib
└── iReSign
├── Icon.icns
├── en.lproj
├── InfoPlist.strings
└── MainMenu.xib
├── iReSign.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ ├── xcshareddata
│ │ └── iReSign.xccheckout
│ └── xcuserdata
│ │ └── kramer.xcuserdatad
│ │ ├── UserInterfaceState.xcuserstate
│ │ └── WorkspaceSettings.xcsettings
└── xcuserdata
│ └── kramer.xcuserdatad
│ └── xcschemes
│ ├── iReSign.xcscheme
│ └── xcschememanagement.plist
└── iReSign
├── IRHelpWindow.h
├── IRHelpWindow.m
├── IRTextFieldDrag.h
├── IRTextFieldDrag.m
├── ResourceRules.plist
├── en.lproj
├── InfoPlist.strings
└── MainMenu.xib
├── iReSign-Info.plist
├── iReSign-Prefix.pch
├── iReSignAppDelegate.h
├── iReSignAppDelegate.m
├── main.m
└── zh-Hans.lproj
├── InfoPlist.strings
└── MainMenu.xib
/.gitignore:
--------------------------------------------------------------------------------
1 | DerivedData
2 | xcuserdata
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | iReSign
2 | =======
3 |
4 | iReSign allows iDevice app bundles (.ipa) files to be signed or resigned with a digital certificate from Apple for distribution. It can also create signed iDevice app bundles (.ipa) files from .xcarchive files. This tool is aimed at enterprises users, for enterprise deployment, when the person signing the app is different than the person(s) developing it.
5 |
6 | How to use
7 | =======
8 |
9 | iReSign allows you to re-sign any unencrypted ipa-file with any certificate for which you hold the corresponding private key. iResign can also created a signed ipa-file from an xcarchive file.
10 |
11 | 1. Drag your unsigned .ipa or .xcarchive file to the top box, or use the browse button.
12 |
13 | 2. Enter your full certificate name from Keychain Access, for example "iPhone Developer: Firstname Lastname (XXXXXXXXXX)" in the bottom box.
14 |
15 | 3. Click ReSign! and wait. The resigned file will be saved in the same folder as the original file.
16 |
17 | License
18 | =======
19 |
20 | Copyright (c) 2014 Maciej Swic
21 |
22 | Permission is hereby granted, free of charge, to any person obtaining a copy
23 | of this software and associated documentation files (the "Software"), to deal
24 | in the Software without restriction, including without limitation the rights
25 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
26 | copies of the Software, and to permit persons to whom the Software is
27 | furnished to do so, subject to the following conditions:
28 |
29 | The above copyright notice and this permission notice shall be included in
30 | all copies or substantial portions of the Software.
31 |
32 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
33 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
34 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
35 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
36 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
37 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
38 | THE SOFTWARE.
--------------------------------------------------------------------------------
/iReSign.app/Contents/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | BuildMachineOSBuild
6 | 15A235d
7 | CFBundleDevelopmentRegion
8 | en
9 | CFBundleExecutable
10 | iReSign
11 | CFBundleIconFile
12 | Icon.icns
13 | CFBundleIdentifier
14 | com.appulize.iReSign
15 | CFBundleInfoDictionaryVersion
16 | 6.0
17 | CFBundleName
18 | iReSign
19 | CFBundlePackageType
20 | APPL
21 | CFBundleShortVersionString
22 | 1.4
23 | CFBundleSignature
24 | ????
25 | CFBundleVersion
26 | 1.0
27 | DTCompiler
28 | com.apple.compilers.llvm.clang.1_0
29 | DTPlatformBuild
30 | 6E35b
31 | DTPlatformVersion
32 | GM
33 | DTSDKBuild
34 | 14D125
35 | DTSDKName
36 | macosx10.10
37 | DTXcode
38 | 0640
39 | DTXcodeBuild
40 | 6E35b
41 | LSApplicationCategoryType
42 | public.app-category.developer-tools
43 | LSMinimumSystemVersion
44 | 10.6.8
45 | NSMainNibFile
46 | MainMenu
47 | NSPrincipalClass
48 | NSApplication
49 |
50 |
51 |
--------------------------------------------------------------------------------
/iReSign.app/Contents/MacOS/iReSign:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign.app/Contents/MacOS/iReSign
--------------------------------------------------------------------------------
/iReSign.app/Contents/PkgInfo:
--------------------------------------------------------------------------------
1 | APPL????
--------------------------------------------------------------------------------
/iReSign.app/Contents/Resources/Icon.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign.app/Contents/Resources/Icon.icns
--------------------------------------------------------------------------------
/iReSign.app/Contents/Resources/ResourceRules.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | rules
6 |
7 | .*
8 |
9 | Info.plist
10 |
11 | omit
12 |
13 | weight
14 | 10
15 |
16 | ResourceRules.plist
17 |
18 | omit
19 |
20 | weight
21 | 100
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/iReSign.app/Contents/Resources/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign.app/Contents/Resources/en.lproj/InfoPlist.strings
--------------------------------------------------------------------------------
/iReSign.app/Contents/Resources/en.lproj/MainMenu.nib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign.app/Contents/Resources/en.lproj/MainMenu.nib
--------------------------------------------------------------------------------
/iReSign.app/Contents/Resources/zh-Hans.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign.app/Contents/Resources/zh-Hans.lproj/InfoPlist.strings
--------------------------------------------------------------------------------
/iReSign.app/Contents/Resources/zh-Hans.lproj/MainMenu.nib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign.app/Contents/Resources/zh-Hans.lproj/MainMenu.nib
--------------------------------------------------------------------------------
/iReSign/Icon.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign/Icon.icns
--------------------------------------------------------------------------------
/iReSign/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Localized versions of Info.plist keys */
2 |
3 |
--------------------------------------------------------------------------------
/iReSign/en.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 1080
5 | 12C60
6 | 2844
7 | 1187.34
8 | 625.00
9 |
13 |
14 | NSButton
15 | NSButtonCell
16 | NSCustomObject
17 | NSMenu
18 | NSMenuItem
19 | NSProgressIndicator
20 | NSTextField
21 | NSTextFieldCell
22 | NSView
23 | NSWindowTemplate
24 |
25 |
26 | com.apple.InterfaceBuilder.CocoaPlugin
27 |
28 |
32 |
33 |
36 |
39 |
42 |
206 |
478 |
479 | iReSignAppDelegate
480 |
481 |
482 | NSFontManager
483 |
484 |
485 |
486 |
487 |
488 |
489 | terminate:
490 |
491 |
492 |
493 | 449
494 |
495 |
496 |
497 | orderFrontStandardAboutPanel:
498 |
499 |
500 |
501 | 142
502 |
503 |
504 |
505 | delegate
506 |
507 |
508 |
509 | 495
510 |
511 |
512 |
513 | hide:
514 |
515 |
516 |
517 | 367
518 |
519 |
520 |
521 | hideOtherApplications:
522 |
523 |
524 |
525 | 368
526 |
527 |
528 |
529 | unhideAllApplications:
530 |
531 |
532 |
533 | 370
534 |
535 |
536 |
537 | initialFirstResponder
538 |
539 |
540 |
541 | 581
542 |
543 |
544 |
545 | window
546 |
547 |
548 |
549 | 532
550 |
551 |
552 |
553 | browseButton
554 |
555 |
556 |
557 | 546
558 |
559 |
560 |
561 | certField
562 |
563 |
564 |
565 | 547
566 |
567 |
568 |
569 | pathField
570 |
571 |
572 |
573 | 548
574 |
575 |
576 |
577 | resignButton
578 |
579 |
580 |
581 | 549
582 |
583 |
584 |
585 | browse:
586 |
587 |
588 |
589 | 550
590 |
591 |
592 |
593 | resign:
594 |
595 |
596 |
597 | 551
598 |
599 |
600 |
601 | showHelp:
602 |
603 |
604 |
605 | 552
606 |
607 |
608 |
609 | statusLabel
610 |
611 |
612 |
613 | 561
614 |
615 |
616 |
617 | flurry
618 |
619 |
620 |
621 | 562
622 |
623 |
624 |
625 | provisioningPathField
626 |
627 |
628 |
629 | 569
630 |
631 |
632 |
633 | provisioningBrowseButton
634 |
635 |
636 |
637 | 570
638 |
639 |
640 |
641 | provisioningBrowse:
642 |
643 |
644 |
645 | 571
646 |
647 |
648 |
649 | bundleIDField
650 |
651 |
652 |
653 | 576
654 |
655 |
656 |
657 | changeBundleIDCheckbox
658 |
659 |
660 |
661 | 577
662 |
663 |
664 |
665 | changeBundleIDPressed:
666 |
667 |
668 |
669 | 578
670 |
671 |
672 |
673 | nextKeyView
674 |
675 |
676 |
677 | 583
678 |
679 |
680 |
681 | nextKeyView
682 |
683 |
684 |
685 | 584
686 |
687 |
688 |
689 | nextKeyView
690 |
691 |
692 |
693 | 589
694 |
695 |
696 |
697 | nextKeyView
698 |
699 |
700 |
701 | 585
702 |
703 |
704 |
705 | nextKeyView
706 |
707 |
708 |
709 | 586
710 |
711 |
712 |
713 | nextKeyView
714 |
715 |
716 |
717 | 587
718 |
719 |
720 |
721 | nextKeyView
722 |
723 |
724 |
725 | 588
726 |
727 |
728 |
729 |
730 |
731 | 0
732 |
733 |
734 |
735 |
736 |
737 | -2
738 |
739 |
740 | File's Owner
741 |
742 |
743 | -1
744 |
745 |
746 | First Responder
747 |
748 |
749 | -3
750 |
751 |
752 | Application
753 |
754 |
755 | 29
756 |
757 |
758 |
759 |
760 |
761 |
762 |
763 |
764 | 56
765 |
766 |
767 |
768 |
769 |
770 |
771 |
772 | 57
773 |
774 |
775 |
776 |
777 |
778 |
779 |
780 |
781 |
782 |
783 |
784 |
785 |
786 |
787 |
788 |
789 |
790 | 58
791 |
792 |
793 |
794 |
795 | 134
796 |
797 |
798 |
799 |
800 | 150
801 |
802 |
803 |
804 |
805 | 136
806 |
807 |
808 |
809 |
810 | 144
811 |
812 |
813 |
814 |
815 | 129
816 |
817 |
818 |
819 |
820 | 143
821 |
822 |
823 |
824 |
825 | 236
826 |
827 |
828 |
829 |
830 | 131
831 |
832 |
833 |
834 |
835 |
836 |
837 |
838 | 149
839 |
840 |
841 |
842 |
843 | 145
844 |
845 |
846 |
847 |
848 | 130
849 |
850 |
851 |
852 |
853 | 420
854 |
855 |
856 |
857 |
858 | 490
859 |
860 |
861 |
862 |
863 |
864 |
865 |
866 | 491
867 |
868 |
869 |
870 |
871 |
872 |
873 |
874 | 492
875 |
876 |
877 |
878 |
879 | 494
880 |
881 |
882 |
883 |
884 | 371
885 |
886 |
887 |
888 |
889 |
890 |
891 |
892 | 372
893 |
894 |
895 |
896 |
897 |
898 |
899 |
900 |
901 |
902 |
903 |
904 |
905 |
906 |
907 |
908 |
909 | 557
910 |
911 |
912 |
913 |
914 | 555
915 |
916 |
917 |
918 |
919 |
920 |
921 |
922 | 556
923 |
924 |
925 |
926 |
927 | 539
928 |
929 |
930 |
931 |
932 |
933 |
934 |
935 | 540
936 |
937 |
938 |
939 |
940 | 535
941 |
942 |
943 |
944 |
945 |
946 |
947 |
948 | 536
949 |
950 |
951 |
952 |
953 | 543
954 |
955 |
956 |
957 |
958 |
959 |
960 |
961 | 544
962 |
963 |
964 |
965 |
966 | 533
967 |
968 |
969 |
970 |
971 |
972 |
973 |
974 | 534
975 |
976 |
977 |
978 |
979 | 563
980 |
981 |
982 |
983 |
984 |
985 |
986 |
987 | 564
988 |
989 |
990 |
991 |
992 |
993 |
994 |
995 | 565
996 |
997 |
998 |
999 |
1000 | 566
1001 |
1002 |
1003 |
1004 |
1005 | 572
1006 |
1007 |
1008 |
1009 |
1010 |
1011 |
1012 |
1013 | 573
1014 |
1015 |
1016 |
1017 |
1018 | 574
1019 |
1020 |
1021 |
1022 |
1023 |
1024 |
1025 |
1026 | 575
1027 |
1028 |
1029 |
1030 |
1031 |
1032 |
1033 | com.apple.InterfaceBuilder.CocoaPlugin
1034 | com.apple.InterfaceBuilder.CocoaPlugin
1035 | com.apple.InterfaceBuilder.CocoaPlugin
1036 | com.apple.InterfaceBuilder.CocoaPlugin
1037 | com.apple.InterfaceBuilder.CocoaPlugin
1038 | com.apple.InterfaceBuilder.CocoaPlugin
1039 | com.apple.InterfaceBuilder.CocoaPlugin
1040 | com.apple.InterfaceBuilder.CocoaPlugin
1041 | com.apple.InterfaceBuilder.CocoaPlugin
1042 | com.apple.InterfaceBuilder.CocoaPlugin
1043 | com.apple.InterfaceBuilder.CocoaPlugin
1044 | com.apple.InterfaceBuilder.CocoaPlugin
1045 | com.apple.InterfaceBuilder.CocoaPlugin
1046 | com.apple.InterfaceBuilder.CocoaPlugin
1047 | com.apple.InterfaceBuilder.CocoaPlugin
1048 |
1049 |
1050 | com.apple.InterfaceBuilder.CocoaPlugin
1051 | {{380, 496}, {480, 360}}
1052 |
1053 | com.apple.InterfaceBuilder.CocoaPlugin
1054 | com.apple.InterfaceBuilder.CocoaPlugin
1055 | com.apple.InterfaceBuilder.CocoaPlugin
1056 | com.apple.InterfaceBuilder.CocoaPlugin
1057 | com.apple.InterfaceBuilder.CocoaPlugin
1058 | com.apple.InterfaceBuilder.CocoaPlugin
1059 | IRTextFieldDrag
1060 | com.apple.InterfaceBuilder.CocoaPlugin
1061 | com.apple.InterfaceBuilder.CocoaPlugin
1062 | com.apple.InterfaceBuilder.CocoaPlugin
1063 | com.apple.InterfaceBuilder.CocoaPlugin
1064 | com.apple.InterfaceBuilder.CocoaPlugin
1065 | com.apple.InterfaceBuilder.CocoaPlugin
1066 | IRTextFieldDrag
1067 | com.apple.InterfaceBuilder.CocoaPlugin
1068 | com.apple.InterfaceBuilder.CocoaPlugin
1069 | com.apple.InterfaceBuilder.CocoaPlugin
1070 | com.apple.InterfaceBuilder.CocoaPlugin
1071 | com.apple.InterfaceBuilder.CocoaPlugin
1072 | com.apple.InterfaceBuilder.CocoaPlugin
1073 | IRTextFieldDrag
1074 | com.apple.InterfaceBuilder.CocoaPlugin
1075 | com.apple.InterfaceBuilder.CocoaPlugin
1076 | com.apple.InterfaceBuilder.CocoaPlugin
1077 | com.apple.InterfaceBuilder.CocoaPlugin
1078 | com.apple.InterfaceBuilder.CocoaPlugin
1079 | IRTextFieldDrag
1080 | com.apple.InterfaceBuilder.CocoaPlugin
1081 | com.apple.InterfaceBuilder.CocoaPlugin
1082 | com.apple.InterfaceBuilder.CocoaPlugin
1083 | com.apple.InterfaceBuilder.CocoaPlugin
1084 | com.apple.InterfaceBuilder.CocoaPlugin
1085 |
1086 |
1087 |
1088 |
1089 |
1090 | 589
1091 |
1092 |
1093 |
1094 |
1095 | IRTextFieldDrag
1096 | NSTextField
1097 |
1098 | IBProjectSource
1099 | ./Classes/IRTextFieldDrag.h
1100 |
1101 |
1102 |
1103 | iReSignAppDelegate
1104 | NSObject
1105 |
1106 | id
1107 | id
1108 | id
1109 | id
1110 | id
1111 |
1112 |
1113 |
1114 | browse:
1115 | id
1116 |
1117 |
1118 | changeBundleIDPressed:
1119 | id
1120 |
1121 |
1122 | provisioningBrowse:
1123 | id
1124 |
1125 |
1126 | resign:
1127 | id
1128 |
1129 |
1130 | showHelp:
1131 | id
1132 |
1133 |
1134 |
1135 | NSButton
1136 | IRTextFieldDrag
1137 | IRTextFieldDrag
1138 | NSButton
1139 | NSProgressIndicator
1140 | IRTextFieldDrag
1141 | NSButton
1142 | IRTextFieldDrag
1143 | NSButton
1144 | NSTextField
1145 | NSWindow
1146 |
1147 |
1148 |
1149 | browseButton
1150 | NSButton
1151 |
1152 |
1153 | bundleIDField
1154 | IRTextFieldDrag
1155 |
1156 |
1157 | certField
1158 | IRTextFieldDrag
1159 |
1160 |
1161 | changeBundleIDCheckbox
1162 | NSButton
1163 |
1164 |
1165 | flurry
1166 | NSProgressIndicator
1167 |
1168 |
1169 | pathField
1170 | IRTextFieldDrag
1171 |
1172 |
1173 | provisioningBrowseButton
1174 | NSButton
1175 |
1176 |
1177 | provisioningPathField
1178 | IRTextFieldDrag
1179 |
1180 |
1181 | resignButton
1182 | NSButton
1183 |
1184 |
1185 | statusLabel
1186 | NSTextField
1187 |
1188 |
1189 | window
1190 | NSWindow
1191 |
1192 |
1193 |
1194 | IBProjectSource
1195 | ./Classes/iReSignAppDelegate.h
1196 |
1197 |
1198 |
1199 |
1200 | 0
1201 | IBCocoaFramework
1202 |
1203 | com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3
1204 |
1205 |
1206 | YES
1207 | 3
1208 |
1209 | {11, 11}
1210 | {10, 3}
1211 | {15, 15}
1212 |
1213 |
1214 |
1215 |
--------------------------------------------------------------------------------
/iReSign/iReSign.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 4C8EAD45185B74B90095DC6B /* IRHelpWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8EAD44185B74B90095DC6B /* IRHelpWindow.m */; };
11 | 5B9E4C4C166AB3F7006D9F8F /* IRTextFieldDrag.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B9E4C4B166AB3F7006D9F8F /* IRTextFieldDrag.m */; };
12 | C115EE2B13815024003B9ACC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C115EE2A13815024003B9ACC /* Cocoa.framework */; };
13 | C115EE3513815024003B9ACC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C115EE3313815024003B9ACC /* InfoPlist.strings */; };
14 | C115EE3813815024003B9ACC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C115EE3713815024003B9ACC /* main.m */; };
15 | C115EE3E13815024003B9ACC /* iReSignAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C115EE3D13815024003B9ACC /* iReSignAppDelegate.m */; };
16 | C115EE4113815024003B9ACC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = C115EE3F13815024003B9ACC /* MainMenu.xib */; };
17 | C142471F138174E500F5B51F /* ResourceRules.plist in Resources */ = {isa = PBXBuildFile; fileRef = C142471E138174E500F5B51F /* ResourceRules.plist */; };
18 | C14247301381B75B00F5B51F /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = C142472F1381B75B00F5B51F /* Icon.icns */; };
19 | /* End PBXBuildFile section */
20 |
21 | /* Begin PBXFileReference section */
22 | 4C8EAD43185B74B90095DC6B /* IRHelpWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IRHelpWindow.h; sourceTree = ""; };
23 | 4C8EAD44185B74B90095DC6B /* IRHelpWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IRHelpWindow.m; sourceTree = ""; };
24 | 5B9E4C4A166AB3F7006D9F8F /* IRTextFieldDrag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IRTextFieldDrag.h; sourceTree = ""; };
25 | 5B9E4C4B166AB3F7006D9F8F /* IRTextFieldDrag.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IRTextFieldDrag.m; sourceTree = ""; };
26 | C115EE2613815024003B9ACC /* iReSign.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iReSign.app; sourceTree = BUILT_PRODUCTS_DIR; };
27 | C115EE2A13815024003B9ACC /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
28 | C115EE2D13815024003B9ACC /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
29 | C115EE2E13815024003B9ACC /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
30 | C115EE2F13815024003B9ACC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
31 | C115EE3213815024003B9ACC /* iReSign-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iReSign-Info.plist"; sourceTree = ""; };
32 | C115EE3413815024003B9ACC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; };
33 | C115EE3613815024003B9ACC /* iReSign-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iReSign-Prefix.pch"; sourceTree = ""; };
34 | C115EE3713815024003B9ACC /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
35 | C115EE3C13815024003B9ACC /* iReSignAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iReSignAppDelegate.h; sourceTree = ""; };
36 | C115EE3D13815024003B9ACC /* iReSignAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iReSignAppDelegate.m; sourceTree = ""; };
37 | C115EE4013815024003B9ACC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; };
38 | C142471E138174E500F5B51F /* ResourceRules.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ResourceRules.plist; sourceTree = ""; };
39 | C142472F1381B75B00F5B51F /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Icon.icns; path = ../Icon.icns; sourceTree = ""; };
40 | DF1BF30B18D76F3800AF6E6F /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hans"; path = "zh-Hans.lproj/MainMenu.xib"; sourceTree = ""; };
41 | DF1BF30C18D76F3800AF6E6F /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; };
42 | /* End PBXFileReference section */
43 |
44 | /* Begin PBXFrameworksBuildPhase section */
45 | C115EE2313815024003B9ACC /* Frameworks */ = {
46 | isa = PBXFrameworksBuildPhase;
47 | buildActionMask = 2147483647;
48 | files = (
49 | C115EE2B13815024003B9ACC /* Cocoa.framework in Frameworks */,
50 | );
51 | runOnlyForDeploymentPostprocessing = 0;
52 | };
53 | /* End PBXFrameworksBuildPhase section */
54 |
55 | /* Begin PBXGroup section */
56 | C115EE1B13815023003B9ACC = {
57 | isa = PBXGroup;
58 | children = (
59 | C115EE3013815024003B9ACC /* iReSign */,
60 | C115EE2913815024003B9ACC /* Frameworks */,
61 | C115EE2713815024003B9ACC /* Products */,
62 | );
63 | sourceTree = "";
64 | };
65 | C115EE2713815024003B9ACC /* Products */ = {
66 | isa = PBXGroup;
67 | children = (
68 | C115EE2613815024003B9ACC /* iReSign.app */,
69 | );
70 | name = Products;
71 | sourceTree = "";
72 | };
73 | C115EE2913815024003B9ACC /* Frameworks */ = {
74 | isa = PBXGroup;
75 | children = (
76 | C115EE2A13815024003B9ACC /* Cocoa.framework */,
77 | C115EE2C13815024003B9ACC /* Other Frameworks */,
78 | );
79 | name = Frameworks;
80 | sourceTree = "";
81 | };
82 | C115EE2C13815024003B9ACC /* Other Frameworks */ = {
83 | isa = PBXGroup;
84 | children = (
85 | C115EE2D13815024003B9ACC /* AppKit.framework */,
86 | C115EE2E13815024003B9ACC /* CoreData.framework */,
87 | C115EE2F13815024003B9ACC /* Foundation.framework */,
88 | );
89 | name = "Other Frameworks";
90 | sourceTree = "";
91 | };
92 | C115EE3013815024003B9ACC /* iReSign */ = {
93 | isa = PBXGroup;
94 | children = (
95 | C115EE3C13815024003B9ACC /* iReSignAppDelegate.h */,
96 | C115EE3D13815024003B9ACC /* iReSignAppDelegate.m */,
97 | C115EE3F13815024003B9ACC /* MainMenu.xib */,
98 | 5B9E4C4A166AB3F7006D9F8F /* IRTextFieldDrag.h */,
99 | 5B9E4C4B166AB3F7006D9F8F /* IRTextFieldDrag.m */,
100 | 4C8EAD43185B74B90095DC6B /* IRHelpWindow.h */,
101 | 4C8EAD44185B74B90095DC6B /* IRHelpWindow.m */,
102 | C115EE3113815024003B9ACC /* Supporting Files */,
103 | );
104 | path = iReSign;
105 | sourceTree = "";
106 | };
107 | C115EE3113815024003B9ACC /* Supporting Files */ = {
108 | isa = PBXGroup;
109 | children = (
110 | C142472F1381B75B00F5B51F /* Icon.icns */,
111 | C142471E138174E500F5B51F /* ResourceRules.plist */,
112 | C115EE3213815024003B9ACC /* iReSign-Info.plist */,
113 | C115EE3313815024003B9ACC /* InfoPlist.strings */,
114 | C115EE3613815024003B9ACC /* iReSign-Prefix.pch */,
115 | C115EE3713815024003B9ACC /* main.m */,
116 | );
117 | name = "Supporting Files";
118 | sourceTree = "";
119 | };
120 | /* End PBXGroup section */
121 |
122 | /* Begin PBXNativeTarget section */
123 | C115EE2513815024003B9ACC /* iReSign */ = {
124 | isa = PBXNativeTarget;
125 | buildConfigurationList = C115EE4413815024003B9ACC /* Build configuration list for PBXNativeTarget "iReSign" */;
126 | buildPhases = (
127 | C115EE2213815024003B9ACC /* Sources */,
128 | C115EE2313815024003B9ACC /* Frameworks */,
129 | C115EE2413815024003B9ACC /* Resources */,
130 | );
131 | buildRules = (
132 | );
133 | dependencies = (
134 | );
135 | name = iReSign;
136 | productName = iReSign;
137 | productReference = C115EE2613815024003B9ACC /* iReSign.app */;
138 | productType = "com.apple.product-type.application";
139 | };
140 | /* End PBXNativeTarget section */
141 |
142 | /* Begin PBXProject section */
143 | C115EE1D13815023003B9ACC /* Project object */ = {
144 | isa = PBXProject;
145 | attributes = {
146 | LastUpgradeCheck = 0500;
147 | ORGANIZATIONNAME = nil;
148 | };
149 | buildConfigurationList = C115EE2013815023003B9ACC /* Build configuration list for PBXProject "iReSign" */;
150 | compatibilityVersion = "Xcode 3.2";
151 | developmentRegion = English;
152 | hasScannedForEncodings = 0;
153 | knownRegions = (
154 | en,
155 | "zh-Hans",
156 | );
157 | mainGroup = C115EE1B13815023003B9ACC;
158 | productRefGroup = C115EE2713815024003B9ACC /* Products */;
159 | projectDirPath = "";
160 | projectRoot = "";
161 | targets = (
162 | C115EE2513815024003B9ACC /* iReSign */,
163 | );
164 | };
165 | /* End PBXProject section */
166 |
167 | /* Begin PBXResourcesBuildPhase section */
168 | C115EE2413815024003B9ACC /* Resources */ = {
169 | isa = PBXResourcesBuildPhase;
170 | buildActionMask = 2147483647;
171 | files = (
172 | C115EE3513815024003B9ACC /* InfoPlist.strings in Resources */,
173 | C115EE4113815024003B9ACC /* MainMenu.xib in Resources */,
174 | C142471F138174E500F5B51F /* ResourceRules.plist in Resources */,
175 | C14247301381B75B00F5B51F /* Icon.icns in Resources */,
176 | );
177 | runOnlyForDeploymentPostprocessing = 0;
178 | };
179 | /* End PBXResourcesBuildPhase section */
180 |
181 | /* Begin PBXSourcesBuildPhase section */
182 | C115EE2213815024003B9ACC /* Sources */ = {
183 | isa = PBXSourcesBuildPhase;
184 | buildActionMask = 2147483647;
185 | files = (
186 | C115EE3813815024003B9ACC /* main.m in Sources */,
187 | 4C8EAD45185B74B90095DC6B /* IRHelpWindow.m in Sources */,
188 | C115EE3E13815024003B9ACC /* iReSignAppDelegate.m in Sources */,
189 | 5B9E4C4C166AB3F7006D9F8F /* IRTextFieldDrag.m in Sources */,
190 | );
191 | runOnlyForDeploymentPostprocessing = 0;
192 | };
193 | /* End PBXSourcesBuildPhase section */
194 |
195 | /* Begin PBXVariantGroup section */
196 | C115EE3313815024003B9ACC /* InfoPlist.strings */ = {
197 | isa = PBXVariantGroup;
198 | children = (
199 | C115EE3413815024003B9ACC /* en */,
200 | DF1BF30C18D76F3800AF6E6F /* zh-Hans */,
201 | );
202 | name = InfoPlist.strings;
203 | sourceTree = "";
204 | };
205 | C115EE3F13815024003B9ACC /* MainMenu.xib */ = {
206 | isa = PBXVariantGroup;
207 | children = (
208 | C115EE4013815024003B9ACC /* en */,
209 | DF1BF30B18D76F3800AF6E6F /* zh-Hans */,
210 | );
211 | name = MainMenu.xib;
212 | sourceTree = "";
213 | };
214 | /* End PBXVariantGroup section */
215 |
216 | /* Begin XCBuildConfiguration section */
217 | C115EE4213815024003B9ACC /* Debug */ = {
218 | isa = XCBuildConfiguration;
219 | buildSettings = {
220 | CLANG_WARN_BOOL_CONVERSION = YES;
221 | CLANG_WARN_CONSTANT_CONVERSION = YES;
222 | CLANG_WARN_EMPTY_BODY = YES;
223 | CLANG_WARN_ENUM_CONVERSION = YES;
224 | CLANG_WARN_INT_CONVERSION = YES;
225 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
226 | GCC_C_LANGUAGE_STANDARD = gnu99;
227 | GCC_OPTIMIZATION_LEVEL = 0;
228 | GCC_PREPROCESSOR_DEFINITIONS = DEBUG;
229 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
230 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
231 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
232 | GCC_WARN_ABOUT_RETURN_TYPE = YES;
233 | GCC_WARN_UNDECLARED_SELECTOR = YES;
234 | GCC_WARN_UNINITIALIZED_AUTOS = YES;
235 | GCC_WARN_UNUSED_FUNCTION = YES;
236 | GCC_WARN_UNUSED_VARIABLE = YES;
237 | MACOSX_DEPLOYMENT_TARGET = 10.6;
238 | ONLY_ACTIVE_ARCH = YES;
239 | SDKROOT = macosx;
240 | };
241 | name = Debug;
242 | };
243 | C115EE4313815024003B9ACC /* Release */ = {
244 | isa = XCBuildConfiguration;
245 | buildSettings = {
246 | CLANG_WARN_BOOL_CONVERSION = YES;
247 | CLANG_WARN_CONSTANT_CONVERSION = YES;
248 | CLANG_WARN_EMPTY_BODY = YES;
249 | CLANG_WARN_ENUM_CONVERSION = YES;
250 | CLANG_WARN_INT_CONVERSION = YES;
251 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
252 | GCC_C_LANGUAGE_STANDARD = gnu99;
253 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
254 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
255 | GCC_WARN_ABOUT_RETURN_TYPE = YES;
256 | GCC_WARN_UNDECLARED_SELECTOR = YES;
257 | GCC_WARN_UNINITIALIZED_AUTOS = YES;
258 | GCC_WARN_UNUSED_FUNCTION = YES;
259 | GCC_WARN_UNUSED_VARIABLE = YES;
260 | MACOSX_DEPLOYMENT_TARGET = 10.6;
261 | ONLY_ACTIVE_ARCH = NO;
262 | SDKROOT = macosx;
263 | };
264 | name = Release;
265 | };
266 | C115EE4513815024003B9ACC /* Debug */ = {
267 | isa = XCBuildConfiguration;
268 | buildSettings = {
269 | ALWAYS_SEARCH_USER_PATHS = NO;
270 | CLANG_ENABLE_OBJC_ARC = YES;
271 | COMBINE_HIDPI_IMAGES = YES;
272 | COPY_PHASE_STRIP = NO;
273 | GCC_DYNAMIC_NO_PIC = NO;
274 | GCC_ENABLE_OBJC_EXCEPTIONS = YES;
275 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
276 | GCC_PREFIX_HEADER = "iReSign/iReSign-Prefix.pch";
277 | INFOPLIST_FILE = "iReSign/iReSign-Info.plist";
278 | MACOSX_DEPLOYMENT_TARGET = 10.6.8;
279 | PRODUCT_NAME = "$(TARGET_NAME)";
280 | WRAPPER_EXTENSION = app;
281 | };
282 | name = Debug;
283 | };
284 | C115EE4613815024003B9ACC /* Release */ = {
285 | isa = XCBuildConfiguration;
286 | buildSettings = {
287 | ALWAYS_SEARCH_USER_PATHS = NO;
288 | CLANG_ENABLE_OBJC_ARC = YES;
289 | COMBINE_HIDPI_IMAGES = YES;
290 | COPY_PHASE_STRIP = YES;
291 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
292 | GCC_ENABLE_OBJC_EXCEPTIONS = YES;
293 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
294 | GCC_PREFIX_HEADER = "iReSign/iReSign-Prefix.pch";
295 | INFOPLIST_FILE = "iReSign/iReSign-Info.plist";
296 | MACOSX_DEPLOYMENT_TARGET = 10.6.8;
297 | PRODUCT_NAME = "$(TARGET_NAME)";
298 | WRAPPER_EXTENSION = app;
299 | };
300 | name = Release;
301 | };
302 | /* End XCBuildConfiguration section */
303 |
304 | /* Begin XCConfigurationList section */
305 | C115EE2013815023003B9ACC /* Build configuration list for PBXProject "iReSign" */ = {
306 | isa = XCConfigurationList;
307 | buildConfigurations = (
308 | C115EE4213815024003B9ACC /* Debug */,
309 | C115EE4313815024003B9ACC /* Release */,
310 | );
311 | defaultConfigurationIsVisible = 0;
312 | defaultConfigurationName = Release;
313 | };
314 | C115EE4413815024003B9ACC /* Build configuration list for PBXNativeTarget "iReSign" */ = {
315 | isa = XCConfigurationList;
316 | buildConfigurations = (
317 | C115EE4513815024003B9ACC /* Debug */,
318 | C115EE4613815024003B9ACC /* Release */,
319 | );
320 | defaultConfigurationIsVisible = 0;
321 | defaultConfigurationName = Release;
322 | };
323 | /* End XCConfigurationList section */
324 | };
325 | rootObject = C115EE1D13815023003B9ACC /* Project object */;
326 | }
327 |
--------------------------------------------------------------------------------
/iReSign/iReSign.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/iReSign/iReSign.xcodeproj/project.xcworkspace/xcshareddata/iReSign.xccheckout:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDESourceControlProjectFavoriteDictionaryKey
6 |
7 | IDESourceControlProjectIdentifier
8 | 55C76783-2CEC-4A8B-BA32-DF9DAB6B90C5
9 | IDESourceControlProjectName
10 | iReSign
11 | IDESourceControlProjectOriginsDictionary
12 |
13 | 43280492CE74ADAC7B7AD1393F0FB52CA2FE257C
14 | github.com:maciekish/iReSign.git
15 |
16 | IDESourceControlProjectPath
17 | iReSign/iReSign.xcodeproj
18 | IDESourceControlProjectRelativeInstallPathDictionary
19 |
20 | 43280492CE74ADAC7B7AD1393F0FB52CA2FE257C
21 | ../../..
22 |
23 | IDESourceControlProjectURL
24 | github.com:maciekish/iReSign.git
25 | IDESourceControlProjectVersion
26 | 111
27 | IDESourceControlProjectWCCIdentifier
28 | 43280492CE74ADAC7B7AD1393F0FB52CA2FE257C
29 | IDESourceControlProjectWCConfigurations
30 |
31 |
32 | IDESourceControlRepositoryExtensionIdentifierKey
33 | public.vcs.git
34 | IDESourceControlWCCIdentifierKey
35 | 43280492CE74ADAC7B7AD1393F0FB52CA2FE257C
36 | IDESourceControlWCCName
37 | iReSign
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/iReSign/iReSign.xcodeproj/project.xcworkspace/xcuserdata/kramer.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maciekish/iReSign/df764ae3a57ed19a17eba293d876cdcd588921bf/iReSign/iReSign.xcodeproj/project.xcworkspace/xcuserdata/kramer.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/iReSign/iReSign.xcodeproj/project.xcworkspace/xcuserdata/kramer.xcuserdatad/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges
6 |
7 | SnapshotAutomaticallyBeforeSignificantChanges
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/iReSign/iReSign.xcodeproj/xcuserdata/kramer.xcuserdatad/xcschemes/iReSign.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
51 |
52 |
58 |
59 |
60 |
61 |
62 |
63 |
69 |
70 |
76 |
77 |
78 |
79 |
81 |
82 |
85 |
86 |
87 |
--------------------------------------------------------------------------------
/iReSign/iReSign.xcodeproj/xcuserdata/kramer.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | iReSign.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | C115EE2513815024003B9ACC
16 |
17 | primary
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/iReSign/iReSign/IRHelpWindow.h:
--------------------------------------------------------------------------------
1 | //
2 | // IRHelpWindow.h
3 | // iReSign
4 | //
5 | // Created by Kramer on 12/13/13.
6 | // Copyright (c) 2013 nil. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface IRHelpWindow : NSWindow
12 |
13 | // Close the window
14 | - (IBAction)closeOK:(id)sender;
15 |
16 | @end
17 |
--------------------------------------------------------------------------------
/iReSign/iReSign/IRHelpWindow.m:
--------------------------------------------------------------------------------
1 | //
2 | // IRHelpWindow.m
3 | // iReSign
4 | //
5 | // Created by Shmoopi on 12/13/13.
6 | // Copyright (c) 2013 nil. All rights reserved.
7 | //
8 |
9 | #import "IRHelpWindow.h"
10 |
11 | @implementation IRHelpWindow
12 |
13 | // Move the window by dragging
14 | - (BOOL)isMovableByWindowBackground {
15 | return YES;
16 | }
17 |
18 | // Close the window
19 | - (IBAction)closeOK:(id)sender {
20 | [self close];
21 | }
22 |
23 | @end
24 |
--------------------------------------------------------------------------------
/iReSign/iReSign/IRTextFieldDrag.h:
--------------------------------------------------------------------------------
1 | //
2 | // IRTextFieldDrag.h
3 | // iReSign
4 | //
5 | // Created by Esteban Bouza on 01/12/12.
6 | //
7 |
8 | #import
9 |
10 | @interface IRTextFieldDrag : NSTextField
11 |
12 | @end
13 |
--------------------------------------------------------------------------------
/iReSign/iReSign/IRTextFieldDrag.m:
--------------------------------------------------------------------------------
1 | //
2 | // IRTextFieldDrag.m
3 | // iReSign
4 | //
5 | // Created by Esteban Bouza on 01/12/12.
6 | //
7 |
8 | #import "IRTextFieldDrag.h"
9 |
10 | @implementation IRTextFieldDrag
11 |
12 | - (void)awakeFromNib {
13 | [self registerForDraggedTypes:@[NSFilenamesPboardType]];
14 | }
15 |
16 | - (BOOL)performDragOperation:(id )sender
17 | {
18 | NSPasteboard *pboard = [sender draggingPasteboard];
19 |
20 | if ( [[pboard types] containsObject:NSURLPboardType] ) {
21 | NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
22 | if (files.count <= 0) {
23 | return NO;
24 | }
25 | self.stringValue = [files objectAtIndex:0];
26 |
27 | }
28 | return YES;
29 | }
30 |
31 |
32 | // Source: http://www.cocoabuilder.com/archive/cocoa/11014-dnd-for-nstextfields-drag-drop.html
33 | - (NSDragOperation)draggingEntered:(id )sender {
34 |
35 | if (!self.isEnabled) return NSDragOperationNone;
36 |
37 | NSPasteboard *pboard;
38 | NSDragOperation sourceDragMask;
39 |
40 | sourceDragMask = [sender draggingSourceOperationMask];
41 | pboard = [sender draggingPasteboard];
42 |
43 | if ( [[pboard types] containsObject:NSColorPboardType] ) {
44 | if (sourceDragMask & NSDragOperationCopy) {
45 | return NSDragOperationCopy;
46 | }
47 | }
48 | if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
49 | if (sourceDragMask & NSDragOperationCopy) {
50 | return NSDragOperationCopy;
51 | }
52 | }
53 |
54 | return NSDragOperationNone;
55 | }
56 |
57 |
58 | @end
59 |
--------------------------------------------------------------------------------
/iReSign/iReSign/ResourceRules.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | rules
6 |
7 | .*
8 |
9 | Info.plist
10 |
11 | omit
12 |
13 | weight
14 | 10
15 |
16 | ResourceRules.plist
17 |
18 | omit
19 |
20 | weight
21 | 100
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/iReSign/iReSign/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Localized versions of Info.plist keys */
2 |
3 |
--------------------------------------------------------------------------------
/iReSign/iReSign/en.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
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 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
146 |
158 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
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 |
270 |
271 |
272 |
273 | iReSign allows you to re-sign any unencrypted ipa-file with any certificate for which you hold the corresponding private key.
274 |
275 | 1. Drag your unsigned .ipa file to the top box, or use the browse button.
276 |
277 | 2. Enter your full certificate name from Keychain Access, for example "iPhone Developer: Firstname Lastname (XXXXXXXXXX)" in the bottom box.
278 |
279 | 3. Click ReSign! and wait. The resigned file will be saved in the same folder as the original file.
280 |
281 |
282 |
283 |
284 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
--------------------------------------------------------------------------------
/iReSign/iReSign/iReSign-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIconFile
10 | Icon.icns
11 | CFBundleIdentifier
12 | com.appulize.${PRODUCT_NAME:rfc1034identifier}
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | ${PRODUCT_NAME}
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.4
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | 1.0
25 | LSApplicationCategoryType
26 | public.app-category.developer-tools
27 | LSMinimumSystemVersion
28 | ${MACOSX_DEPLOYMENT_TARGET}
29 | NSMainNibFile
30 | MainMenu
31 | NSPrincipalClass
32 | NSApplication
33 |
34 |
35 |
--------------------------------------------------------------------------------
/iReSign/iReSign/iReSign-Prefix.pch:
--------------------------------------------------------------------------------
1 | //
2 | // Prefix header for all source files of the 'iReSign' target in the 'iReSign' project
3 | //
4 |
5 | #ifdef __OBJC__
6 | #import
7 | #endif
8 |
--------------------------------------------------------------------------------
/iReSign/iReSign/iReSignAppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // iReSignAppDelegate.h
3 | // iReSign
4 | //
5 | // Created by Maciej Swic on 2011-05-16.
6 | // Copyright (c) 2011 Maciej Swic, Licensed under the MIT License.
7 | // See README.md for details
8 | //
9 |
10 | #import
11 | #import "IRTextFieldDrag.h"
12 |
13 | @interface iReSignAppDelegate : NSObject {
14 | @private
15 | NSWindow *__unsafe_unretained window;
16 |
17 | NSUserDefaults *defaults;
18 |
19 | NSTask *unzipTask;
20 | NSTask *copyTask;
21 | NSTask *provisioningTask;
22 | NSTask *codesignTask;
23 | NSTask *generateEntitlementsTask;
24 | NSTask *verifyTask;
25 | NSTask *zipTask;
26 | NSString *sourcePath;
27 | NSString *appPath;
28 | NSString *frameworksDirPath;
29 | NSString *frameworkPath;
30 | NSString *workingPath;
31 | NSString *appName;
32 | NSString *fileName;
33 |
34 | NSString *entitlementsResult;
35 | NSString *codesigningResult;
36 | NSString *verificationResult;
37 |
38 | NSMutableArray *frameworks;
39 | Boolean hasFrameworks;
40 |
41 | IBOutlet IRTextFieldDrag *pathField;
42 | IBOutlet IRTextFieldDrag *provisioningPathField;
43 | IBOutlet IRTextFieldDrag *entitlementField;
44 | IBOutlet IRTextFieldDrag *bundleIDField;
45 | IBOutlet NSButton *browseButton;
46 | IBOutlet NSButton *provisioningBrowseButton;
47 | IBOutlet NSButton *entitlementBrowseButton;
48 | IBOutlet NSButton *resignButton;
49 | IBOutlet NSTextField *statusLabel;
50 | IBOutlet NSProgressIndicator *flurry;
51 | IBOutlet NSButton *changeBundleIDCheckbox;
52 |
53 | IBOutlet NSComboBox *certComboBox;
54 | NSMutableArray *certComboBoxItems;
55 | NSTask *certTask;
56 | NSArray *getCertsResult;
57 |
58 | }
59 |
60 | @property (unsafe_unretained) IBOutlet NSWindow *window;
61 |
62 | @property (nonatomic, strong) NSString *workingPath;
63 |
64 | - (IBAction)resign:(id)sender;
65 | - (IBAction)browse:(id)sender;
66 | - (IBAction)provisioningBrowse:(id)sender;
67 | - (IBAction)entitlementBrowse:(id)sender;
68 | - (IBAction)changeBundleIDPressed:(id)sender;
69 |
70 | - (void)checkUnzip:(NSTimer *)timer;
71 | - (void)checkCopy:(NSTimer *)timer;
72 | - (void)doProvisioning;
73 | - (void)checkProvisioning:(NSTimer *)timer;
74 | - (void)doCodeSigning;
75 | - (void)checkCodesigning:(NSTimer *)timer;
76 | - (void)doVerifySignature;
77 | - (void)checkVerificationProcess:(NSTimer *)timer;
78 | - (void)doZip;
79 | - (void)checkZip:(NSTimer *)timer;
80 | - (void)disableControls;
81 | - (void)enableControls;
82 |
83 | @end
84 |
--------------------------------------------------------------------------------
/iReSign/iReSign/iReSignAppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // iReSignAppDelegate.m
3 | // iReSign
4 | //
5 | // Created by Maciej Swic on 2011-05-16.
6 | // Copyright (c) 2011 Maciej Swic, Licensed under the MIT License.
7 | // See README.md for details
8 | //
9 |
10 | #import "iReSignAppDelegate.h"
11 |
12 | static NSString *kKeyPrefsBundleIDChange = @"keyBundleIDChange";
13 |
14 | static NSString *kKeyBundleIDPlistApp = @"CFBundleIdentifier";
15 | static NSString *kKeyBundleIDPlistiTunesArtwork = @"softwareVersionBundleId";
16 | static NSString *kKeyInfoPlistApplicationProperties = @"ApplicationProperties";
17 | static NSString *kKeyInfoPlistApplicationPath = @"ApplicationPath";
18 | static NSString *kFrameworksDirName = @"Frameworks";
19 | static NSString *kPayloadDirName = @"Payload";
20 | static NSString *kProductsDirName = @"Products";
21 | static NSString *kInfoPlistFilename = @"Info.plist";
22 | static NSString *kiTunesMetadataFileName = @"iTunesMetadata";
23 |
24 | @implementation iReSignAppDelegate
25 |
26 | @synthesize window,workingPath;
27 |
28 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
29 | {
30 | [flurry setAlphaValue:0.5];
31 |
32 | defaults = [NSUserDefaults standardUserDefaults];
33 |
34 | // Look up available signing certificates
35 | [self getCerts];
36 |
37 | if ([defaults valueForKey:@"ENTITLEMENT_PATH"])
38 | [entitlementField setStringValue:[defaults valueForKey:@"ENTITLEMENT_PATH"]];
39 | if ([defaults valueForKey:@"MOBILEPROVISION_PATH"])
40 | [provisioningPathField setStringValue:[defaults valueForKey:@"MOBILEPROVISION_PATH"]];
41 |
42 | if (![[NSFileManager defaultManager] fileExistsAtPath:@"/usr/bin/zip"]) {
43 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"This app cannot run without the zip utility present at /usr/bin/zip"];
44 | exit(0);
45 | }
46 | if (![[NSFileManager defaultManager] fileExistsAtPath:@"/usr/bin/unzip"]) {
47 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"This app cannot run without the unzip utility present at /usr/bin/unzip"];
48 | exit(0);
49 | }
50 | if (![[NSFileManager defaultManager] fileExistsAtPath:@"/usr/bin/codesign"]) {
51 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"This app cannot run without the codesign utility present at /usr/bin/codesign"];
52 | exit(0);
53 | }
54 | }
55 |
56 |
57 | - (IBAction)resign:(id)sender {
58 | //Save cert name
59 | [defaults setValue:[NSNumber numberWithInteger:[certComboBox indexOfSelectedItem]] forKey:@"CERT_INDEX"];
60 | [defaults setValue:[entitlementField stringValue] forKey:@"ENTITLEMENT_PATH"];
61 | [defaults setValue:[provisioningPathField stringValue] forKey:@"MOBILEPROVISION_PATH"];
62 | [defaults setValue:[bundleIDField stringValue] forKey:kKeyPrefsBundleIDChange];
63 | [defaults synchronize];
64 |
65 | codesigningResult = nil;
66 | verificationResult = nil;
67 |
68 | sourcePath = [pathField stringValue];
69 | workingPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"com.appulize.iresign"];
70 |
71 | if ([certComboBox objectValue]) {
72 | if (([[[sourcePath pathExtension] lowercaseString] isEqualToString:@"ipa"]) ||
73 | ([[[sourcePath pathExtension] lowercaseString] isEqualToString:@"xcarchive"])) {
74 | [self disableControls];
75 |
76 | NSLog(@"Setting up working directory in %@",workingPath);
77 | [statusLabel setHidden:NO];
78 | [statusLabel setStringValue:@"Setting up working directory"];
79 |
80 | [[NSFileManager defaultManager] removeItemAtPath:workingPath error:nil];
81 |
82 | [[NSFileManager defaultManager] createDirectoryAtPath:workingPath withIntermediateDirectories:TRUE attributes:nil error:nil];
83 |
84 | if ([[[sourcePath pathExtension] lowercaseString] isEqualToString:@"ipa"]) {
85 | if (sourcePath && [sourcePath length] > 0) {
86 | NSLog(@"Unzipping %@",sourcePath);
87 | [statusLabel setStringValue:@"Extracting original app"];
88 | }
89 |
90 | unzipTask = [[NSTask alloc] init];
91 | [unzipTask setLaunchPath:@"/usr/bin/unzip"];
92 | [unzipTask setArguments:[NSArray arrayWithObjects:@"-q", sourcePath, @"-d", workingPath, nil]];
93 |
94 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkUnzip:) userInfo:nil repeats:TRUE];
95 |
96 | [unzipTask launch];
97 | }
98 | else {
99 | NSString* payloadPath = [workingPath stringByAppendingPathComponent:kPayloadDirName];
100 |
101 | NSLog(@"Setting up %@ path in %@", kPayloadDirName, payloadPath);
102 | [statusLabel setStringValue:[NSString stringWithFormat:@"Setting up %@ path", kPayloadDirName]];
103 |
104 | [[NSFileManager defaultManager] createDirectoryAtPath:payloadPath withIntermediateDirectories:TRUE attributes:nil error:nil];
105 |
106 | NSLog(@"Retrieving %@", kInfoPlistFilename);
107 | [statusLabel setStringValue:[NSString stringWithFormat:@"Retrieving %@", kInfoPlistFilename]];
108 |
109 | NSString* infoPListPath = [sourcePath stringByAppendingPathComponent:kInfoPlistFilename];
110 |
111 | NSDictionary* infoPListDict = [NSDictionary dictionaryWithContentsOfFile:infoPListPath];
112 |
113 | if (infoPListDict != nil) {
114 | NSString* applicationPath = nil;
115 |
116 | NSDictionary* applicationPropertiesDict = [infoPListDict objectForKey:kKeyInfoPlistApplicationProperties];
117 |
118 | if (applicationPropertiesDict != nil) {
119 | applicationPath = [applicationPropertiesDict objectForKey:kKeyInfoPlistApplicationPath];
120 | }
121 |
122 | if (applicationPath != nil) {
123 | applicationPath = [[sourcePath stringByAppendingPathComponent:kProductsDirName] stringByAppendingPathComponent:applicationPath];
124 |
125 | NSLog(@"Copying %@ to %@ path in %@", applicationPath, kPayloadDirName, payloadPath);
126 | [statusLabel setStringValue:[NSString stringWithFormat:@"Copying .xcarchive app to %@ path", kPayloadDirName]];
127 |
128 | copyTask = [[NSTask alloc] init];
129 | [copyTask setLaunchPath:@"/bin/cp"];
130 | [copyTask setArguments:[NSArray arrayWithObjects:@"-r", applicationPath, payloadPath, nil]];
131 |
132 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkCopy:) userInfo:nil repeats:TRUE];
133 |
134 | [copyTask launch];
135 | }
136 | else {
137 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:[NSString stringWithFormat:@"Unable to parse %@", kInfoPlistFilename]];
138 | [self enableControls];
139 | [statusLabel setStringValue:@"Ready"];
140 | }
141 | }
142 | else {
143 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:[NSString stringWithFormat:@"Retrieve %@ failed", kInfoPlistFilename]];
144 | [self enableControls];
145 | [statusLabel setStringValue:@"Ready"];
146 | }
147 | }
148 | }
149 | else {
150 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"You must choose an *.ipa or *.xcarchive file"];
151 | [self enableControls];
152 | [statusLabel setStringValue:@"Please try again"];
153 | }
154 | } else {
155 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"You must choose an signing certificate from dropdown."];
156 | [self enableControls];
157 | [statusLabel setStringValue:@"Please try again"];
158 | }
159 | }
160 |
161 | - (void)checkUnzip:(NSTimer *)timer {
162 | if ([unzipTask isRunning] == 0) {
163 | [timer invalidate];
164 | unzipTask = nil;
165 |
166 | if ([[NSFileManager defaultManager] fileExistsAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName]]) {
167 | NSLog(@"Unzipping done");
168 | [statusLabel setStringValue:@"Original app extracted"];
169 |
170 | if (changeBundleIDCheckbox.state == NSOnState) {
171 | [self doBundleIDChange:bundleIDField.stringValue];
172 | }
173 |
174 | if ([[provisioningPathField stringValue] isEqualTo:@""]) {
175 | [self doCodeSigning];
176 | } else {
177 | [self doProvisioning];
178 | }
179 | } else {
180 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"Unzip failed"];
181 | [self enableControls];
182 | [statusLabel setStringValue:@"Ready"];
183 | }
184 | }
185 | }
186 |
187 | - (void)checkCopy:(NSTimer *)timer {
188 | if ([copyTask isRunning] == 0) {
189 | [timer invalidate];
190 | copyTask = nil;
191 |
192 | NSLog(@"Copy done");
193 | [statusLabel setStringValue:@".xcarchive app copied"];
194 |
195 | if (changeBundleIDCheckbox.state == NSOnState) {
196 | [self doBundleIDChange:bundleIDField.stringValue];
197 | }
198 |
199 | if ([[provisioningPathField stringValue] isEqualTo:@""]) {
200 | [self doCodeSigning];
201 | } else {
202 | [self doProvisioning];
203 | }
204 | }
205 | }
206 |
207 | - (BOOL)doBundleIDChange:(NSString *)newBundleID {
208 | BOOL success = YES;
209 |
210 | success &= [self doAppBundleIDChange:newBundleID];
211 | success &= [self doITunesMetadataBundleIDChange:newBundleID];
212 |
213 | return success;
214 | }
215 |
216 |
217 | - (BOOL)doITunesMetadataBundleIDChange:(NSString *)newBundleID {
218 | NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:workingPath error:nil];
219 | NSString *infoPlistPath = nil;
220 |
221 | for (NSString *file in dirContents) {
222 | if ([[[file pathExtension] lowercaseString] isEqualToString:@"plist"]) {
223 | infoPlistPath = [workingPath stringByAppendingPathComponent:file];
224 | break;
225 | }
226 | }
227 |
228 | return [self changeBundleIDForFile:infoPlistPath bundleIDKey:kKeyBundleIDPlistiTunesArtwork newBundleID:newBundleID plistOutOptions:NSPropertyListXMLFormat_v1_0];
229 |
230 | }
231 |
232 | - (BOOL)doAppBundleIDChange:(NSString *)newBundleID {
233 | NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName] error:nil];
234 | NSString *infoPlistPath = nil;
235 |
236 | for (NSString *file in dirContents) {
237 | if ([[[file pathExtension] lowercaseString] isEqualToString:@"app"]) {
238 | infoPlistPath = [[[workingPath stringByAppendingPathComponent:kPayloadDirName]
239 | stringByAppendingPathComponent:file]
240 | stringByAppendingPathComponent:kInfoPlistFilename];
241 | break;
242 | }
243 | }
244 |
245 | return [self changeBundleIDForFile:infoPlistPath bundleIDKey:kKeyBundleIDPlistApp newBundleID:newBundleID plistOutOptions:NSPropertyListBinaryFormat_v1_0];
246 | }
247 |
248 | - (BOOL)changeBundleIDForFile:(NSString *)filePath bundleIDKey:(NSString *)bundleIDKey newBundleID:(NSString *)newBundleID plistOutOptions:(NSPropertyListWriteOptions)options {
249 |
250 | NSMutableDictionary *plist = nil;
251 |
252 | if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
253 | plist = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
254 | [plist setObject:newBundleID forKey:bundleIDKey];
255 |
256 | NSData *xmlData = [NSPropertyListSerialization dataWithPropertyList:plist format:options options:kCFPropertyListImmutable error:nil];
257 |
258 | return [xmlData writeToFile:filePath atomically:YES];
259 |
260 | }
261 |
262 | return NO;
263 | }
264 |
265 |
266 | - (void)doProvisioning {
267 | NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName] error:nil];
268 |
269 | for (NSString *file in dirContents) {
270 | if ([[[file pathExtension] lowercaseString] isEqualToString:@"app"]) {
271 | appPath = [[workingPath stringByAppendingPathComponent:kPayloadDirName] stringByAppendingPathComponent:file];
272 | if ([[NSFileManager defaultManager] fileExistsAtPath:[appPath stringByAppendingPathComponent:@"embedded.mobileprovision"]]) {
273 | NSLog(@"Found embedded.mobileprovision, deleting.");
274 | [[NSFileManager defaultManager] removeItemAtPath:[appPath stringByAppendingPathComponent:@"embedded.mobileprovision"] error:nil];
275 | }
276 | break;
277 | }
278 | }
279 |
280 | NSString *targetPath = [appPath stringByAppendingPathComponent:@"embedded.mobileprovision"];
281 |
282 | provisioningTask = [[NSTask alloc] init];
283 | [provisioningTask setLaunchPath:@"/bin/cp"];
284 | [provisioningTask setArguments:[NSArray arrayWithObjects:[provisioningPathField stringValue], targetPath, nil]];
285 |
286 | [provisioningTask launch];
287 |
288 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkProvisioning:) userInfo:nil repeats:TRUE];
289 | }
290 |
291 | - (void)checkProvisioning:(NSTimer *)timer {
292 | if ([provisioningTask isRunning] == 0) {
293 | [timer invalidate];
294 | provisioningTask = nil;
295 |
296 | NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName] error:nil];
297 |
298 | for (NSString *file in dirContents) {
299 | if ([[[file pathExtension] lowercaseString] isEqualToString:@"app"]) {
300 | appPath = [[workingPath stringByAppendingPathComponent:kPayloadDirName] stringByAppendingPathComponent:file];
301 | if ([[NSFileManager defaultManager] fileExistsAtPath:[appPath stringByAppendingPathComponent:@"embedded.mobileprovision"]]) {
302 |
303 | BOOL identifierOK = FALSE;
304 | NSString *identifierInProvisioning = @"";
305 |
306 | NSString *embeddedProvisioning = [NSString stringWithContentsOfFile:[appPath stringByAppendingPathComponent:@"embedded.mobileprovision"] encoding:NSASCIIStringEncoding error:nil];
307 | NSArray* embeddedProvisioningLines = [embeddedProvisioning componentsSeparatedByCharactersInSet:
308 | [NSCharacterSet newlineCharacterSet]];
309 |
310 | for (int i = 0; i < [embeddedProvisioningLines count]; i++) {
311 | if ([[embeddedProvisioningLines objectAtIndex:i] rangeOfString:@"application-identifier"].location != NSNotFound) {
312 |
313 | NSInteger fromPosition = [[embeddedProvisioningLines objectAtIndex:i+1] rangeOfString:@""].location + 8;
314 |
315 | NSInteger toPosition = [[embeddedProvisioningLines objectAtIndex:i+1] rangeOfString:@""].location;
316 |
317 | NSRange range;
318 | range.location = fromPosition;
319 | range.length = toPosition-fromPosition;
320 |
321 | NSString *fullIdentifier = [[embeddedProvisioningLines objectAtIndex:i+1] substringWithRange:range];
322 |
323 | NSArray *identifierComponents = [fullIdentifier componentsSeparatedByString:@"."];
324 |
325 | if ([[identifierComponents lastObject] isEqualTo:@"*"]) {
326 | identifierOK = TRUE;
327 | }
328 |
329 | for (int i = 1; i < [identifierComponents count]; i++) {
330 | identifierInProvisioning = [identifierInProvisioning stringByAppendingString:[identifierComponents objectAtIndex:i]];
331 | if (i < [identifierComponents count]-1) {
332 | identifierInProvisioning = [identifierInProvisioning stringByAppendingString:@"."];
333 | }
334 | }
335 | break;
336 | }
337 | }
338 |
339 | NSLog(@"Mobileprovision identifier: %@",identifierInProvisioning);
340 |
341 | NSDictionary *infoplist = [NSDictionary dictionaryWithContentsOfFile:[appPath stringByAppendingPathComponent:@"Info.plist"]];
342 | if ([identifierInProvisioning isEqualTo:[infoplist objectForKey:kKeyBundleIDPlistApp]]) {
343 | NSLog(@"Identifiers match");
344 | identifierOK = TRUE;
345 | }
346 |
347 | if (identifierOK) {
348 | NSLog(@"Provisioning completed.");
349 | [statusLabel setStringValue:@"Provisioning completed"];
350 | [self doEntitlementsFixing];
351 | } else {
352 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"Product identifiers don't match"];
353 | [self enableControls];
354 | [statusLabel setStringValue:@"Ready"];
355 | }
356 | } else {
357 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"Provisioning failed"];
358 | [self enableControls];
359 | [statusLabel setStringValue:@"Ready"];
360 | }
361 | break;
362 | }
363 | }
364 | }
365 | }
366 |
367 | - (void)doEntitlementsFixing
368 | {
369 | if (![entitlementField.stringValue isEqualToString:@""] || [provisioningPathField.stringValue isEqualToString:@""]) {
370 | [self doCodeSigning];
371 | return; // Using a pre-made entitlements file or we're not re-provisioning.
372 | }
373 |
374 | [statusLabel setStringValue:@"Generating entitlements"];
375 |
376 | if (appPath) {
377 | generateEntitlementsTask = [[NSTask alloc] init];
378 | [generateEntitlementsTask setLaunchPath:@"/usr/bin/security"];
379 | [generateEntitlementsTask setArguments:@[@"cms", @"-D", @"-i", provisioningPathField.stringValue]];
380 | [generateEntitlementsTask setCurrentDirectoryPath:workingPath];
381 |
382 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkEntitlementsFix:) userInfo:nil repeats:TRUE];
383 |
384 | NSPipe *pipe=[NSPipe pipe];
385 | [generateEntitlementsTask setStandardOutput:pipe];
386 | [generateEntitlementsTask setStandardError:pipe];
387 | NSFileHandle *handle = [pipe fileHandleForReading];
388 |
389 | [generateEntitlementsTask launch];
390 |
391 | [NSThread detachNewThreadSelector:@selector(watchEntitlements:)
392 | toTarget:self withObject:handle];
393 | }
394 | }
395 |
396 | - (void)watchEntitlements:(NSFileHandle*)streamHandle {
397 | @autoreleasepool {
398 | entitlementsResult = [[NSString alloc] initWithData:[streamHandle readDataToEndOfFile] encoding:NSASCIIStringEncoding];
399 | }
400 | }
401 |
402 | - (void)checkEntitlementsFix:(NSTimer *)timer {
403 | if ([generateEntitlementsTask isRunning] == 0) {
404 | [timer invalidate];
405 | generateEntitlementsTask = nil;
406 | NSLog(@"Entitlements fixed done");
407 | [statusLabel setStringValue:@"Entitlements generated"];
408 | [self doEntitlementsEdit];
409 | }
410 | }
411 |
412 | - (void)doEntitlementsEdit
413 | {
414 | NSDictionary* entitlements = entitlementsResult.propertyList;
415 | entitlements = entitlements[@"Entitlements"];
416 | NSString* filePath = [workingPath stringByAppendingPathComponent:@"entitlements.plist"];
417 | NSData *xmlData = [NSPropertyListSerialization dataWithPropertyList:entitlements format:NSPropertyListXMLFormat_v1_0 options:kCFPropertyListImmutable error:nil];
418 | if(![xmlData writeToFile:filePath atomically:YES]) {
419 | NSLog(@"Error writing entitlements file.");
420 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"Failed entitlements generation"];
421 | [self enableControls];
422 | [statusLabel setStringValue:@"Ready"];
423 | }
424 | else {
425 | entitlementField.stringValue = filePath;
426 | [self doCodeSigning];
427 | }
428 | }
429 |
430 | - (void)doCodeSigning {
431 | appPath = nil;
432 | frameworksDirPath = nil;
433 | hasFrameworks = NO;
434 | frameworks = [[NSMutableArray alloc] init];
435 |
436 | NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName] error:nil];
437 |
438 | for (NSString *file in dirContents) {
439 | if ([[[file pathExtension] lowercaseString] isEqualToString:@"app"]) {
440 | appPath = [[workingPath stringByAppendingPathComponent:kPayloadDirName] stringByAppendingPathComponent:file];
441 | frameworksDirPath = [appPath stringByAppendingPathComponent:kFrameworksDirName];
442 | NSLog(@"Found %@",appPath);
443 | appName = file;
444 | if ([[NSFileManager defaultManager] fileExistsAtPath:frameworksDirPath]) {
445 | NSLog(@"Found %@",frameworksDirPath);
446 | hasFrameworks = YES;
447 | NSArray *frameworksContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:frameworksDirPath error:nil];
448 | for (NSString *frameworkFile in frameworksContents) {
449 | NSString *extension = [[frameworkFile pathExtension] lowercaseString];
450 | if ([extension isEqualTo:@"framework"] || [extension isEqualTo:@"dylib"]) {
451 | frameworkPath = [frameworksDirPath stringByAppendingPathComponent:frameworkFile];
452 | NSLog(@"Found %@",frameworkPath);
453 | [frameworks addObject:frameworkPath];
454 | }
455 | }
456 | }
457 | [statusLabel setStringValue:[NSString stringWithFormat:@"Codesigning %@",file]];
458 | break;
459 | }
460 | }
461 |
462 | if (appPath) {
463 | if (hasFrameworks) {
464 | [self signFile:[frameworks lastObject]];
465 | [frameworks removeLastObject];
466 | } else {
467 | [self signFile:appPath];
468 | }
469 | }
470 | }
471 |
472 | - (void)signFile:(NSString*)filePath {
473 | NSLog(@"Codesigning %@", filePath);
474 | [statusLabel setStringValue:[NSString stringWithFormat:@"Codesigning %@",filePath]];
475 |
476 | NSMutableArray *arguments = [NSMutableArray arrayWithObjects:@"-fs", [certComboBox objectValue], nil];
477 | NSDictionary *systemVersionDictionary = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"];
478 | NSString * systemVersion = [systemVersionDictionary objectForKey:@"ProductVersion"];
479 | NSArray * version = [systemVersion componentsSeparatedByString:@"."];
480 | if ([version[0] intValue]<10 || ([version[0] intValue]==10 && ([version[1] intValue]<9 || ([version[1] intValue]==9 && [version[2] intValue]<5)))) {
481 |
482 | /*
483 | Before OSX 10.9, code signing requires a version 1 signature.
484 | The resource envelope is necessary.
485 | To ensure it is added, append the resource flag to the arguments.
486 | */
487 |
488 | NSString *resourceRulesPath = [[NSBundle mainBundle] pathForResource:@"ResourceRules" ofType:@"plist"];
489 | NSString *resourceRulesArgument = [NSString stringWithFormat:@"--resource-rules=%@",resourceRulesPath];
490 | [arguments addObject:resourceRulesArgument];
491 | } else {
492 |
493 | /*
494 | For OSX 10.9 and later, code signing requires a version 2 signature.
495 | The resource envelope is obsolete.
496 | To ensure it is ignored, remove the resource key from the Info.plist file.
497 | */
498 |
499 | NSString *infoPath = [NSString stringWithFormat:@"%@/Info.plist", filePath];
500 | NSMutableDictionary *infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:infoPath];
501 | [infoDict removeObjectForKey:@"CFBundleResourceSpecification"];
502 | [infoDict writeToFile:infoPath atomically:YES];
503 | [arguments addObject:@"--no-strict"]; // http://stackoverflow.com/a/26204757
504 | }
505 |
506 | if (![[entitlementField stringValue] isEqualToString:@""]) {
507 | [arguments addObject:[NSString stringWithFormat:@"--entitlements=%@", [entitlementField stringValue]]];
508 | }
509 |
510 | [arguments addObjectsFromArray:[NSArray arrayWithObjects:filePath, nil]];
511 |
512 | codesignTask = [[NSTask alloc] init];
513 | [codesignTask setLaunchPath:@"/usr/bin/codesign"];
514 | [codesignTask setArguments:arguments];
515 |
516 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkCodesigning:) userInfo:nil repeats:TRUE];
517 |
518 |
519 | NSPipe *pipe=[NSPipe pipe];
520 | [codesignTask setStandardOutput:pipe];
521 | [codesignTask setStandardError:pipe];
522 | NSFileHandle *handle=[pipe fileHandleForReading];
523 |
524 | [codesignTask launch];
525 |
526 | [NSThread detachNewThreadSelector:@selector(watchCodesigning:)
527 | toTarget:self withObject:handle];
528 | }
529 |
530 | - (void)watchCodesigning:(NSFileHandle*)streamHandle {
531 | @autoreleasepool {
532 |
533 | codesigningResult = [[NSString alloc] initWithData:[streamHandle readDataToEndOfFile] encoding:NSASCIIStringEncoding];
534 |
535 | }
536 | }
537 |
538 | - (void)checkCodesigning:(NSTimer *)timer {
539 | if ([codesignTask isRunning] == 0) {
540 | [timer invalidate];
541 | codesignTask = nil;
542 | if (frameworks.count > 0) {
543 | [self signFile:[frameworks lastObject]];
544 | [frameworks removeLastObject];
545 | } else if (hasFrameworks) {
546 | hasFrameworks = NO;
547 | [self signFile:appPath];
548 | } else {
549 | NSLog(@"Codesigning done");
550 | [statusLabel setStringValue:@"Codesigning completed"];
551 | [self doVerifySignature];
552 | }
553 | }
554 | }
555 |
556 | - (void)doVerifySignature {
557 | if (appPath) {
558 | verifyTask = [[NSTask alloc] init];
559 | [verifyTask setLaunchPath:@"/usr/bin/codesign"];
560 | [verifyTask setArguments:[NSArray arrayWithObjects:@"-v", appPath, nil]];
561 |
562 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkVerificationProcess:) userInfo:nil repeats:TRUE];
563 |
564 | NSLog(@"Verifying %@",appPath);
565 | [statusLabel setStringValue:[NSString stringWithFormat:@"Verifying %@",appName]];
566 |
567 | NSPipe *pipe=[NSPipe pipe];
568 | [verifyTask setStandardOutput:pipe];
569 | [verifyTask setStandardError:pipe];
570 | NSFileHandle *handle=[pipe fileHandleForReading];
571 |
572 | [verifyTask launch];
573 |
574 | [NSThread detachNewThreadSelector:@selector(watchVerificationProcess:)
575 | toTarget:self withObject:handle];
576 | }
577 | }
578 |
579 | - (void)watchVerificationProcess:(NSFileHandle*)streamHandle {
580 | @autoreleasepool {
581 |
582 | verificationResult = [[NSString alloc] initWithData:[streamHandle readDataToEndOfFile] encoding:NSASCIIStringEncoding];
583 |
584 | }
585 | }
586 |
587 | - (void)checkVerificationProcess:(NSTimer *)timer {
588 | if ([verifyTask isRunning] == 0) {
589 | [timer invalidate];
590 | verifyTask = nil;
591 | if ([verificationResult length] == 0) {
592 | NSLog(@"Verification done");
593 | [statusLabel setStringValue:@"Verification completed"];
594 | [self doZip];
595 | } else {
596 | NSString *error = [[codesigningResult stringByAppendingString:@"\n\n"] stringByAppendingString:verificationResult];
597 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Signing failed" AndMessage:error];
598 | [self enableControls];
599 | [statusLabel setStringValue:@"Please try again"];
600 | }
601 | }
602 | }
603 |
604 | - (void)doZip {
605 | if (appPath) {
606 | NSArray *destinationPathComponents = [sourcePath pathComponents];
607 | NSString *destinationPath = @"";
608 |
609 | for (int i = 0; i < ([destinationPathComponents count]-1); i++) {
610 | destinationPath = [destinationPath stringByAppendingPathComponent:[destinationPathComponents objectAtIndex:i]];
611 | }
612 |
613 | fileName = [sourcePath lastPathComponent];
614 | fileName = [fileName substringToIndex:([fileName length] - ([[sourcePath pathExtension] length] + 1))];
615 | fileName = [fileName stringByAppendingString:@"-resigned"];
616 | fileName = [fileName stringByAppendingPathExtension:@"ipa"];
617 |
618 | destinationPath = [destinationPath stringByAppendingPathComponent:fileName];
619 |
620 | NSLog(@"Dest: %@",destinationPath);
621 |
622 | zipTask = [[NSTask alloc] init];
623 | [zipTask setLaunchPath:@"/usr/bin/zip"];
624 | [zipTask setCurrentDirectoryPath:workingPath];
625 | [zipTask setArguments:[NSArray arrayWithObjects:@"-qry", destinationPath, @".", nil]];
626 |
627 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkZip:) userInfo:nil repeats:TRUE];
628 |
629 | NSLog(@"Zipping %@", destinationPath);
630 | [statusLabel setStringValue:[NSString stringWithFormat:@"Saving %@",fileName]];
631 |
632 | [zipTask launch];
633 | }
634 | }
635 |
636 | - (void)checkZip:(NSTimer *)timer {
637 | if ([zipTask isRunning] == 0) {
638 | [timer invalidate];
639 | zipTask = nil;
640 | NSLog(@"Zipping done");
641 | [statusLabel setStringValue:[NSString stringWithFormat:@"Saved %@",fileName]];
642 |
643 | [[NSFileManager defaultManager] removeItemAtPath:workingPath error:nil];
644 |
645 | [self enableControls];
646 |
647 | NSString *result = [[codesigningResult stringByAppendingString:@"\n\n"] stringByAppendingString:verificationResult];
648 | NSLog(@"Codesigning result: %@",result);
649 | }
650 | }
651 |
652 | - (IBAction)browse:(id)sender {
653 | NSOpenPanel* openDlg = [NSOpenPanel openPanel];
654 |
655 | [openDlg setCanChooseFiles:TRUE];
656 | [openDlg setCanChooseDirectories:FALSE];
657 | [openDlg setAllowsMultipleSelection:FALSE];
658 | [openDlg setAllowsOtherFileTypes:FALSE];
659 | [openDlg setAllowedFileTypes:@[@"ipa", @"IPA", @"xcarchive"]];
660 |
661 | if ([openDlg runModal] == NSOKButton)
662 | {
663 | NSString* fileNameOpened = [[[openDlg URLs] objectAtIndex:0] path];
664 | [pathField setStringValue:fileNameOpened];
665 | }
666 | }
667 |
668 | - (IBAction)provisioningBrowse:(id)sender {
669 | NSOpenPanel* openDlg = [NSOpenPanel openPanel];
670 |
671 | [openDlg setCanChooseFiles:TRUE];
672 | [openDlg setCanChooseDirectories:FALSE];
673 | [openDlg setAllowsMultipleSelection:FALSE];
674 | [openDlg setAllowsOtherFileTypes:FALSE];
675 | [openDlg setAllowedFileTypes:@[@"mobileprovision", @"MOBILEPROVISION"]];
676 |
677 | if ([openDlg runModal] == NSOKButton)
678 | {
679 | NSString* fileNameOpened = [[[openDlg URLs] objectAtIndex:0] path];
680 | [provisioningPathField setStringValue:fileNameOpened];
681 | }
682 | }
683 |
684 | - (IBAction)entitlementBrowse:(id)sender {
685 | NSOpenPanel* openDlg = [NSOpenPanel openPanel];
686 |
687 | [openDlg setCanChooseFiles:TRUE];
688 | [openDlg setCanChooseDirectories:FALSE];
689 | [openDlg setAllowsMultipleSelection:FALSE];
690 | [openDlg setAllowsOtherFileTypes:FALSE];
691 | [openDlg setAllowedFileTypes:@[@"plist", @"PLIST"]];
692 |
693 | if ([openDlg runModal] == NSOKButton)
694 | {
695 | NSString* fileNameOpened = [[[openDlg URLs] objectAtIndex:0] path];
696 | [entitlementField setStringValue:fileNameOpened];
697 | }
698 | }
699 |
700 | - (IBAction)changeBundleIDPressed:(id)sender {
701 |
702 | if (sender != changeBundleIDCheckbox) {
703 | return;
704 | }
705 |
706 | bundleIDField.enabled = changeBundleIDCheckbox.state == NSOnState;
707 | }
708 |
709 | - (void)disableControls {
710 | [pathField setEnabled:FALSE];
711 | [entitlementField setEnabled:FALSE];
712 | [browseButton setEnabled:FALSE];
713 | [resignButton setEnabled:FALSE];
714 | [provisioningBrowseButton setEnabled:NO];
715 | [provisioningPathField setEnabled:NO];
716 | [changeBundleIDCheckbox setEnabled:NO];
717 | [bundleIDField setEnabled:NO];
718 | [certComboBox setEnabled:NO];
719 |
720 | [flurry startAnimation:self];
721 | [flurry setAlphaValue:1.0];
722 | }
723 |
724 | - (void)enableControls {
725 | [pathField setEnabled:TRUE];
726 | [entitlementField setEnabled:TRUE];
727 | [browseButton setEnabled:TRUE];
728 | [resignButton setEnabled:TRUE];
729 | [provisioningBrowseButton setEnabled:YES];
730 | [provisioningPathField setEnabled:YES];
731 | [changeBundleIDCheckbox setEnabled:YES];
732 | [bundleIDField setEnabled:changeBundleIDCheckbox.state == NSOnState];
733 | [certComboBox setEnabled:YES];
734 |
735 | [flurry stopAnimation:self];
736 | [flurry setAlphaValue:0.5];
737 | }
738 |
739 | -(NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox {
740 | NSInteger count = 0;
741 | if ([aComboBox isEqual:certComboBox]) {
742 | count = [certComboBoxItems count];
743 | }
744 | return count;
745 | }
746 |
747 | - (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index {
748 | id item = nil;
749 | if ([aComboBox isEqual:certComboBox]) {
750 | item = [certComboBoxItems objectAtIndex:index];
751 | }
752 | return item;
753 | }
754 |
755 | - (void)getCerts {
756 |
757 | getCertsResult = nil;
758 |
759 | NSLog(@"Getting Certificate IDs");
760 | [statusLabel setStringValue:@"Getting Signing Certificate IDs"];
761 |
762 | certTask = [[NSTask alloc] init];
763 | [certTask setLaunchPath:@"/usr/bin/security"];
764 | [certTask setArguments:[NSArray arrayWithObjects:@"find-identity", @"-v", @"-p", @"codesigning", nil]];
765 |
766 | [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkCerts:) userInfo:nil repeats:TRUE];
767 |
768 | NSPipe *pipe=[NSPipe pipe];
769 | [certTask setStandardOutput:pipe];
770 | [certTask setStandardError:pipe];
771 | NSFileHandle *handle=[pipe fileHandleForReading];
772 |
773 | [certTask launch];
774 |
775 | [NSThread detachNewThreadSelector:@selector(watchGetCerts:) toTarget:self withObject:handle];
776 | }
777 |
778 | - (void)watchGetCerts:(NSFileHandle*)streamHandle {
779 | @autoreleasepool {
780 |
781 | NSString *securityResult = [[NSString alloc] initWithData:[streamHandle readDataToEndOfFile] encoding:NSASCIIStringEncoding];
782 | // Verify the security result
783 | if (securityResult == nil || securityResult.length < 1) {
784 | // Nothing in the result, return
785 | return;
786 | }
787 | NSArray *rawResult = [securityResult componentsSeparatedByString:@"\""];
788 | NSMutableArray *tempGetCertsResult = [NSMutableArray arrayWithCapacity:20];
789 | for (int i = 0; i <= [rawResult count] - 2; i+=2) {
790 |
791 | NSLog(@"i:%d", i+1);
792 | if (rawResult.count - 1 < i + 1) {
793 | // Invalid array, don't add an object to that position
794 | } else {
795 | // Valid object
796 | [tempGetCertsResult addObject:[rawResult objectAtIndex:i+1]];
797 | }
798 | }
799 |
800 | certComboBoxItems = [NSMutableArray arrayWithArray:tempGetCertsResult];
801 |
802 | [certComboBox reloadData];
803 |
804 | }
805 | }
806 |
807 | - (void)checkCerts:(NSTimer *)timer {
808 | if ([certTask isRunning] == 0) {
809 | [timer invalidate];
810 | certTask = nil;
811 |
812 | if ([certComboBoxItems count] > 0) {
813 | NSLog(@"Get Certs done");
814 | [statusLabel setStringValue:@"Signing Certificate IDs extracted"];
815 |
816 | if ([defaults valueForKey:@"CERT_INDEX"]) {
817 |
818 | NSInteger selectedIndex = [[defaults valueForKey:@"CERT_INDEX"] integerValue];
819 | if (selectedIndex != -1) {
820 | NSString *selectedItem = [self comboBox:certComboBox objectValueForItemAtIndex:selectedIndex];
821 | [certComboBox setObjectValue:selectedItem];
822 | [certComboBox selectItemAtIndex:selectedIndex];
823 | }
824 |
825 | [self enableControls];
826 | }
827 | } else {
828 | [self showAlertOfKind:NSCriticalAlertStyle WithTitle:@"Error" AndMessage:@"Getting Certificate ID's failed"];
829 | [self enableControls];
830 | [statusLabel setStringValue:@"Ready"];
831 | }
832 | }
833 | }
834 |
835 | // If the application dock icon is clicked, reopen the window
836 | - (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag {
837 | // Make sure the window is visible
838 | if (![self.window isVisible]) {
839 | // Window isn't shown, show it
840 | [self.window makeKeyAndOrderFront:self];
841 | }
842 |
843 | // Return YES
844 | return YES;
845 | }
846 |
847 | #pragma mark - Alert Methods
848 |
849 | /* NSRunAlerts are being deprecated in 10.9 */
850 |
851 | // Show a critical alert
852 | - (void)showAlertOfKind:(NSAlertStyle)style WithTitle:(NSString *)title AndMessage:(NSString *)message {
853 | NSAlert *alert = [[NSAlert alloc] init];
854 | [alert addButtonWithTitle:@"OK"];
855 | [alert setMessageText:title];
856 | [alert setInformativeText:message];
857 | [alert setAlertStyle:style];
858 | [alert runModal];
859 | }
860 |
861 | @end
862 |
--------------------------------------------------------------------------------
/iReSign/iReSign/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // iReSign
4 | //
5 | // Created by Maciej Swic on 2011-05-16.
6 | // Copyright (c) 2011 Maciej Swic, Licensed under the MIT License.
7 | // See README.md for details
8 | //
9 |
10 | #import
11 |
12 | int main(int argc, char *argv[])
13 | {
14 | return NSApplicationMain(argc, (const char **)argv);
15 | }
16 |
--------------------------------------------------------------------------------
/iReSign/iReSign/zh-Hans.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Localized versions of Info.plist keys */
2 |
3 |
--------------------------------------------------------------------------------
/iReSign/iReSign/zh-Hans.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
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 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
146 |
158 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
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 |
270 |
271 |
272 |
273 | iReSign 允许您使用自己的苹果开发者证书重新签名任何未加密的ipa文件,只要遵循如下操作:
274 |
275 | 1. 使用 “浏览” 按键找到需要签名的ipa或者输入需要签名的ipa文件路径。
276 |
277 | 2. 在 “钥匙串访问” 中找到证书全名,如 iPhone Developer: Firstname Lastname (XXXXXXXXXX)
278 |
279 | 3. 点击 “重新签名!" 并等待。 经过重新签名的文件将和原文件放置在同一目录下。
280 |
281 |
282 |
283 |
284 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
--------------------------------------------------------------------------------