├── .gitignore ├── Classes ├── AppDelegate.h ├── AppDelegate.mm ├── iPAFine.h └── iPAFine.mm ├── README.md ├── Release └── IPAFine.app.zip ├── Resources ├── Credits.rtf ├── Icon.icns ├── Info.plist ├── MainMenu.xib └── ResourceRules.plist ├── Sources ├── Main.m └── Prefix.pch └── iPAFine.xcodeproj └── project.pbxproj /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | *.xcuserdatad 3 | *.xcworkspace 4 | Extras 5 | 6 | 7 | .DS_Store 8 | -------------------------------------------------------------------------------- /Classes/AppDelegate.h: -------------------------------------------------------------------------------- 1 | 2 | 3 | #import 4 | 5 | // 6 | @interface AppDelegate : NSObject 7 | { 8 | NSUserDefaults *defaults; 9 | 10 | IBOutlet NSTextField *pathField; 11 | IBOutlet NSTextField *provField; 12 | IBOutlet NSTextField *certField; 13 | IBOutlet NSTextField *dylibField; 14 | 15 | IBOutlet NSButton *browseButton; 16 | IBOutlet NSButton *browseProvButton; 17 | IBOutlet NSButton *resignButton; 18 | IBOutlet NSProgressIndicator *flurry; 19 | } 20 | 21 | @property (assign) IBOutlet NSWindow *window; 22 | 23 | - (IBAction)resign:(id)sender; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Classes/AppDelegate.mm: -------------------------------------------------------------------------------- 1 | 2 | 3 | #import "AppDelegate.h" 4 | #import "iPAFine.h" 5 | 6 | @implementation AppDelegate 7 | @synthesize window; 8 | 9 | // 10 | - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender 11 | { 12 | return YES; 13 | } 14 | 15 | // 16 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 17 | { 18 | [flurry setAlphaValue:0.5]; 19 | defaults = [NSUserDefaults standardUserDefaults]; 20 | 21 | if ([defaults valueForKey:@"IPA_PATH"]) 22 | [pathField setStringValue:[defaults valueForKey:@"IPA_PATH"]]; 23 | if ([defaults valueForKey:@"DYLIB_PATH"]) 24 | [dylibField setStringValue:[defaults valueForKey:@"DYLIB_PATH"]]; 25 | if ([defaults valueForKey:@"CERT_NAME"]) 26 | [certField setStringValue:[defaults valueForKey:@"CERT_NAME"]]; 27 | if ([defaults valueForKey:@"MOBILEPROVISION_PATH"]) 28 | [provField setStringValue:[defaults valueForKey:@"MOBILEPROVISION_PATH"]]; 29 | 30 | if (![[NSFileManager defaultManager] fileExistsAtPath:@"/usr/bin/zip"]) 31 | { 32 | NSRunAlertPanel(@"Error", 33 | @"This app cannot run without the zip utility present at /usr/bin/zip", 34 | @"OK",nil,nil); 35 | exit(0); 36 | } 37 | if (![[NSFileManager defaultManager] fileExistsAtPath:@"/usr/bin/unzip"]) 38 | { 39 | NSRunAlertPanel(@"Error", 40 | @"This app cannot run without the unzip utility present at /usr/bin/unzip", 41 | @"OK",nil,nil); 42 | exit(0); 43 | } 44 | if (![[NSFileManager defaultManager] fileExistsAtPath:@"/usr/bin/codesign"]) 45 | { 46 | NSRunAlertPanel(@"Error", 47 | @"This app cannot run without the codesign utility present at /usr/bin/codesign", 48 | @"OK",nil, nil); 49 | exit(0); 50 | } 51 | } 52 | 53 | // 54 | - (IBAction)browse:(id)sender 55 | { 56 | NSOpenPanel* openDlg = [NSOpenPanel openPanel]; 57 | 58 | [openDlg setCanChooseFiles:TRUE]; 59 | [openDlg setCanChooseDirectories:TRUE]; 60 | [openDlg setAllowsMultipleSelection:FALSE]; 61 | [openDlg setAllowsOtherFileTypes:FALSE]; 62 | 63 | if ( [openDlg runModalForTypes:@[@"ipa", @"dylib"]] == NSOKButton ) 64 | { 65 | NSString* fileNameOpened = [[openDlg filenames] objectAtIndex:0]; 66 | [pathField setStringValue:fileNameOpened]; 67 | } 68 | } 69 | 70 | // 71 | - (IBAction)browseProv:(id)sender 72 | { 73 | NSOpenPanel* openDlg = [NSOpenPanel openPanel]; 74 | 75 | [openDlg setCanChooseFiles:TRUE]; 76 | [openDlg setCanChooseDirectories:FALSE]; 77 | [openDlg setAllowsMultipleSelection:FALSE]; 78 | [openDlg setAllowsOtherFileTypes:FALSE]; 79 | 80 | if ( [openDlg runModalForTypes:[NSArray arrayWithObject:@"mobileprovision"]] == NSOKButton ) 81 | { 82 | NSString* fileNameOpened = [[openDlg filenames] objectAtIndex:0]; 83 | [provField setStringValue:fileNameOpened]; 84 | } 85 | } 86 | 87 | // 88 | - (IBAction)browseDylib:(id)sender 89 | { 90 | NSOpenPanel* openDlg = [NSOpenPanel openPanel]; 91 | 92 | [openDlg setCanChooseFiles:TRUE]; 93 | [openDlg setCanChooseDirectories:FALSE]; 94 | [openDlg setAllowsMultipleSelection:FALSE]; 95 | [openDlg setAllowsOtherFileTypes:FALSE]; 96 | 97 | if ( [openDlg runModalForTypes:[NSArray arrayWithObject:@"dylib"]] == NSOKButton ) 98 | { 99 | NSString* fileNameOpened = [[openDlg filenames] objectAtIndex:0]; 100 | [dylibField setStringValue:fileNameOpened]; 101 | } 102 | } 103 | 104 | // 105 | - (IBAction)showHelp:(id)sender 106 | { 107 | NSRunAlertPanel(@"How to use iReSign", 108 | @"iReSign allows you to re-sign any unencrypted ipa-file with any certificate for which you hold the corresponding private key.\n\n1. Drag your unsigned .ipa file to the top box, or use the browse button.\n\n2. Enter your full certificate name from Keychain Access, for example \"iPhone Developer: Firstname Lastname (XXXXXXXXXX)\" in the bottom box.\n\n3. Click ReSign! and wait. The resigned file will be saved in the same folder as the original file.", 109 | @"OK",nil, nil); 110 | } 111 | 112 | // 113 | - (IBAction)resign:(id)sender 114 | { 115 | [defaults setValue:[pathField stringValue] forKey:@"IPA_PATH"]; 116 | [defaults setValue:[dylibField stringValue] forKey:@"DYLIB_PATH"]; 117 | [defaults setValue:[certField stringValue] forKey:@"CERT_NAME"]; 118 | [defaults setValue:[provField stringValue] forKey:@"MOBILEPROVISION_PATH"]; 119 | [defaults synchronize]; 120 | 121 | [pathField setEnabled:FALSE]; 122 | [certField setEnabled:FALSE]; 123 | [browseButton setEnabled:FALSE]; 124 | [resignButton setEnabled:FALSE]; 125 | 126 | [flurry startAnimation:self]; 127 | 128 | [self performSelectorInBackground:@selector(resignThread) withObject:nil]; 129 | } 130 | 131 | // 132 | - (void)resignThread 133 | { 134 | @autoreleasepool 135 | { 136 | NSString *error = [[[iPAFine alloc] init] refine:pathField.stringValue 137 | dylibPath:dylibField.stringValue 138 | certName:certField.stringValue 139 | provPath:provField.stringValue]; 140 | [self performSelectorOnMainThread:@selector(resignDone:) withObject:error waitUntilDone:YES]; 141 | } 142 | } 143 | 144 | // 145 | - (void)resignDone:(NSString *)error 146 | { 147 | [pathField setEnabled:TRUE]; 148 | [certField setEnabled:TRUE]; 149 | [browseButton setEnabled:TRUE]; 150 | [resignButton setEnabled:TRUE]; 151 | 152 | [flurry stopAnimation:self]; 153 | 154 | if (error) 155 | { 156 | NSRunAlertPanel(@"Error", error, @"OK",nil, nil); 157 | } 158 | } 159 | 160 | @end 161 | -------------------------------------------------------------------------------- /Classes/iPAFine.h: -------------------------------------------------------------------------------- 1 | 2 | 3 | #import 4 | 5 | // 6 | @interface iPAFine : NSObject 7 | { 8 | NSString *_error; 9 | } 10 | 11 | - (NSString *)refine:(NSString *)ipaPath dylibPath:(NSString *)dylibPath certName:(NSString *)certName provPath:(NSString *)provPath; 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Classes/iPAFine.mm: -------------------------------------------------------------------------------- 1 | 2 | 3 | #import "iPAFine.h" 4 | #include 5 | #include 6 | 7 | @implementation iPAFine 8 | 9 | // 10 | - (NSString *)doTask:(NSString *)path arguments:(NSArray *)arguments currentDirectory:(NSString *)currentDirectory 11 | { 12 | NSTask *task = [[NSTask alloc] init]; 13 | task.launchPath = path; 14 | task.arguments = arguments; 15 | if (currentDirectory) task.currentDirectoryPath = currentDirectory; 16 | 17 | NSPipe *pipe = [NSPipe pipe]; 18 | task.standardOutput = pipe; 19 | task.standardError = pipe; 20 | 21 | NSFileHandle *file = [pipe fileHandleForReading]; 22 | 23 | [task launch]; 24 | 25 | NSData *data = [file readDataToEndOfFile]; 26 | NSString *result = data.length ? [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] : nil; 27 | 28 | //NSLog(@"CMD:\n%@\n%@ARG\n\n%@\n\n", path, arguments, (result ? result : @"")); 29 | return result; 30 | } 31 | 32 | 33 | // 34 | - (NSString *)doTask:(NSString *)path arguments:(NSArray *)arguments 35 | { 36 | return [self doTask:path arguments:arguments currentDirectory:nil]; 37 | } 38 | 39 | // 40 | - (NSString *)unzipIPA:(NSString *)ipaPath workPath:(NSString *)workPath 41 | { 42 | NSString *result = [self doTask:@"/usr/bin/unzip" arguments:[NSArray arrayWithObjects:@"-q", ipaPath, @"-d", workPath, nil]]; 43 | NSString *payloadPath = [workPath stringByAppendingPathComponent:@"Payload"]; 44 | if ([[NSFileManager defaultManager] fileExistsAtPath:payloadPath]) 45 | { 46 | NSArray *dirs = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:payloadPath error:nil]; 47 | for (NSString *dir in dirs) 48 | { 49 | if ([dir.pathExtension.lowercaseString isEqualToString:@"app"]) 50 | { 51 | return [payloadPath stringByAppendingPathComponent:dir]; 52 | } 53 | } 54 | _error = @"Invalid app"; 55 | return nil; 56 | } 57 | _error = [@"Unzip failed:" stringByAppendingString:result ? result : @""]; 58 | return nil; 59 | } 60 | 61 | - (uint32_t)bigEndianToSmallEndian:(uint32_t)bigEndian 62 | { 63 | uint32_t smallEndian = 0; 64 | unsigned char *small = (unsigned char *)&smallEndian; 65 | unsigned char *big = (unsigned char *)&bigEndian; 66 | for (int i=0; i<4; i++) 67 | { 68 | small[i] = big[3-i]; 69 | } 70 | return smallEndian; 71 | } 72 | 73 | // 74 | - (void)stripApp:(NSString *)appPath 75 | { 76 | // Find executable 77 | NSString *infoPath = [appPath stringByAppendingPathComponent:@"Info.plist"]; 78 | NSMutableDictionary *info = [NSMutableDictionary dictionaryWithContentsOfFile:infoPath]; 79 | NSString *exeName = [info objectForKey:@"CFBundleExecutable"]; 80 | if (exeName == nil) 81 | { 82 | _error = @"Strip failed: No CFBundleExecutable"; 83 | return; 84 | } 85 | NSString *exePath = [appPath stringByAppendingPathComponent:exeName]; 86 | 87 | NSString *result = [self doTask:@"/usr/bin/lipo" arguments:[NSArray arrayWithObjects:@"-info", exePath, nil]]; 88 | 89 | if (([result rangeOfString:@"armv6 armv7"].location == NSNotFound) && ([result rangeOfString:@"armv7 armv6"].location == NSNotFound)) 90 | { 91 | return; 92 | } 93 | 94 | NSString *newPath = [exePath stringByAppendingString:@"NEW"]; 95 | result = [self doTask:@"/usr/bin/lipo" arguments:[NSArray arrayWithObjects:@"-remove", @"armv6", @"-output", newPath, exePath, nil]]; 96 | if (result.length) 97 | { 98 | _error = [@"Strip failed:" stringByAppendingString:result]; 99 | } 100 | 101 | NSError *error = nil; 102 | BOOL ret = [[NSFileManager defaultManager] removeItemAtPath:exePath error:&error] && [[NSFileManager defaultManager] moveItemAtPath:newPath toPath:exePath error:&error]; 103 | if (!ret) 104 | { 105 | _error = [@"Strip failed:" stringByAppendingString:error.localizedDescription]; 106 | } 107 | } 108 | 109 | // 110 | - (NSString *)renameApp:(NSString *)appPath ipaPath:(NSString *)ipaPath 111 | { 112 | // 获取显示名称 113 | NSString *DISPNAME = ipaPath.lastPathComponent.stringByDeletingPathExtension; 114 | 115 | if ([DISPNAME hasPrefix:@"iOS."]) DISPNAME = [DISPNAME substringFromIndex:4]; 116 | else if ([DISPNAME hasPrefix:@"iPad."]) DISPNAME = [DISPNAME substringFromIndex:5]; 117 | else if ([DISPNAME hasPrefix:@"iPhone."]) DISPNAME = [DISPNAME substringFromIndex:7]; 118 | 119 | NSRange range = [DISPNAME rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"_- .((["]]; 120 | if (range.location != NSNotFound) 121 | { 122 | DISPNAME = [DISPNAME substringToIndex:range.location]; 123 | } 124 | 125 | if ([DISPNAME hasSuffix:@"HD"]) DISPNAME = [DISPNAME substringToIndex:DISPNAME.length - 2]; 126 | 127 | // 128 | NSString *infoPath = [appPath stringByAppendingPathComponent:@"Info.plist"]; 129 | NSMutableDictionary *info = [NSMutableDictionary dictionaryWithContentsOfFile:infoPath]; 130 | 131 | // 获取程序类型 132 | NSArray *devices = [info objectForKey:@"UIDeviceFamily"]; 133 | NSUInteger family = 0; 134 | for (id device in devices) family += [device intValue]; 135 | NSString *PREFIX = (family == 3) ? @"iOS" : ((family == 2) ? @"iPad" : @"iPhone"); 136 | 137 | // 修改显示名称 138 | [info setObject:DISPNAME forKey:@"CFBundleDisplayName"]; 139 | [info writeToFile:infoPath atomically:YES]; 140 | 141 | static const NSString *langs[] = {@"zh-Hans", @"zh_Hans", @"zh_CN", @"zh-CN", @"zh"}; 142 | for (NSUInteger i = 0; i < sizeof(langs) / sizeof(langs[0]); i++) 143 | { 144 | NSString *localizePath = [appPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.lproj/InfoPlist.strings", langs[i]]]; 145 | if ([[NSFileManager defaultManager] fileExistsAtPath:localizePath]) 146 | { 147 | NSMutableDictionary *localize = [NSMutableDictionary dictionaryWithContentsOfFile:localizePath]; 148 | [localize removeObjectForKey:@"CFBundleDisplayName"]; 149 | [localize writeToFile:localizePath atomically:YES]; 150 | } 151 | } 152 | 153 | // 修改 iTunes 项目名称 154 | NSString *metaPath = [[[appPath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"iTunesMetadata.plist"]; 155 | NSMutableDictionary *meta = [NSMutableDictionary dictionaryWithContentsOfFile:metaPath]; 156 | if (meta == nil) meta = [NSMutableDictionary dictionary]; 157 | { 158 | [meta setObject:DISPNAME forKey:@"playlistName"]; 159 | [meta setObject:DISPNAME forKey:@"itemName"]; 160 | [meta writeToFile:metaPath atomically:YES]; 161 | } 162 | 163 | // 164 | /*NSString *VERSION = meta ? [meta objectForKey:@"bundleShortVersionString"] : nil; 165 | if (VERSION.length == 0) VERSION = [info objectForKey:@"CFBundleVersion"]; 166 | if (VERSION.length == 0) VERSION = [info objectForKey:@"CFBundleShortVersionString"];*/ 167 | 168 | return [NSString stringWithFormat:@"%@/%@.%@.ipa", ipaPath.stringByDeletingLastPathComponent, PREFIX, DISPNAME/*, VERSION*/]; 169 | } 170 | 171 | // 172 | - (void)checkProv:(NSString *)appPath provPath:(NSString *)provPath 173 | { 174 | // Check 175 | NSString *embeddedProvisioning = [NSString stringWithContentsOfFile:provPath encoding:NSASCIIStringEncoding error:nil]; 176 | NSArray* embeddedProvisioningLines = [embeddedProvisioning componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; 177 | for (int i = 0; i <= [embeddedProvisioningLines count]; i++) 178 | { 179 | if ([[embeddedProvisioningLines objectAtIndex:i] rangeOfString:@"application-identifier"].location != NSNotFound) 180 | { 181 | NSInteger fromPosition = [[embeddedProvisioningLines objectAtIndex:i+1] rangeOfString:@""].location + 8; 182 | NSInteger toPosition = [[embeddedProvisioningLines objectAtIndex:i+1] rangeOfString:@""].location; 183 | 184 | NSRange range; 185 | range.location = fromPosition; 186 | range.length = toPosition - fromPosition; 187 | 188 | NSString *identifier = [[embeddedProvisioningLines objectAtIndex:i+1] substringWithRange:range]; 189 | if (![identifier hasSuffix:@".*"]) 190 | { 191 | NSRange range = [identifier rangeOfString:@"."]; 192 | if (range.location != NSNotFound) identifier = [identifier substringFromIndex:range.location + 1]; 193 | 194 | NSDictionary *info = [NSDictionary dictionaryWithContentsOfFile:[appPath stringByAppendingPathComponent:@"Info.plist"]]; 195 | if (![[info objectForKey:@"CFBundleIdentifier"] isEqualToString:identifier]) 196 | { 197 | _error = @"Identifiers match"; 198 | return; 199 | } 200 | } 201 | return; 202 | } 203 | } 204 | _error = @"Invalid prov"; 205 | } 206 | 207 | // 208 | - (void)injectArchitecture:(int)fd dylibPath:(NSString *)dylibPath exePath:(NSString *)exePathForInfoOnly 209 | { 210 | off_t archPoint = lseek(fd, 0, SEEK_CUR); 211 | struct mach_header header; 212 | read(fd, &header, sizeof(header)); 213 | if (header.magic != MH_MAGIC && header.magic != MH_MAGIC_64) 214 | { 215 | _error = [NSString stringWithFormat:@"Inject failed: Invalid executable %@", exePathForInfoOnly]; 216 | } 217 | else 218 | { 219 | if (header.magic == MH_MAGIC_64) 220 | { 221 | int delta = sizeof(mach_header_64) - sizeof(mach_header); 222 | lseek(fd, delta, SEEK_CUR); 223 | } 224 | 225 | char *buffer = (char *)malloc(header.sizeofcmds + 2048); 226 | read(fd, buffer, header.sizeofcmds); 227 | 228 | if ([[NSFileManager defaultManager] fileExistsAtPath:dylibPath]) 229 | { 230 | dylibPath = [@"@executable_path" stringByAppendingPathComponent:[dylibPath lastPathComponent]]; 231 | } 232 | const char *dylib = dylibPath.UTF8String; 233 | struct dylib_command *p = (struct dylib_command *)buffer; 234 | struct dylib_command *last = NULL; 235 | for (uint32_t i = 0; i < header.ncmds; i++, p = (struct dylib_command *)((char *)p + p->cmdsize)) 236 | { 237 | if (p->cmd == LC_LOAD_DYLIB || p->cmd == LC_LOAD_WEAK_DYLIB) 238 | { 239 | char *name = (char *)p + p->dylib.name.offset; 240 | if (strcmp(dylib, name) == 0) 241 | { 242 | NSLog(@"Already Injected: %@ with %s", exePathForInfoOnly, dylib); 243 | close(fd); 244 | return; 245 | } 246 | last = p; 247 | } 248 | } 249 | 250 | if ((char *)p - buffer != header.sizeofcmds) 251 | { 252 | NSLog(@"LC payload not mismatch: %@", exePathForInfoOnly); 253 | } 254 | 255 | if (last) 256 | { 257 | struct dylib_command *inject = (struct dylib_command *)((char *)last + last->cmdsize); 258 | char *movefrom = (char *)inject; 259 | uint32_t cmdsize = sizeof(*inject) + (uint32_t)strlen(dylib) + 1; 260 | cmdsize = (cmdsize + 0x10) & 0xFFFFFFF0; 261 | char *moveout = (char *)inject + cmdsize; 262 | for (int i = (int)(header.sizeofcmds - (movefrom - buffer) - 1); i >= 0; i--) 263 | { 264 | moveout[i] = movefrom[i]; 265 | } 266 | memset(inject, 0, cmdsize); 267 | inject->cmd = LC_LOAD_DYLIB; 268 | inject->cmdsize = cmdsize; 269 | inject->dylib.name.offset = sizeof(dylib_command); 270 | inject->dylib.timestamp = 2; 271 | inject->dylib.current_version = 0x00010000; 272 | inject->dylib.compatibility_version = 0x00010000; 273 | strcpy((char *)inject + inject->dylib.name.offset, dylib); 274 | 275 | header.ncmds++; 276 | header.sizeofcmds += inject->cmdsize; 277 | lseek(fd, archPoint, SEEK_SET); 278 | write(fd, &header, sizeof(header)); 279 | 280 | lseek(fd, archPoint + ((header.magic == MH_MAGIC_64) ? sizeof(mach_header_64) : sizeof(mach_header)), SEEK_SET); 281 | write(fd, buffer, header.sizeofcmds); 282 | } 283 | else 284 | { 285 | _error = [NSString stringWithFormat:@"Inject failed: No valid LC_LOAD_DYLIB %@", exePathForInfoOnly]; 286 | } 287 | 288 | free(buffer); 289 | } 290 | } 291 | 292 | // 293 | - (void)injectMachO:(NSString *)exePath dylibPath:(NSString *)dylibPath 294 | { 295 | int fd = open(exePath.UTF8String, O_RDWR, 0777); 296 | if (fd < 0) 297 | { 298 | _error = [NSString stringWithFormat:@"Inject failed: failed to open %@", exePath]; 299 | return; 300 | } 301 | else 302 | { 303 | uint32_t magic; 304 | read(fd, &magic, sizeof(magic)); 305 | if (magic == MH_MAGIC || magic == MH_MAGIC_64) 306 | { 307 | lseek(fd, 0, SEEK_SET); 308 | [self injectArchitecture:fd dylibPath:dylibPath exePath:exePath]; 309 | } 310 | else if (magic == FAT_MAGIC || magic == FAT_CIGAM) 311 | { 312 | struct fat_header header; 313 | lseek(fd, 0, SEEK_SET); 314 | read(fd, &header, sizeof(fat_header)); 315 | int nArch = header.nfat_arch; 316 | if (magic == FAT_CIGAM) nArch = [self bigEndianToSmallEndian:header.nfat_arch]; 317 | 318 | struct fat_arch arch; 319 | NSMutableArray *offsetArray = [NSMutableArray array]; 320 | for (int i = 0; i < nArch; i++) 321 | { 322 | memset(&arch, 0, sizeof(fat_arch)); 323 | read(fd, &arch, sizeof(fat_arch)); 324 | int offset = arch.offset; 325 | if (magic == FAT_CIGAM) offset = [self bigEndianToSmallEndian:arch.offset]; 326 | [offsetArray addObject:[NSNumber numberWithUnsignedInt:offset]]; 327 | } 328 | 329 | for (NSNumber *offsetNum in offsetArray) 330 | { 331 | lseek(fd, [offsetNum unsignedIntValue], SEEK_SET); 332 | [self injectArchitecture:fd dylibPath:dylibPath exePath:exePath]; 333 | // if (_error) 334 | // break; 335 | } 336 | } 337 | 338 | close(fd); 339 | } 340 | } 341 | 342 | // 343 | - (void)injectApp:(NSString *)appPath dylibPath:(NSString *)dylibPath 344 | { 345 | if (dylibPath.length) 346 | { 347 | if ([[NSFileManager defaultManager] fileExistsAtPath:dylibPath]) 348 | { 349 | NSString *targetPath = [appPath stringByAppendingPathComponent:[dylibPath lastPathComponent]]; 350 | if ([[NSFileManager defaultManager] fileExistsAtPath:targetPath]) 351 | { 352 | [[NSFileManager defaultManager] removeItemAtPath:targetPath error:nil]; 353 | } 354 | 355 | NSString *result = [self doTask:@"/bin/cp" arguments:[NSArray arrayWithObjects:dylibPath, targetPath, nil]]; 356 | if (![[NSFileManager defaultManager] fileExistsAtPath:targetPath]) 357 | { 358 | _error = [@"Failed to copy dylib file: " stringByAppendingString:result ? result : @""]; 359 | } 360 | } 361 | 362 | // Find executable 363 | NSString *infoPath = [appPath stringByAppendingPathComponent:@"Info.plist"]; 364 | NSMutableDictionary *info = [NSMutableDictionary dictionaryWithContentsOfFile:infoPath]; 365 | NSString *exeName = [info objectForKey:@"CFBundleExecutable"]; 366 | if (exeName == nil) 367 | { 368 | _error = [NSString stringWithFormat:@"Inject failed: No CFBundleExecutable on %@", infoPath]; 369 | return; 370 | } 371 | NSString *exePath = [appPath stringByAppendingPathComponent:exeName]; 372 | [self injectMachO:exePath dylibPath:dylibPath]; 373 | } 374 | } 375 | 376 | // 377 | - (void)provApp:(NSString *)appPath provPath:(NSString *)provPath 378 | { 379 | NSString *targetPath = [appPath stringByAppendingPathComponent:@"embedded.mobileprovision"]; 380 | if ([[NSFileManager defaultManager] fileExistsAtPath:targetPath]) 381 | { 382 | //NSLog(@"Found embedded.mobileprovision, deleting."); 383 | [[NSFileManager defaultManager] removeItemAtPath:targetPath error:nil]; 384 | } 385 | 386 | if (provPath.length) 387 | { 388 | NSString *result = [self doTask:@"/bin/cp" arguments:[NSArray arrayWithObjects:provPath, targetPath, nil]]; 389 | if (![[NSFileManager defaultManager] fileExistsAtPath:targetPath]) 390 | { 391 | _error = [@"Failed to copy provisioning file: " stringByAppendingString:result ?: @""]; 392 | } 393 | } 394 | } 395 | 396 | // 397 | - (void)signApp:(NSString *)appPath certName:(NSString *)certName 398 | { 399 | if (certName.length) 400 | { 401 | BOOL isDir; 402 | if ([[NSFileManager defaultManager] fileExistsAtPath:appPath isDirectory:&isDir] && isDir) 403 | { 404 | // 生成 application-identifier entitlements 405 | NSString *infoPath = [appPath stringByAppendingPathComponent:@"Info.plist"]; 406 | NSDictionary *info = [NSDictionary dictionaryWithContentsOfFile:infoPath]; 407 | NSString *bundleID = info[@"CFBundleIdentifier"]; 408 | 409 | //security find-certificate -c "iPhone Developer: Qian Wu (V569CJEC8A)" | grep \"subj\"\ | grep "\\\\0230\\\\021\\\\006\\\\003U\\\\004\\\\013\\\\014\\\\012" | sed 's/.*\\0230\\021\\006\\003U\\004\\013\\014\\012\(.\{10\}\).*/\1/' 410 | NSString *entitlementsPath = nil; 411 | NSString *certInfo = [self doTask:@"/usr/bin/security" arguments:@[@"find-certificate", @"-c", certName]]; 412 | NSRange range = [certInfo rangeOfString:@"\\0230\\021\\006\\003U\\004\\013\\014\\012"]; 413 | if (range.location != NSNotFound) 414 | { 415 | range.location += range.length; 416 | range.length = 10; 417 | NSString *teamID = [certInfo substringWithRange:range]; 418 | if (teamID) 419 | { 420 | NSDictionary *dict = @{@"application-identifier":[NSString stringWithFormat:@"%@.%@", teamID, bundleID], 421 | @"com.apple.developer.team-identifier":teamID}; 422 | entitlementsPath = [appPath.stringByDeletingLastPathComponent.stringByDeletingLastPathComponent.stringByDeletingLastPathComponent stringByAppendingFormat:@"/%@.xcent", bundleID]; 423 | [dict writeToFile:entitlementsPath atomically:YES]; 424 | } 425 | } 426 | 427 | // 428 | NSString *result1 = [self doTask:@"/usr/bin/codesign" arguments:[NSArray arrayWithObjects:@"-fs", certName, appPath, (entitlementsPath ? @"--entitlements" : nil), entitlementsPath, nil]]; 429 | if ([result1 rangeOfString:@"replacing existing signature"].location == NSNotFound) 430 | { 431 | NSString *result2 = [self doTask:@"/usr/bin/codesign" arguments:[NSArray arrayWithObjects:@"-v", appPath, nil]]; 432 | if (result2.length) 433 | { 434 | NSString *resourceRulesPath = [[NSBundle mainBundle] pathForResource:@"ResourceRules" ofType:@"plist"]; 435 | NSString *resourceRulesArgument = [NSString stringWithFormat:@"--resource-rules=%@",resourceRulesPath]; 436 | NSString *result3 = [self doTask:@"/usr/bin/codesign" arguments:[NSArray arrayWithObjects:@"-fs", certName, resourceRulesArgument, (entitlementsPath ? @"--entitlements" : nil), entitlementsPath, appPath, nil]]; 437 | if ([result3 rangeOfString:@"replacing existing signature"].location == NSNotFound) 438 | { 439 | NSString *result4 = [self doTask:@"/usr/bin/codesign" arguments:[NSArray arrayWithObjects:@"-v", appPath, nil]]; 440 | if (result4.length) 441 | { 442 | _error = [NSString stringWithFormat:@"Failed to sign %@\n\n%@\n\n%@\n\n%@\n\n%@", appPath, result1, result2, result3, result4]; 443 | } 444 | } 445 | } 446 | if (!_error) 447 | { 448 | [[NSFileManager defaultManager] removeItemAtPath:entitlementsPath error:nil]; 449 | } 450 | } 451 | } 452 | else 453 | { 454 | NSString *result1 = [self doTask:@"/usr/bin/codesign" arguments:[NSArray arrayWithObjects:@"-fs", certName, appPath, nil]]; 455 | if ([result1 rangeOfString:@"replacing existing signature"].location == NSNotFound) 456 | { 457 | NSString *result2 = [self doTask:@"/usr/bin/codesign" arguments:[NSArray arrayWithObjects:@"-v", appPath, nil]]; 458 | if (result2.length) 459 | { 460 | _error = [NSString stringWithFormat:@"Failed to sign %@\n\n%@\n\n%@", appPath, result1, result2]; 461 | } 462 | } 463 | } 464 | } 465 | } 466 | 467 | - (void)zipIPA:(NSString *)workPath outPath:(NSString *)outPath 468 | { 469 | //TODO: Current Dir Error 470 | /*NSString *result = */[self doTask:@"/usr/bin/zip" arguments:[NSArray arrayWithObjects:@"-qr", outPath, @".", nil] currentDirectory:workPath]; 471 | [[NSFileManager defaultManager] removeItemAtPath:workPath error:nil]; 472 | } 473 | 474 | // 475 | - (void)refineIPA:(NSString *)ipaPath dylibPath:(NSString *)dylibPath certName:(NSString *)certName provPath:(NSString *)provPath 476 | { 477 | // 478 | NSString *workPath = ipaPath.stringByDeletingPathExtension;//[NSTemporaryDirectory() stringByAppendingPathComponent:@"CeleWare.iPAFine"]; 479 | 480 | //NSLog(@"Setting up working directory in %@",workPath); 481 | [[NSFileManager defaultManager] removeItemAtPath:workPath error:nil]; 482 | [[NSFileManager defaultManager] createDirectoryAtPath:workPath withIntermediateDirectories:TRUE attributes:nil error:nil]; 483 | 484 | // Unzip 485 | _error = nil; 486 | NSString *appPath = [self unzipIPA:ipaPath workPath:workPath]; 487 | if (_error) return; 488 | 489 | // Strip 490 | //[self stripApp:appPath]; 491 | //if (_error) return; 492 | 493 | // Rename 494 | NSString *outPath = [self renameApp:appPath ipaPath:ipaPath]; 495 | 496 | // Provision 497 | [self injectApp:appPath dylibPath:dylibPath]; 498 | if (_error) return; 499 | 500 | // Provision 501 | [self provApp:appPath provPath:provPath]; 502 | if (_error) return; 503 | 504 | // Sign 505 | [self signApp:appPath certName:certName]; 506 | if (_error) return; 507 | 508 | // Remove origin 509 | [[NSFileManager defaultManager] removeItemAtPath:ipaPath error:nil]; 510 | 511 | // Zip 512 | [self zipIPA:workPath outPath:outPath]; 513 | } 514 | 515 | // 516 | - (NSString *)refine:(NSString *)ipaPath dylibPath:(NSString *)dylibPath certName:(NSString *)certName provPath:(NSString *)provPath 517 | { 518 | _error = nil; 519 | 520 | if (dylibPath.length && [[NSFileManager defaultManager] fileExistsAtPath:dylibPath]) 521 | { 522 | [self signApp:dylibPath certName:certName]; 523 | if (_error) return _error; 524 | } 525 | 526 | BOOL isDir = NO; 527 | if ([[NSFileManager defaultManager] fileExistsAtPath:ipaPath isDirectory:&isDir]) 528 | { 529 | if (isDir) 530 | { 531 | NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:ipaPath error:nil]; 532 | for (NSString *file in files) 533 | { 534 | if ([file.pathExtension.lowercaseString isEqualToString:@"ipa"]) 535 | { 536 | [self refineIPA:[ipaPath stringByAppendingPathComponent:file] dylibPath:dylibPath certName:certName provPath:provPath]; 537 | } 538 | } 539 | } 540 | else if ([ipaPath.pathExtension.lowercaseString isEqualToString:@"ipa"]) 541 | { 542 | [self refineIPA:ipaPath dylibPath:dylibPath certName:certName provPath:provPath]; 543 | } 544 | else 545 | { 546 | if (dylibPath.length) 547 | { 548 | [self injectMachO:ipaPath dylibPath:dylibPath]; 549 | if (_error == nil) return nil; 550 | } 551 | _error = NSLocalizedString(@"You must choose an IPA file.", @"必须选择 IPA 或 Mach-O 文件。"); 552 | } 553 | } 554 | else 555 | { 556 | _error = @"Path not found"; 557 | } 558 | return _error; 559 | } 560 | 561 | @end 562 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iPAFine 2 | iOS IPA package refine and resign 3 | 4 | 1. Refine App Name based on file name. 5 | 2. Inject dylib into executable (so you can hook and modify the third party app at runtime). 6 | 3. Resign the app to ipa. Support application identity entitlements that required in 8.1.3. 7 | 8 | Support 32/64 and Universal (FAT_MAGIC and FAT_CIGAM from [pebble](https://github.com/crazypebble/iPAFine/commit/14583fad7b773a393d9136eb3c8db4cacb544ee2)) binary 9 | 10 | For testing only 11 | -------------------------------------------------------------------------------- /Release/IPAFine.app.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yonsm/iPAFine/ccafa4e03f190d2e76ad2a13a70bf97702cd4015/Release/IPAFine.app.zip -------------------------------------------------------------------------------- /Resources/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg936\cocoartf1343\cocoasubrtf160 2 | {\fonttbl\f0\fswiss\fcharset0 Helvetica;} 3 | {\colortbl;\red255\green255\blue255;} 4 | \paperw11900\paperh16840\vieww9600\viewh8400\viewkind0 5 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 6 | 7 | \f0\b\fs24 \cf0 WWW.Yonsm.NET} -------------------------------------------------------------------------------- /Resources/Icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yonsm/iPAFine/ccafa4e03f190d2e76ad2a13a70bf97702cd4015/Resources/Icon.icns -------------------------------------------------------------------------------- /Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | zh_CN 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | Icon.icns 11 | CFBundleIdentifier 12 | CeleWare.iPAFine 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 2.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 2.0 25 | LSApplicationCategoryType 26 | public.app-category.developer-tools 27 | LSMinimumSystemVersion 28 | ${MACOSX_DEPLOYMENT_TARGET} 29 | NSHumanReadableCopyright 30 | Copyright © 2012-2015 CeleWare. All rights reserved. 31 | NSMainNibFile 32 | MainMenu 33 | NSPrincipalClass 34 | NSApplication 35 | 36 | 37 | -------------------------------------------------------------------------------- /Resources/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1070 5 | 14B25 6 | 6254 7 | 1343.16 8 | 755.00 9 | 10 | com.apple.InterfaceBuilder.CocoaPlugin 11 | 6254 12 | 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 | 29 | PluginDependencyRecalculationVersion 30 | 31 | 32 | 33 | 34 | NSApplication 35 | 36 | 37 | FirstResponder 38 | 39 | 40 | NSApplication 41 | 42 | 43 | AMainMenu 44 | 45 | 46 | 47 | iPAFine 48 | 49 | 1048576 50 | 2147483647 51 | 52 | NSImage 53 | NSMenuCheckmark 54 | 55 | 56 | NSImage 57 | NSMenuMixedState 58 | 59 | submenuAction: 60 | 61 | 62 | iPAFine 63 | 64 | 65 | 66 | About iPAFine 67 | 68 | 2147483647 69 | 70 | 71 | 72 | 73 | 74 | YES 75 | YES 76 | 77 | 78 | 1048576 79 | 2147483647 80 | 81 | 82 | 83 | 84 | 85 | Preferences… 86 | , 87 | 1048576 88 | 2147483647 89 | 90 | 91 | 92 | 93 | 94 | YES 95 | YES 96 | 97 | 98 | 1048576 99 | 2147483647 100 | 101 | 102 | 103 | 104 | 105 | Services 106 | 107 | 1048576 108 | 2147483647 109 | 110 | 111 | submenuAction: 112 | 113 | 114 | Services 115 | 116 | _NSServicesMenu 117 | 118 | 119 | 120 | 121 | YES 122 | YES 123 | 124 | 125 | 1048576 126 | 2147483647 127 | 128 | 129 | 130 | 131 | 132 | Hide iPAFine 133 | h 134 | 1048576 135 | 2147483647 136 | 137 | 138 | 139 | 140 | 141 | Hide Others 142 | h 143 | 1572864 144 | 2147483647 145 | 146 | 147 | 148 | 149 | 150 | Show All 151 | 152 | 1048576 153 | 2147483647 154 | 155 | 156 | 157 | 158 | 159 | YES 160 | YES 161 | 162 | 163 | 1048576 164 | 2147483647 165 | 166 | 167 | 168 | 169 | 170 | Quit iPAFine 171 | q 172 | 1048576 173 | 2147483647 174 | 175 | 176 | 177 | 178 | _NSAppleMenu 179 | 180 | 181 | 182 | 183 | File 184 | 185 | 1048576 186 | 2147483647 187 | 188 | 189 | submenuAction: 190 | 191 | 192 | File 193 | 194 | 195 | 196 | New 197 | n 198 | 1048576 199 | 2147483647 200 | 201 | 202 | 203 | 204 | 205 | Open… 206 | o 207 | 1048576 208 | 2147483647 209 | 210 | 211 | 212 | 213 | 214 | Open Recent 215 | 216 | 1048576 217 | 2147483647 218 | 219 | 220 | submenuAction: 221 | 222 | 223 | Open Recent 224 | 225 | 226 | 227 | Clear Menu 228 | 229 | 1048576 230 | 2147483647 231 | 232 | 233 | 234 | 235 | _NSRecentDocumentsMenu 236 | 237 | 238 | 239 | 240 | YES 241 | YES 242 | 243 | 244 | 1048576 245 | 2147483647 246 | 247 | 248 | 249 | 250 | 251 | Close 252 | w 253 | 1048576 254 | 2147483647 255 | 256 | 257 | 258 | 259 | 260 | Save… 261 | s 262 | 1048576 263 | 2147483647 264 | 265 | 266 | 267 | 268 | 269 | Revert to Saved 270 | 271 | 2147483647 272 | 273 | 274 | 275 | 276 | 277 | YES 278 | YES 279 | 280 | 281 | 1048576 282 | 2147483647 283 | 284 | 285 | 286 | 287 | 288 | Page Setup... 289 | P 290 | 1179648 291 | 2147483647 292 | 293 | 294 | 295 | 296 | 297 | 298 | Print… 299 | p 300 | 1048576 301 | 2147483647 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | Edit 311 | 312 | 1048576 313 | 2147483647 314 | 315 | 316 | submenuAction: 317 | 318 | 319 | Edit 320 | 321 | 322 | 323 | Undo 324 | z 325 | 1048576 326 | 2147483647 327 | 328 | 329 | 330 | 331 | 332 | Redo 333 | Z 334 | 1179648 335 | 2147483647 336 | 337 | 338 | 339 | 340 | 341 | YES 342 | YES 343 | 344 | 345 | 1048576 346 | 2147483647 347 | 348 | 349 | 350 | 351 | 352 | Cut 353 | x 354 | 1048576 355 | 2147483647 356 | 357 | 358 | 359 | 360 | 361 | Copy 362 | c 363 | 1048576 364 | 2147483647 365 | 366 | 367 | 368 | 369 | 370 | Paste 371 | v 372 | 1048576 373 | 2147483647 374 | 375 | 376 | 377 | 378 | 379 | Paste and Match Style 380 | V 381 | 1572864 382 | 2147483647 383 | 384 | 385 | 386 | 387 | 388 | Delete 389 | 390 | 1048576 391 | 2147483647 392 | 393 | 394 | 395 | 396 | 397 | Select All 398 | a 399 | 1048576 400 | 2147483647 401 | 402 | 403 | 404 | 405 | 406 | YES 407 | YES 408 | 409 | 410 | 1048576 411 | 2147483647 412 | 413 | 414 | 415 | 416 | 417 | Find 418 | 419 | 1048576 420 | 2147483647 421 | 422 | 423 | submenuAction: 424 | 425 | 426 | Find 427 | 428 | 429 | 430 | Find… 431 | f 432 | 1048576 433 | 2147483647 434 | 435 | 436 | 1 437 | 438 | 439 | 440 | Find and Replace… 441 | f 442 | 1572864 443 | 2147483647 444 | 445 | 446 | 12 447 | 448 | 449 | 450 | Find Next 451 | g 452 | 1048576 453 | 2147483647 454 | 455 | 456 | 2 457 | 458 | 459 | 460 | Find Previous 461 | G 462 | 1179648 463 | 2147483647 464 | 465 | 466 | 3 467 | 468 | 469 | 470 | Use Selection for Find 471 | e 472 | 1048576 473 | 2147483647 474 | 475 | 476 | 7 477 | 478 | 479 | 480 | Jump to Selection 481 | j 482 | 1048576 483 | 2147483647 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | Spelling and Grammar 493 | 494 | 1048576 495 | 2147483647 496 | 497 | 498 | submenuAction: 499 | 500 | 501 | Spelling and Grammar 502 | 503 | 504 | 505 | Show Spelling and Grammar 506 | : 507 | 1048576 508 | 2147483647 509 | 510 | 511 | 512 | 513 | 514 | Check Document Now 515 | ; 516 | 1048576 517 | 2147483647 518 | 519 | 520 | 521 | 522 | 523 | YES 524 | YES 525 | 526 | 527 | 2147483647 528 | 529 | 530 | 531 | 532 | 533 | Check Spelling While Typing 534 | 535 | 1048576 536 | 2147483647 537 | 538 | 539 | 540 | 541 | 542 | Check Grammar With Spelling 543 | 544 | 1048576 545 | 2147483647 546 | 547 | 548 | 549 | 550 | 551 | Correct Spelling Automatically 552 | 553 | 2147483647 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | Substitutions 563 | 564 | 1048576 565 | 2147483647 566 | 567 | 568 | submenuAction: 569 | 570 | 571 | Substitutions 572 | 573 | 574 | 575 | Show Substitutions 576 | 577 | 2147483647 578 | 579 | 580 | 581 | 582 | 583 | YES 584 | YES 585 | 586 | 587 | 2147483647 588 | 589 | 590 | 591 | 592 | 593 | Smart Copy/Paste 594 | f 595 | 1048576 596 | 2147483647 597 | 598 | 599 | 1 600 | 601 | 602 | 603 | Smart Quotes 604 | g 605 | 1048576 606 | 2147483647 607 | 608 | 609 | 2 610 | 611 | 612 | 613 | Smart Dashes 614 | 615 | 2147483647 616 | 617 | 618 | 619 | 620 | 621 | Smart Links 622 | G 623 | 1179648 624 | 2147483647 625 | 626 | 627 | 3 628 | 629 | 630 | 631 | Text Replacement 632 | 633 | 2147483647 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | Transformations 643 | 644 | 2147483647 645 | 646 | 647 | submenuAction: 648 | 649 | 650 | Transformations 651 | 652 | 653 | 654 | Make Upper Case 655 | 656 | 2147483647 657 | 658 | 659 | 660 | 661 | 662 | Make Lower Case 663 | 664 | 2147483647 665 | 666 | 667 | 668 | 669 | 670 | Capitalize 671 | 672 | 2147483647 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | Speech 682 | 683 | 1048576 684 | 2147483647 685 | 686 | 687 | submenuAction: 688 | 689 | 690 | Speech 691 | 692 | 693 | 694 | Start Speaking 695 | 696 | 1048576 697 | 2147483647 698 | 699 | 700 | 701 | 702 | 703 | Stop Speaking 704 | 705 | 1048576 706 | 2147483647 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | Window 719 | 720 | 1048576 721 | 2147483647 722 | 723 | 724 | submenuAction: 725 | 726 | 727 | Window 728 | 729 | 730 | 731 | Minimize 732 | m 733 | 1048576 734 | 2147483647 735 | 736 | 737 | 738 | 739 | 740 | Zoom 741 | 742 | 1048576 743 | 2147483647 744 | 745 | 746 | 747 | 748 | 749 | YES 750 | YES 751 | 752 | 753 | 1048576 754 | 2147483647 755 | 756 | 757 | 758 | 759 | 760 | Bring All to Front 761 | 762 | 1048576 763 | 2147483647 764 | 765 | 766 | 767 | 768 | _NSWindowsMenu 769 | 770 | 771 | 772 | 773 | Help 774 | 775 | 2147483647 776 | 777 | 778 | submenuAction: 779 | 780 | 781 | Help 782 | 783 | 784 | 785 | iPAFine Help 786 | ? 787 | 1048576 788 | 2147483647 789 | 790 | 791 | 792 | 793 | _NSHelpMenu 794 | 795 | 796 | 797 | _NSMainMenu 798 | 799 | 800 | 7 801 | 2 802 | {{335, 390}, {484, 189}} 803 | 1954021376 804 | iPAFine 805 | NSWindow 806 | 807 | 808 | 809 | 810 | 256 811 | 812 | 813 | 814 | 268 815 | {{20, 147}, {357, 22}} 816 | 817 | 818 | 819 | _NS:9 820 | YES 821 | 822 | -1804599231 823 | 272630784 824 | 825 | 826 | YES 827 | 13 828 | 1044 829 | 830 | IPA Folder or File 831 | _NS:9 832 | 833 | YES 834 | 835 | 6 836 | System 837 | textBackgroundColor 838 | 839 | 3 840 | MQA 841 | 842 | 843 | 844 | 6 845 | System 846 | textColor 847 | 848 | 3 849 | MAA 850 | 851 | 852 | 853 | NO 854 | 1 855 | 856 | 857 | 858 | 268 859 | {{383, 141}, {87, 32}} 860 | 861 | 862 | 863 | _NS:9 864 | YES 865 | 866 | 67108864 867 | 134217728 868 | Browse 869 | 870 | _NS:9 871 | 872 | -2038284288 873 | 129 874 | 875 | 876 | 200 877 | 25 878 | 879 | NO 880 | 881 | 882 | 883 | 268 884 | {{20, 106}, {357, 22}} 885 | 886 | 887 | 888 | _NS:9 889 | YES 890 | 891 | -1804599231 892 | 272630784 893 | 894 | 895 | Injected Dylib (Optional) 896 | _NS:9 897 | 898 | YES 899 | 900 | 901 | 902 | NO 903 | 1 904 | 905 | 906 | 907 | 268 908 | {{383, 100}, {87, 32}} 909 | 910 | 911 | 912 | _NS:9 913 | YES 914 | 915 | 67108864 916 | 134217728 917 | Browse 918 | 919 | _NS:9 920 | 921 | -2038284288 922 | 129 923 | 924 | 925 | 200 926 | 25 927 | 928 | NO 929 | 930 | 931 | 932 | 268 933 | {{20, 65}, {357, 22}} 934 | 935 | 936 | 937 | _NS:9 938 | YES 939 | 940 | -1804599231 941 | 272630784 942 | 943 | 944 | Embedded Provisioning (Optional) 945 | _NS:9 946 | 947 | YES 948 | 949 | 950 | 951 | NO 952 | 1 953 | 954 | 955 | 956 | 268 957 | {{383, 59}, {87, 32}} 958 | 959 | 960 | 961 | _NS:9 962 | YES 963 | 964 | 67108864 965 | 134217728 966 | Browse 967 | 968 | _NS:9 969 | 970 | -2038284288 971 | 129 972 | 973 | 974 | 200 975 | 25 976 | 977 | NO 978 | 979 | 980 | 981 | 268 982 | {{20, 24}, {357, 22}} 983 | 984 | 985 | 986 | _NS:9 987 | YES 988 | 989 | -1804599231 990 | 272630784 991 | 992 | 993 | Certificate Name on Key Chain (Required or Jail Broken) 994 | _NS:9 995 | 996 | YES 997 | 998 | 999 | 1000 | NO 1001 | 1 1002 | 1003 | 1004 | 1005 | 268 1006 | {{383, 18}, {87, 32}} 1007 | 1008 | 1009 | 1010 | _NS:9 1011 | YES 1012 | 1013 | 67108864 1014 | 134217728 1015 | Sign 1016 | 1017 | _NS:9 1018 | 1019 | -2038284288 1020 | 129 1021 | 1022 | 1023 | 200 1024 | 25 1025 | 1026 | NO 1027 | 1028 | 1029 | 1030 | 268 1031 | {{20, 4}, {444, 12}} 1032 | 1033 | 1034 | _NS:945 1035 | 24842 1036 | 100 1037 | 1038 | 1039 | {484, 189} 1040 | 1041 | 1042 | 1043 | 1044 | {{0, 0}, {1440, 877}} 1045 | {10000000000000, 10000000000000} 1046 | YES 1047 | 1048 | 1049 | AppDelegate 1050 | 1051 | 1052 | NSFontManager 1053 | 1054 | 1055 | 1056 | 1057 | 1058 | 1059 | terminate: 1060 | 1061 | 1062 | 1063 | 449 1064 | 1065 | 1066 | 1067 | orderFrontStandardAboutPanel: 1068 | 1069 | 1070 | 1071 | 142 1072 | 1073 | 1074 | 1075 | delegate 1076 | 1077 | 1078 | 1079 | 495 1080 | 1081 | 1082 | 1083 | performMiniaturize: 1084 | 1085 | 1086 | 1087 | 37 1088 | 1089 | 1090 | 1091 | arrangeInFront: 1092 | 1093 | 1094 | 1095 | 39 1096 | 1097 | 1098 | 1099 | print: 1100 | 1101 | 1102 | 1103 | 86 1104 | 1105 | 1106 | 1107 | runPageLayout: 1108 | 1109 | 1110 | 1111 | 87 1112 | 1113 | 1114 | 1115 | clearRecentDocuments: 1116 | 1117 | 1118 | 1119 | 127 1120 | 1121 | 1122 | 1123 | performClose: 1124 | 1125 | 1126 | 1127 | 193 1128 | 1129 | 1130 | 1131 | toggleContinuousSpellChecking: 1132 | 1133 | 1134 | 1135 | 222 1136 | 1137 | 1138 | 1139 | undo: 1140 | 1141 | 1142 | 1143 | 223 1144 | 1145 | 1146 | 1147 | copy: 1148 | 1149 | 1150 | 1151 | 224 1152 | 1153 | 1154 | 1155 | checkSpelling: 1156 | 1157 | 1158 | 1159 | 225 1160 | 1161 | 1162 | 1163 | paste: 1164 | 1165 | 1166 | 1167 | 226 1168 | 1169 | 1170 | 1171 | stopSpeaking: 1172 | 1173 | 1174 | 1175 | 227 1176 | 1177 | 1178 | 1179 | cut: 1180 | 1181 | 1182 | 1183 | 228 1184 | 1185 | 1186 | 1187 | showGuessPanel: 1188 | 1189 | 1190 | 1191 | 230 1192 | 1193 | 1194 | 1195 | redo: 1196 | 1197 | 1198 | 1199 | 231 1200 | 1201 | 1202 | 1203 | selectAll: 1204 | 1205 | 1206 | 1207 | 232 1208 | 1209 | 1210 | 1211 | startSpeaking: 1212 | 1213 | 1214 | 1215 | 233 1216 | 1217 | 1218 | 1219 | delete: 1220 | 1221 | 1222 | 1223 | 235 1224 | 1225 | 1226 | 1227 | performZoom: 1228 | 1229 | 1230 | 1231 | 240 1232 | 1233 | 1234 | 1235 | performFindPanelAction: 1236 | 1237 | 1238 | 1239 | 241 1240 | 1241 | 1242 | 1243 | centerSelectionInVisibleArea: 1244 | 1245 | 1246 | 1247 | 245 1248 | 1249 | 1250 | 1251 | toggleGrammarChecking: 1252 | 1253 | 1254 | 1255 | 347 1256 | 1257 | 1258 | 1259 | toggleSmartInsertDelete: 1260 | 1261 | 1262 | 1263 | 355 1264 | 1265 | 1266 | 1267 | toggleAutomaticQuoteSubstitution: 1268 | 1269 | 1270 | 1271 | 356 1272 | 1273 | 1274 | 1275 | toggleAutomaticLinkDetection: 1276 | 1277 | 1278 | 1279 | 357 1280 | 1281 | 1282 | 1283 | saveDocument: 1284 | 1285 | 1286 | 1287 | 362 1288 | 1289 | 1290 | 1291 | revertDocumentToSaved: 1292 | 1293 | 1294 | 1295 | 364 1296 | 1297 | 1298 | 1299 | hide: 1300 | 1301 | 1302 | 1303 | 367 1304 | 1305 | 1306 | 1307 | hideOtherApplications: 1308 | 1309 | 1310 | 1311 | 368 1312 | 1313 | 1314 | 1315 | unhideAllApplications: 1316 | 1317 | 1318 | 1319 | 370 1320 | 1321 | 1322 | 1323 | newDocument: 1324 | 1325 | 1326 | 1327 | 373 1328 | 1329 | 1330 | 1331 | openDocument: 1332 | 1333 | 1334 | 1335 | 374 1336 | 1337 | 1338 | 1339 | toggleAutomaticSpellingCorrection: 1340 | 1341 | 1342 | 1343 | 456 1344 | 1345 | 1346 | 1347 | orderFrontSubstitutionsPanel: 1348 | 1349 | 1350 | 1351 | 458 1352 | 1353 | 1354 | 1355 | toggleAutomaticDashSubstitution: 1356 | 1357 | 1358 | 1359 | 461 1360 | 1361 | 1362 | 1363 | toggleAutomaticTextReplacement: 1364 | 1365 | 1366 | 1367 | 463 1368 | 1369 | 1370 | 1371 | uppercaseWord: 1372 | 1373 | 1374 | 1375 | 464 1376 | 1377 | 1378 | 1379 | capitalizeWord: 1380 | 1381 | 1382 | 1383 | 467 1384 | 1385 | 1386 | 1387 | lowercaseWord: 1388 | 1389 | 1390 | 1391 | 468 1392 | 1393 | 1394 | 1395 | pasteAsPlainText: 1396 | 1397 | 1398 | 1399 | 486 1400 | 1401 | 1402 | 1403 | performFindPanelAction: 1404 | 1405 | 1406 | 1407 | 487 1408 | 1409 | 1410 | 1411 | performFindPanelAction: 1412 | 1413 | 1414 | 1415 | 488 1416 | 1417 | 1418 | 1419 | performFindPanelAction: 1420 | 1421 | 1422 | 1423 | 489 1424 | 1425 | 1426 | 1427 | showHelp: 1428 | 1429 | 1430 | 1431 | 493 1432 | 1433 | 1434 | 1435 | performFindPanelAction: 1436 | 1437 | 1438 | 1439 | 535 1440 | 1441 | 1442 | 1443 | window 1444 | 1445 | 1446 | 1447 | 532 1448 | 1449 | 1450 | 1451 | browseButton 1452 | 1453 | 1454 | 1455 | 583 1456 | 1457 | 1458 | 1459 | browseProvButton 1460 | 1461 | 1462 | 1463 | 584 1464 | 1465 | 1466 | 1467 | provField 1468 | 1469 | 1470 | 1471 | 587 1472 | 1473 | 1474 | 1475 | flurry 1476 | 1477 | 1478 | 1479 | 588 1480 | 1481 | 1482 | 1483 | pathField 1484 | 1485 | 1486 | 1487 | 589 1488 | 1489 | 1490 | 1491 | certField 1492 | 1493 | 1494 | 1495 | 638 1496 | 1497 | 1498 | 1499 | resignButton 1500 | 1501 | 1502 | 1503 | 698 1504 | 1505 | 1506 | 1507 | resign: 1508 | 1509 | 1510 | 1511 | 711 1512 | 1513 | 1514 | 1515 | browseProv: 1516 | 1517 | 1518 | 1519 | 712 1520 | 1521 | 1522 | 1523 | browse: 1524 | 1525 | 1526 | 1527 | 713 1528 | 1529 | 1530 | 1531 | showHelp: 1532 | 1533 | 1534 | 1535 | 714 1536 | 1537 | 1538 | 1539 | dylibField 1540 | 1541 | 1542 | 1543 | 720 1544 | 1545 | 1546 | 1547 | browseDylib: 1548 | 1549 | 1550 | 1551 | 721 1552 | 1553 | 1554 | 1555 | 1556 | 1557 | 0 1558 | 1559 | 1560 | 1561 | 1562 | 1563 | -2 1564 | 1565 | 1566 | File's Owner 1567 | 1568 | 1569 | -1 1570 | 1571 | 1572 | First Responder 1573 | 1574 | 1575 | -3 1576 | 1577 | 1578 | Application 1579 | 1580 | 1581 | 29 1582 | 1583 | 1584 | 1585 | 1586 | 1587 | 1588 | 1589 | 1590 | 1591 | 1592 | 1593 | 19 1594 | 1595 | 1596 | 1597 | 1598 | 1599 | 1600 | 1601 | 56 1602 | 1603 | 1604 | 1605 | 1606 | 1607 | 1608 | 1609 | 217 1610 | 1611 | 1612 | 1613 | 1614 | 1615 | 1616 | 1617 | 83 1618 | 1619 | 1620 | 1621 | 1622 | 1623 | 1624 | 1625 | 81 1626 | 1627 | 1628 | 1629 | 1630 | 1631 | 1632 | 1633 | 1634 | 1635 | 1636 | 1637 | 1638 | 1639 | 1640 | 1641 | 1642 | 75 1643 | 1644 | 1645 | 1646 | 1647 | 78 1648 | 1649 | 1650 | 1651 | 1652 | 72 1653 | 1654 | 1655 | 1656 | 1657 | 82 1658 | 1659 | 1660 | 1661 | 1662 | 124 1663 | 1664 | 1665 | 1666 | 1667 | 1668 | 1669 | 1670 | 77 1671 | 1672 | 1673 | 1674 | 1675 | 73 1676 | 1677 | 1678 | 1679 | 1680 | 79 1681 | 1682 | 1683 | 1684 | 1685 | 112 1686 | 1687 | 1688 | 1689 | 1690 | 74 1691 | 1692 | 1693 | 1694 | 1695 | 125 1696 | 1697 | 1698 | 1699 | 1700 | 1701 | 1702 | 1703 | 126 1704 | 1705 | 1706 | 1707 | 1708 | 205 1709 | 1710 | 1711 | 1712 | 1713 | 1714 | 1715 | 1716 | 1717 | 1718 | 1719 | 1720 | 1721 | 1722 | 1723 | 1724 | 1725 | 1726 | 1727 | 1728 | 1729 | 1730 | 202 1731 | 1732 | 1733 | 1734 | 1735 | 198 1736 | 1737 | 1738 | 1739 | 1740 | 207 1741 | 1742 | 1743 | 1744 | 1745 | 214 1746 | 1747 | 1748 | 1749 | 1750 | 199 1751 | 1752 | 1753 | 1754 | 1755 | 203 1756 | 1757 | 1758 | 1759 | 1760 | 197 1761 | 1762 | 1763 | 1764 | 1765 | 206 1766 | 1767 | 1768 | 1769 | 1770 | 215 1771 | 1772 | 1773 | 1774 | 1775 | 218 1776 | 1777 | 1778 | 1779 | 1780 | 1781 | 1782 | 1783 | 216 1784 | 1785 | 1786 | 1787 | 1788 | 1789 | 1790 | 1791 | 200 1792 | 1793 | 1794 | 1795 | 1796 | 1797 | 1798 | 1799 | 1800 | 1801 | 1802 | 1803 | 1804 | 219 1805 | 1806 | 1807 | 1808 | 1809 | 201 1810 | 1811 | 1812 | 1813 | 1814 | 204 1815 | 1816 | 1817 | 1818 | 1819 | 220 1820 | 1821 | 1822 | 1823 | 1824 | 1825 | 1826 | 1827 | 1828 | 1829 | 1830 | 1831 | 1832 | 213 1833 | 1834 | 1835 | 1836 | 1837 | 210 1838 | 1839 | 1840 | 1841 | 1842 | 221 1843 | 1844 | 1845 | 1846 | 1847 | 208 1848 | 1849 | 1850 | 1851 | 1852 | 209 1853 | 1854 | 1855 | 1856 | 1857 | 57 1858 | 1859 | 1860 | 1861 | 1862 | 1863 | 1864 | 1865 | 1866 | 1867 | 1868 | 1869 | 1870 | 1871 | 1872 | 1873 | 1874 | 1875 | 58 1876 | 1877 | 1878 | 1879 | 1880 | 134 1881 | 1882 | 1883 | 1884 | 1885 | 150 1886 | 1887 | 1888 | 1889 | 1890 | 136 1891 | 1892 | 1893 | 1894 | 1895 | 144 1896 | 1897 | 1898 | 1899 | 1900 | 129 1901 | 1902 | 1903 | 1904 | 1905 | 143 1906 | 1907 | 1908 | 1909 | 1910 | 236 1911 | 1912 | 1913 | 1914 | 1915 | 131 1916 | 1917 | 1918 | 1919 | 1920 | 1921 | 1922 | 1923 | 149 1924 | 1925 | 1926 | 1927 | 1928 | 145 1929 | 1930 | 1931 | 1932 | 1933 | 130 1934 | 1935 | 1936 | 1937 | 1938 | 24 1939 | 1940 | 1941 | 1942 | 1943 | 1944 | 1945 | 1946 | 1947 | 1948 | 1949 | 92 1950 | 1951 | 1952 | 1953 | 1954 | 5 1955 | 1956 | 1957 | 1958 | 1959 | 239 1960 | 1961 | 1962 | 1963 | 1964 | 23 1965 | 1966 | 1967 | 1968 | 1969 | 211 1970 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 1977 | 212 1978 | 1979 | 1980 | 1981 | 1982 | 1983 | 1984 | 1985 | 1986 | 195 1987 | 1988 | 1989 | 1990 | 1991 | 196 1992 | 1993 | 1994 | 1995 | 1996 | 346 1997 | 1998 | 1999 | 2000 | 2001 | 348 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 349 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 350 2024 | 2025 | 2026 | 2027 | 2028 | 351 2029 | 2030 | 2031 | 2032 | 2033 | 354 2034 | 2035 | 2036 | 2037 | 2038 | 371 2039 | 2040 | 2041 | 2042 | 2043 | 2044 | 2045 | 2046 | 372 2047 | 2048 | 2049 | 2050 | 2051 | 2052 | 2053 | 2054 | 2055 | 2056 | 2057 | 2058 | 2059 | 2060 | 2061 | 2062 | 420 2063 | 2064 | 2065 | 2066 | 2067 | 450 2068 | 2069 | 2070 | 2071 | 2072 | 2073 | 2074 | 2075 | 451 2076 | 2077 | 2078 | 2079 | 2080 | 2081 | 2082 | 2083 | 2084 | 2085 | 452 2086 | 2087 | 2088 | 2089 | 2090 | 453 2091 | 2092 | 2093 | 2094 | 2095 | 454 2096 | 2097 | 2098 | 2099 | 2100 | 457 2101 | 2102 | 2103 | 2104 | 2105 | 459 2106 | 2107 | 2108 | 2109 | 2110 | 460 2111 | 2112 | 2113 | 2114 | 2115 | 462 2116 | 2117 | 2118 | 2119 | 2120 | 465 2121 | 2122 | 2123 | 2124 | 2125 | 466 2126 | 2127 | 2128 | 2129 | 2130 | 485 2131 | 2132 | 2133 | 2134 | 2135 | 490 2136 | 2137 | 2138 | 2139 | 2140 | 2141 | 2142 | 2143 | 494 2144 | 2145 | 2146 | 2147 | 2148 | 534 2149 | 2150 | 2151 | 2152 | 2153 | 491 2154 | 2155 | 2156 | 2157 | 2158 | 2159 | 2160 | 2161 | 492 2162 | 2163 | 2164 | 2165 | 2166 | 536 2167 | 2168 | 2169 | 2170 | 2171 | 2172 | 2173 | 2174 | 537 2175 | 2176 | 2177 | 2178 | 2179 | 540 2180 | 2181 | 2182 | 2183 | 2184 | 2185 | 2186 | 2187 | 541 2188 | 2189 | 2190 | 2191 | 2192 | 548 2193 | 2194 | 2195 | 2196 | 2197 | 2198 | 2199 | 2200 | 549 2201 | 2202 | 2203 | 2204 | 2205 | 2206 | 2207 | 2208 | 551 2209 | 2210 | 2211 | 2212 | 2213 | 552 2214 | 2215 | 2216 | 2217 | 2218 | 574 2219 | 2220 | 2221 | 2222 | 2223 | 627 2224 | 2225 | 2226 | 2227 | 2228 | 2229 | 2230 | 2231 | 628 2232 | 2233 | 2234 | 2235 | 2236 | 651 2237 | 2238 | 2239 | 2240 | 2241 | 2242 | 2243 | 2244 | 652 2245 | 2246 | 2247 | 2248 | 2249 | 715 2250 | 2251 | 2252 | 2253 | 2254 | 2255 | 2256 | 2257 | 716 2258 | 2259 | 2260 | 2261 | 2262 | 2263 | 2264 | 2265 | 717 2266 | 2267 | 2268 | 2269 | 2270 | 718 2271 | 2272 | 2273 | 2274 | 2275 | 2276 | 2277 | com.apple.InterfaceBuilder.CocoaPlugin 2278 | com.apple.InterfaceBuilder.CocoaPlugin 2279 | com.apple.InterfaceBuilder.CocoaPlugin 2280 | com.apple.InterfaceBuilder.CocoaPlugin 2281 | com.apple.InterfaceBuilder.CocoaPlugin 2282 | com.apple.InterfaceBuilder.CocoaPlugin 2283 | com.apple.InterfaceBuilder.CocoaPlugin 2284 | com.apple.InterfaceBuilder.CocoaPlugin 2285 | com.apple.InterfaceBuilder.CocoaPlugin 2286 | com.apple.InterfaceBuilder.CocoaPlugin 2287 | com.apple.InterfaceBuilder.CocoaPlugin 2288 | com.apple.InterfaceBuilder.CocoaPlugin 2289 | com.apple.InterfaceBuilder.CocoaPlugin 2290 | com.apple.InterfaceBuilder.CocoaPlugin 2291 | com.apple.InterfaceBuilder.CocoaPlugin 2292 | com.apple.InterfaceBuilder.CocoaPlugin 2293 | com.apple.InterfaceBuilder.CocoaPlugin 2294 | com.apple.InterfaceBuilder.CocoaPlugin 2295 | com.apple.InterfaceBuilder.CocoaPlugin 2296 | com.apple.InterfaceBuilder.CocoaPlugin 2297 | com.apple.InterfaceBuilder.CocoaPlugin 2298 | com.apple.InterfaceBuilder.CocoaPlugin 2299 | com.apple.InterfaceBuilder.CocoaPlugin 2300 | com.apple.InterfaceBuilder.CocoaPlugin 2301 | com.apple.InterfaceBuilder.CocoaPlugin 2302 | com.apple.InterfaceBuilder.CocoaPlugin 2303 | com.apple.InterfaceBuilder.CocoaPlugin 2304 | com.apple.InterfaceBuilder.CocoaPlugin 2305 | com.apple.InterfaceBuilder.CocoaPlugin 2306 | com.apple.InterfaceBuilder.CocoaPlugin 2307 | com.apple.InterfaceBuilder.CocoaPlugin 2308 | com.apple.InterfaceBuilder.CocoaPlugin 2309 | com.apple.InterfaceBuilder.CocoaPlugin 2310 | com.apple.InterfaceBuilder.CocoaPlugin 2311 | com.apple.InterfaceBuilder.CocoaPlugin 2312 | com.apple.InterfaceBuilder.CocoaPlugin 2313 | com.apple.InterfaceBuilder.CocoaPlugin 2314 | com.apple.InterfaceBuilder.CocoaPlugin 2315 | com.apple.InterfaceBuilder.CocoaPlugin 2316 | com.apple.InterfaceBuilder.CocoaPlugin 2317 | com.apple.InterfaceBuilder.CocoaPlugin 2318 | com.apple.InterfaceBuilder.CocoaPlugin 2319 | com.apple.InterfaceBuilder.CocoaPlugin 2320 | com.apple.InterfaceBuilder.CocoaPlugin 2321 | com.apple.InterfaceBuilder.CocoaPlugin 2322 | com.apple.InterfaceBuilder.CocoaPlugin 2323 | com.apple.InterfaceBuilder.CocoaPlugin 2324 | com.apple.InterfaceBuilder.CocoaPlugin 2325 | com.apple.InterfaceBuilder.CocoaPlugin 2326 | com.apple.InterfaceBuilder.CocoaPlugin 2327 | com.apple.InterfaceBuilder.CocoaPlugin 2328 | com.apple.InterfaceBuilder.CocoaPlugin 2329 | com.apple.InterfaceBuilder.CocoaPlugin 2330 | com.apple.InterfaceBuilder.CocoaPlugin 2331 | com.apple.InterfaceBuilder.CocoaPlugin 2332 | com.apple.InterfaceBuilder.CocoaPlugin 2333 | {528, 337.5} 2334 | com.apple.InterfaceBuilder.CocoaPlugin 2335 | {{380, 496}, {480, 360}} 2336 | 2337 | 2338 | 2339 | com.apple.InterfaceBuilder.CocoaPlugin 2340 | com.apple.InterfaceBuilder.CocoaPlugin 2341 | com.apple.InterfaceBuilder.CocoaPlugin 2342 | com.apple.InterfaceBuilder.CocoaPlugin 2343 | com.apple.InterfaceBuilder.CocoaPlugin 2344 | com.apple.InterfaceBuilder.CocoaPlugin 2345 | com.apple.InterfaceBuilder.CocoaPlugin 2346 | com.apple.InterfaceBuilder.CocoaPlugin 2347 | com.apple.InterfaceBuilder.CocoaPlugin 2348 | com.apple.InterfaceBuilder.CocoaPlugin 2349 | com.apple.InterfaceBuilder.CocoaPlugin 2350 | com.apple.InterfaceBuilder.CocoaPlugin 2351 | com.apple.InterfaceBuilder.CocoaPlugin 2352 | com.apple.InterfaceBuilder.CocoaPlugin 2353 | com.apple.InterfaceBuilder.CocoaPlugin 2354 | com.apple.InterfaceBuilder.CocoaPlugin 2355 | com.apple.InterfaceBuilder.CocoaPlugin 2356 | com.apple.InterfaceBuilder.CocoaPlugin 2357 | com.apple.InterfaceBuilder.CocoaPlugin 2358 | com.apple.InterfaceBuilder.CocoaPlugin 2359 | com.apple.InterfaceBuilder.CocoaPlugin 2360 | com.apple.InterfaceBuilder.CocoaPlugin 2361 | 2362 | com.apple.InterfaceBuilder.CocoaPlugin 2363 | com.apple.InterfaceBuilder.CocoaPlugin 2364 | com.apple.InterfaceBuilder.CocoaPlugin 2365 | com.apple.InterfaceBuilder.CocoaPlugin 2366 | com.apple.InterfaceBuilder.CocoaPlugin 2367 | com.apple.InterfaceBuilder.CocoaPlugin 2368 | com.apple.InterfaceBuilder.CocoaPlugin 2369 | com.apple.InterfaceBuilder.CocoaPlugin 2370 | com.apple.InterfaceBuilder.CocoaPlugin 2371 | com.apple.InterfaceBuilder.CocoaPlugin 2372 | com.apple.InterfaceBuilder.CocoaPlugin 2373 | com.apple.InterfaceBuilder.CocoaPlugin 2374 | com.apple.InterfaceBuilder.CocoaPlugin 2375 | com.apple.InterfaceBuilder.CocoaPlugin 2376 | com.apple.InterfaceBuilder.CocoaPlugin 2377 | com.apple.InterfaceBuilder.CocoaPlugin 2378 | com.apple.InterfaceBuilder.CocoaPlugin 2379 | com.apple.InterfaceBuilder.CocoaPlugin 2380 | com.apple.InterfaceBuilder.CocoaPlugin 2381 | com.apple.InterfaceBuilder.CocoaPlugin 2382 | com.apple.InterfaceBuilder.CocoaPlugin 2383 | com.apple.InterfaceBuilder.CocoaPlugin 2384 | com.apple.InterfaceBuilder.CocoaPlugin 2385 | com.apple.InterfaceBuilder.CocoaPlugin 2386 | com.apple.InterfaceBuilder.CocoaPlugin 2387 | com.apple.InterfaceBuilder.CocoaPlugin 2388 | com.apple.InterfaceBuilder.CocoaPlugin 2389 | com.apple.InterfaceBuilder.CocoaPlugin 2390 | com.apple.InterfaceBuilder.CocoaPlugin 2391 | 2392 | 2393 | 2394 | 2395 | 2396 | 724 2397 | 2398 | 2399 | 2400 | 2401 | AppDelegate 2402 | iPAFine 2403 | 2404 | resign: 2405 | id 2406 | 2407 | 2408 | resign: 2409 | 2410 | resign: 2411 | id 2412 | 2413 | 2414 | 2415 | NSButton 2416 | NSButton 2417 | NSTextField 2418 | NSTextField 2419 | NSProgressIndicator 2420 | NSTextField 2421 | NSTextField 2422 | NSButton 2423 | NSWindow 2424 | 2425 | 2426 | 2427 | browseButton 2428 | NSButton 2429 | 2430 | 2431 | browseProvButton 2432 | NSButton 2433 | 2434 | 2435 | certField 2436 | NSTextField 2437 | 2438 | 2439 | dylibField 2440 | NSTextField 2441 | 2442 | 2443 | flurry 2444 | NSProgressIndicator 2445 | 2446 | 2447 | pathField 2448 | NSTextField 2449 | 2450 | 2451 | provField 2452 | NSTextField 2453 | 2454 | 2455 | resignButton 2456 | NSButton 2457 | 2458 | 2459 | window 2460 | NSWindow 2461 | 2462 | 2463 | 2464 | IBProjectSource 2465 | ../Classes/AppDelegate.h 2466 | 2467 | 2468 | 2469 | AppDelegate 2470 | 2471 | id 2472 | id 2473 | id 2474 | id 2475 | id 2476 | 2477 | 2478 | 2479 | browse: 2480 | id 2481 | 2482 | 2483 | browseDylib: 2484 | id 2485 | 2486 | 2487 | browseProv: 2488 | id 2489 | 2490 | 2491 | resign: 2492 | id 2493 | 2494 | 2495 | showHelp: 2496 | id 2497 | 2498 | 2499 | 2500 | IBProjectSource 2501 | ../Classes/AppDelegate.mm 2502 | 2503 | 2504 | 2505 | iPAFine 2506 | NSObject 2507 | 2508 | IBProjectSource 2509 | ../Classes/Model/iPAFine.h 2510 | 2511 | 2512 | 2513 | 2514 | 2515 | NSActionCell 2516 | NSCell 2517 | 2518 | IBFrameworkSource 2519 | AppKit.framework/Headers/NSActionCell.h 2520 | 2521 | 2522 | 2523 | NSApplication 2524 | NSResponder 2525 | 2526 | IBFrameworkSource 2527 | AppKit.framework/Headers/NSApplication.h 2528 | 2529 | 2530 | 2531 | NSBrowser 2532 | NSControl 2533 | 2534 | IBFrameworkSource 2535 | AppKit.framework/Headers/NSBrowser.h 2536 | 2537 | 2538 | 2539 | NSButton 2540 | NSControl 2541 | 2542 | IBFrameworkSource 2543 | AppKit.framework/Headers/NSButton.h 2544 | 2545 | 2546 | 2547 | NSButtonCell 2548 | NSActionCell 2549 | 2550 | IBFrameworkSource 2551 | AppKit.framework/Headers/NSButtonCell.h 2552 | 2553 | 2554 | 2555 | NSCell 2556 | NSObject 2557 | 2558 | IBFrameworkSource 2559 | AppKit.framework/Headers/NSCell.h 2560 | 2561 | 2562 | 2563 | NSControl 2564 | NSView 2565 | 2566 | IBFrameworkSource 2567 | AppKit.framework/Headers/NSControl.h 2568 | 2569 | 2570 | 2571 | NSDocument 2572 | NSObject 2573 | 2574 | id 2575 | id 2576 | id 2577 | id 2578 | id 2579 | id 2580 | 2581 | 2582 | 2583 | printDocument: 2584 | id 2585 | 2586 | 2587 | revertDocumentToSaved: 2588 | id 2589 | 2590 | 2591 | runPageLayout: 2592 | id 2593 | 2594 | 2595 | saveDocument: 2596 | id 2597 | 2598 | 2599 | saveDocumentAs: 2600 | id 2601 | 2602 | 2603 | saveDocumentTo: 2604 | id 2605 | 2606 | 2607 | 2608 | IBFrameworkSource 2609 | AppKit.framework/Headers/NSDocument.h 2610 | 2611 | 2612 | 2613 | NSDocumentController 2614 | NSObject 2615 | 2616 | id 2617 | id 2618 | id 2619 | id 2620 | 2621 | 2622 | 2623 | clearRecentDocuments: 2624 | id 2625 | 2626 | 2627 | newDocument: 2628 | id 2629 | 2630 | 2631 | openDocument: 2632 | id 2633 | 2634 | 2635 | saveAllDocuments: 2636 | id 2637 | 2638 | 2639 | 2640 | IBFrameworkSource 2641 | AppKit.framework/Headers/NSDocumentController.h 2642 | 2643 | 2644 | 2645 | NSFontManager 2646 | NSObject 2647 | 2648 | IBFrameworkSource 2649 | AppKit.framework/Headers/NSFontManager.h 2650 | 2651 | 2652 | 2653 | NSFormatter 2654 | NSObject 2655 | 2656 | IBFrameworkSource 2657 | Foundation.framework/Headers/NSFormatter.h 2658 | 2659 | 2660 | 2661 | NSMatrix 2662 | NSControl 2663 | 2664 | IBFrameworkSource 2665 | AppKit.framework/Headers/NSMatrix.h 2666 | 2667 | 2668 | 2669 | NSMenu 2670 | NSObject 2671 | 2672 | IBFrameworkSource 2673 | AppKit.framework/Headers/NSMenu.h 2674 | 2675 | 2676 | 2677 | NSMenuItem 2678 | NSObject 2679 | 2680 | IBFrameworkSource 2681 | AppKit.framework/Headers/NSMenuItem.h 2682 | 2683 | 2684 | 2685 | NSMovieView 2686 | NSView 2687 | 2688 | IBFrameworkSource 2689 | AppKit.framework/Headers/NSMovieView.h 2690 | 2691 | 2692 | 2693 | NSPopover 2694 | NSResponder 2695 | 2696 | IBFrameworkSource 2697 | AppKit.framework/Headers/NSPopover.h 2698 | 2699 | 2700 | 2701 | NSProgressIndicator 2702 | NSView 2703 | 2704 | IBFrameworkSource 2705 | AppKit.framework/Headers/NSProgressIndicator.h 2706 | 2707 | 2708 | 2709 | NSResponder 2710 | NSObject 2711 | 2712 | IBFrameworkSource 2713 | AppKit.framework/Headers/NSResponder.h 2714 | 2715 | 2716 | 2717 | NSTableView 2718 | NSControl 2719 | 2720 | IBFrameworkSource 2721 | AppKit.framework/Headers/NSTableView.h 2722 | 2723 | 2724 | 2725 | NSText 2726 | NSView 2727 | 2728 | IBFrameworkSource 2729 | AppKit.framework/Headers/NSText.h 2730 | 2731 | 2732 | 2733 | NSTextField 2734 | NSControl 2735 | 2736 | IBFrameworkSource 2737 | AppKit.framework/Headers/NSTextField.h 2738 | 2739 | 2740 | 2741 | NSTextFieldCell 2742 | NSActionCell 2743 | 2744 | IBFrameworkSource 2745 | AppKit.framework/Headers/NSTextFieldCell.h 2746 | 2747 | 2748 | 2749 | NSTextView 2750 | NSText 2751 | 2752 | IBFrameworkSource 2753 | AppKit.framework/Headers/NSTextView.h 2754 | 2755 | 2756 | 2757 | NSView 2758 | NSResponder 2759 | 2760 | IBFrameworkSource 2761 | AppKit.framework/Headers/NSView.h 2762 | 2763 | 2764 | 2765 | NSViewController 2766 | NSResponder 2767 | 2768 | view 2769 | NSView 2770 | 2771 | 2772 | view 2773 | 2774 | view 2775 | NSView 2776 | 2777 | 2778 | 2779 | IBFrameworkSource 2780 | AppKit.framework/Headers/NSViewController.h 2781 | 2782 | 2783 | 2784 | NSWindow 2785 | NSResponder 2786 | 2787 | IBFrameworkSource 2788 | AppKit.framework/Headers/NSWindow.h 2789 | 2790 | 2791 | 2792 | 2793 | 0 2794 | IBCocoaFramework 2795 | NO 2796 | 2797 | com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 2798 | 2799 | 2800 | YES 2801 | 3 2802 | 2803 | {12, 12} 2804 | {10, 2} 2805 | 2806 | 2807 | 2808 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /Sources/Main.m: -------------------------------------------------------------------------------- 1 | 2 | #import 3 | 4 | int main(int argc, char *argv[]) 5 | { 6 | return NSApplicationMain(argc, (const char **)argv); 7 | } 8 | -------------------------------------------------------------------------------- /Sources/Prefix.pch: -------------------------------------------------------------------------------- 1 | 2 | 3 | #ifdef __OBJC__ 4 | #import 5 | #endif 6 | -------------------------------------------------------------------------------- /iPAFine.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 243F979614C9982200C902A9 /* ResourceRules.plist in Resources */ = {isa = PBXBuildFile; fileRef = 243F979514C9982200C902A9 /* ResourceRules.plist */; }; 11 | 2447BCE814C9824400A34F0F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2447BCE714C9824400A34F0F /* Cocoa.framework */; }; 12 | 2447BD1514C9830000A34F0F /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2447BD0614C9830000A34F0F /* AppDelegate.mm */; }; 13 | 2447BD1A14C9830000A34F0F /* Main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2447BD1414C9830000A34F0F /* Main.m */; }; 14 | 249B033D15F794EC00294C95 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 249B033B15F794EC00294C95 /* Credits.rtf */; }; 15 | 249B033E15F794EC00294C95 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 249B033C15F794EC00294C95 /* MainMenu.xib */; }; 16 | 24E0393E14C987BB003AA3D9 /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 24E0393D14C987BB003AA3D9 /* Icon.icns */; }; 17 | 24EF77701ED1998C005C1ADD /* iPAFine.mm in Sources */ = {isa = PBXBuildFile; fileRef = 24EF776F1ED1998C005C1ADD /* iPAFine.mm */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | 243F979514C9982200C902A9 /* ResourceRules.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ResourceRules.plist; sourceTree = ""; }; 22 | 2447BCE314C9824400A34F0F /* IPAFine.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IPAFine.app; sourceTree = BUILT_PRODUCTS_DIR; }; 23 | 2447BCE714C9824400A34F0F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 24 | 2447BCEA14C9824400A34F0F /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 25 | 2447BCEB14C9824400A34F0F /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 26 | 2447BCEC14C9824400A34F0F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 27 | 2447BD0514C9830000A34F0F /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 28 | 2447BD0614C9830000A34F0F /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AppDelegate.mm; sourceTree = ""; }; 29 | 2447BD1114C9830000A34F0F /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 30 | 2447BD1314C9830000A34F0F /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; 31 | 2447BD1414C9830000A34F0F /* Main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Main.m; sourceTree = ""; }; 32 | 249B033B15F794EC00294C95 /* Credits.rtf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 33 | 249B033C15F794EC00294C95 /* MainMenu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = ""; }; 34 | 24E0393D14C987BB003AA3D9 /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Icon.icns; sourceTree = ""; }; 35 | 24EF776F1ED1998C005C1ADD /* iPAFine.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iPAFine.mm; sourceTree = ""; }; 36 | 24EF77711ED199B8005C1ADD /* iPAFine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPAFine.h; sourceTree = ""; }; 37 | /* End PBXFileReference section */ 38 | 39 | /* Begin PBXFrameworksBuildPhase section */ 40 | 2447BCE014C9824400A34F0F /* Frameworks */ = { 41 | isa = PBXFrameworksBuildPhase; 42 | buildActionMask = 2147483647; 43 | files = ( 44 | 2447BCE814C9824400A34F0F /* Cocoa.framework in Frameworks */, 45 | ); 46 | runOnlyForDeploymentPostprocessing = 0; 47 | }; 48 | /* End PBXFrameworksBuildPhase section */ 49 | 50 | /* Begin PBXGroup section */ 51 | 2447BCD814C9824400A34F0F = { 52 | isa = PBXGroup; 53 | children = ( 54 | 2447BCED14C9824400A34F0F /* iPAFine */, 55 | 2447BCE614C9824400A34F0F /* Frameworks */, 56 | 2447BCE414C9824400A34F0F /* Products */, 57 | ); 58 | sourceTree = ""; 59 | }; 60 | 2447BCE414C9824400A34F0F /* Products */ = { 61 | isa = PBXGroup; 62 | children = ( 63 | 2447BCE314C9824400A34F0F /* IPAFine.app */, 64 | ); 65 | name = Products; 66 | sourceTree = ""; 67 | }; 68 | 2447BCE614C9824400A34F0F /* Frameworks */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 2447BCE714C9824400A34F0F /* Cocoa.framework */, 72 | 2447BCEA14C9824400A34F0F /* AppKit.framework */, 73 | 2447BCEB14C9824400A34F0F /* CoreData.framework */, 74 | 2447BCEC14C9824400A34F0F /* Foundation.framework */, 75 | ); 76 | name = Frameworks; 77 | sourceTree = ""; 78 | }; 79 | 2447BCED14C9824400A34F0F /* iPAFine */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | 2447BD0414C9830000A34F0F /* Classes */, 83 | 2447BD1214C9830000A34F0F /* Sources */, 84 | 2447BD0A14C9830000A34F0F /* Resources */, 85 | ); 86 | path = iPAFine; 87 | sourceTree = ""; 88 | }; 89 | 2447BD0414C9830000A34F0F /* Classes */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 24EF77711ED199B8005C1ADD /* iPAFine.h */, 93 | 24EF776F1ED1998C005C1ADD /* iPAFine.mm */, 94 | 2447BD0514C9830000A34F0F /* AppDelegate.h */, 95 | 2447BD0614C9830000A34F0F /* AppDelegate.mm */, 96 | ); 97 | path = Classes; 98 | sourceTree = SOURCE_ROOT; 99 | }; 100 | 2447BD0A14C9830000A34F0F /* Resources */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 243F979514C9982200C902A9 /* ResourceRules.plist */, 104 | 24E0393D14C987BB003AA3D9 /* Icon.icns */, 105 | 2447BD1114C9830000A34F0F /* Info.plist */, 106 | 249B033B15F794EC00294C95 /* Credits.rtf */, 107 | 249B033C15F794EC00294C95 /* MainMenu.xib */, 108 | ); 109 | path = Resources; 110 | sourceTree = SOURCE_ROOT; 111 | }; 112 | 2447BD1214C9830000A34F0F /* Sources */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 2447BD1314C9830000A34F0F /* Prefix.pch */, 116 | 2447BD1414C9830000A34F0F /* Main.m */, 117 | ); 118 | path = Sources; 119 | sourceTree = SOURCE_ROOT; 120 | }; 121 | /* End PBXGroup section */ 122 | 123 | /* Begin PBXNativeTarget section */ 124 | 2447BCE214C9824400A34F0F /* iPAFine */ = { 125 | isa = PBXNativeTarget; 126 | buildConfigurationList = 2447BD0114C9824400A34F0F /* Build configuration list for PBXNativeTarget "iPAFine" */; 127 | buildPhases = ( 128 | 2447BCDF14C9824400A34F0F /* Sources */, 129 | 2447BCE014C9824400A34F0F /* Frameworks */, 130 | 2447BCE114C9824400A34F0F /* Resources */, 131 | 24BAA8781A84C0BF00FDA4E4 /* ShellScript */, 132 | ); 133 | buildRules = ( 134 | ); 135 | dependencies = ( 136 | ); 137 | name = iPAFine; 138 | productName = iPAFine; 139 | productReference = 2447BCE314C9824400A34F0F /* IPAFine.app */; 140 | productType = "com.apple.product-type.application"; 141 | }; 142 | /* End PBXNativeTarget section */ 143 | 144 | /* Begin PBXProject section */ 145 | 2447BCDA14C9824400A34F0F /* Project object */ = { 146 | isa = PBXProject; 147 | attributes = { 148 | LastUpgradeCheck = 0610; 149 | }; 150 | buildConfigurationList = 2447BCDD14C9824400A34F0F /* Build configuration list for PBXProject "iPAFine" */; 151 | compatibilityVersion = "Xcode 3.2"; 152 | developmentRegion = English; 153 | hasScannedForEncodings = 0; 154 | knownRegions = ( 155 | en, 156 | "zh-Hans", 157 | "zh-Hant", 158 | ); 159 | mainGroup = 2447BCD814C9824400A34F0F; 160 | productRefGroup = 2447BCE414C9824400A34F0F /* Products */; 161 | projectDirPath = ""; 162 | projectRoot = ""; 163 | targets = ( 164 | 2447BCE214C9824400A34F0F /* iPAFine */, 165 | ); 166 | }; 167 | /* End PBXProject section */ 168 | 169 | /* Begin PBXResourcesBuildPhase section */ 170 | 2447BCE114C9824400A34F0F /* Resources */ = { 171 | isa = PBXResourcesBuildPhase; 172 | buildActionMask = 2147483647; 173 | files = ( 174 | 24E0393E14C987BB003AA3D9 /* Icon.icns in Resources */, 175 | 243F979614C9982200C902A9 /* ResourceRules.plist in Resources */, 176 | 249B033D15F794EC00294C95 /* Credits.rtf in Resources */, 177 | 249B033E15F794EC00294C95 /* MainMenu.xib in Resources */, 178 | ); 179 | runOnlyForDeploymentPostprocessing = 0; 180 | }; 181 | /* End PBXResourcesBuildPhase section */ 182 | 183 | /* Begin PBXShellScriptBuildPhase section */ 184 | 24BAA8781A84C0BF00FDA4E4 /* ShellScript */ = { 185 | isa = PBXShellScriptBuildPhase; 186 | buildActionMask = 2147483647; 187 | files = ( 188 | ); 189 | inputPaths = ( 190 | ); 191 | outputPaths = ( 192 | ); 193 | runOnlyForDeploymentPostprocessing = 0; 194 | shellPath = /bin/sh; 195 | shellScript = "if [ $CONFIGURATION != Debug ]; then\ncd $BUILT_PRODUCTS_DIR\nrm -f $PROJECT_DIR/Release/$FULL_PRODUCT_NAME.zip\nzip -r -X $PROJECT_DIR/Release/$FULL_PRODUCT_NAME.zip *.app\nfi\n"; 196 | }; 197 | /* End PBXShellScriptBuildPhase section */ 198 | 199 | /* Begin PBXSourcesBuildPhase section */ 200 | 2447BCDF14C9824400A34F0F /* Sources */ = { 201 | isa = PBXSourcesBuildPhase; 202 | buildActionMask = 2147483647; 203 | files = ( 204 | 24EF77701ED1998C005C1ADD /* iPAFine.mm in Sources */, 205 | 2447BD1514C9830000A34F0F /* AppDelegate.mm in Sources */, 206 | 2447BD1A14C9830000A34F0F /* Main.m in Sources */, 207 | ); 208 | runOnlyForDeploymentPostprocessing = 0; 209 | }; 210 | /* End PBXSourcesBuildPhase section */ 211 | 212 | /* Begin XCBuildConfiguration section */ 213 | 2447BCFF14C9824400A34F0F /* Debug */ = { 214 | isa = XCBuildConfiguration; 215 | buildSettings = { 216 | ALWAYS_SEARCH_USER_PATHS = NO; 217 | CLANG_ENABLE_OBJC_ARC = YES; 218 | CLANG_WARN_BOOL_CONVERSION = YES; 219 | CLANG_WARN_CONSTANT_CONVERSION = YES; 220 | CLANG_WARN_EMPTY_BODY = YES; 221 | CLANG_WARN_ENUM_CONVERSION = YES; 222 | CLANG_WARN_INT_CONVERSION = YES; 223 | CLANG_WARN_UNREACHABLE_CODE = YES; 224 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 225 | COPY_PHASE_STRIP = NO; 226 | ENABLE_STRICT_OBJC_MSGSEND = YES; 227 | GCC_C_LANGUAGE_STANDARD = gnu99; 228 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 229 | GCC_OPTIMIZATION_LEVEL = 0; 230 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 231 | GCC_PREFIX_HEADER = Sources/Prefix.pch; 232 | GCC_PREPROCESSOR_DEFINITIONS = ( 233 | "DEBUG=1", 234 | "$(inherited)", 235 | ); 236 | GCC_SYMBOLS_PRIVATE_EXTERN = YES; 237 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 238 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 239 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 240 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 241 | GCC_WARN_UNDECLARED_SELECTOR = YES; 242 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 243 | GCC_WARN_UNUSED_FUNCTION = YES; 244 | GCC_WARN_UNUSED_VARIABLE = YES; 245 | INFOPLIST_FILE = Resources/Info.plist; 246 | MACOSX_DEPLOYMENT_TARGET = 10.7; 247 | ONLY_ACTIVE_ARCH = YES; 248 | PRODUCT_NAME = IPAFine; 249 | SDKROOT = macosx; 250 | WRAPPER_EXTENSION = app; 251 | }; 252 | name = Debug; 253 | }; 254 | 2447BD0014C9824400A34F0F /* Release */ = { 255 | isa = XCBuildConfiguration; 256 | buildSettings = { 257 | ALWAYS_SEARCH_USER_PATHS = NO; 258 | CLANG_ENABLE_OBJC_ARC = YES; 259 | CLANG_WARN_BOOL_CONVERSION = YES; 260 | CLANG_WARN_CONSTANT_CONVERSION = YES; 261 | CLANG_WARN_EMPTY_BODY = YES; 262 | CLANG_WARN_ENUM_CONVERSION = YES; 263 | CLANG_WARN_INT_CONVERSION = YES; 264 | CLANG_WARN_UNREACHABLE_CODE = YES; 265 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 266 | COPY_PHASE_STRIP = YES; 267 | ENABLE_STRICT_OBJC_MSGSEND = YES; 268 | GCC_C_LANGUAGE_STANDARD = gnu99; 269 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 270 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 271 | GCC_PREFIX_HEADER = Sources/Prefix.pch; 272 | GCC_SYMBOLS_PRIVATE_EXTERN = YES; 273 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 274 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 275 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 276 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 277 | GCC_WARN_UNDECLARED_SELECTOR = YES; 278 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 279 | GCC_WARN_UNUSED_FUNCTION = YES; 280 | GCC_WARN_UNUSED_VARIABLE = YES; 281 | INFOPLIST_FILE = Resources/Info.plist; 282 | MACOSX_DEPLOYMENT_TARGET = 10.7; 283 | PRODUCT_NAME = IPAFine; 284 | SDKROOT = macosx; 285 | WRAPPER_EXTENSION = app; 286 | }; 287 | name = Release; 288 | }; 289 | 2447BD0214C9824400A34F0F /* Debug */ = { 290 | isa = XCBuildConfiguration; 291 | buildSettings = { 292 | COMBINE_HIDPI_IMAGES = YES; 293 | }; 294 | name = Debug; 295 | }; 296 | 2447BD0314C9824400A34F0F /* Release */ = { 297 | isa = XCBuildConfiguration; 298 | buildSettings = { 299 | COMBINE_HIDPI_IMAGES = YES; 300 | }; 301 | name = Release; 302 | }; 303 | /* End XCBuildConfiguration section */ 304 | 305 | /* Begin XCConfigurationList section */ 306 | 2447BCDD14C9824400A34F0F /* Build configuration list for PBXProject "iPAFine" */ = { 307 | isa = XCConfigurationList; 308 | buildConfigurations = ( 309 | 2447BCFF14C9824400A34F0F /* Debug */, 310 | 2447BD0014C9824400A34F0F /* Release */, 311 | ); 312 | defaultConfigurationIsVisible = 0; 313 | defaultConfigurationName = Release; 314 | }; 315 | 2447BD0114C9824400A34F0F /* Build configuration list for PBXNativeTarget "iPAFine" */ = { 316 | isa = XCConfigurationList; 317 | buildConfigurations = ( 318 | 2447BD0214C9824400A34F0F /* Debug */, 319 | 2447BD0314C9824400A34F0F /* Release */, 320 | ); 321 | defaultConfigurationIsVisible = 0; 322 | defaultConfigurationName = Release; 323 | }; 324 | /* End XCConfigurationList section */ 325 | }; 326 | rootObject = 2447BCDA14C9824400A34F0F /* Project object */; 327 | } 328 | --------------------------------------------------------------------------------