diff --git a/iReSign/iReSign/en.lproj/MainMenu.xib b/iReSign/iReSign/en.lproj/MainMenu.xib index 35cb160..eab0897 100755 --- a/iReSign/iReSign/en.lproj/MainMenu.xib +++ b/iReSign/iReSign/en.lproj/MainMenu.xib @@ -1,8 +1,8 @@ - - + + - + @@ -75,16 +75,16 @@ - + - + - + @@ -96,7 +96,7 @@ - + @@ -108,7 +108,7 @@ - + @@ -132,7 +132,7 @@ @@ -222,13 +271,17 @@ + + + + @@ -237,6 +290,7 @@ + diff --git a/iReSign/iReSign/iReSignAppDelegate.h b/iReSign/iReSign/iReSignAppDelegate.h index 6bd917b..0b580bd 100755 --- a/iReSign/iReSign/iReSignAppDelegate.h +++ b/iReSign/iReSign/iReSignAppDelegate.h @@ -42,6 +42,8 @@ IBOutlet IRTextFieldDrag *provisioningPathField; IBOutlet IRTextFieldDrag *entitlementField; IBOutlet IRTextFieldDrag *bundleIDField; + IBOutlet IRTextFieldDrag *versionumberField; + IBOutlet IRTextFieldDrag *buildNumberField; IBOutlet NSButton *browseButton; IBOutlet NSButton *provisioningBrowseButton; IBOutlet NSButton *entitlementBrowseButton; @@ -49,7 +51,8 @@ IBOutlet NSTextField *statusLabel; IBOutlet NSProgressIndicator *flurry; IBOutlet NSButton *changeBundleIDCheckbox; - + IBOutlet NSButton *changeVersionNumberCheckBox; + IBOutlet NSButton *changeBuildNumberCheckBox; IBOutlet NSComboBox *certComboBox; NSMutableArray *certComboBoxItems; NSTask *certTask; @@ -66,6 +69,9 @@ - (IBAction)provisioningBrowse:(id)sender; - (IBAction)entitlementBrowse:(id)sender; - (IBAction)changeBundleIDPressed:(id)sender; +- (IBAction)changeVersionNumberPressed:(id)sender; +- (IBAction)changeBuildNumberPressed:(id)sender; + - (void)checkUnzip:(NSTimer *)timer; - (void)checkCopy:(NSTimer *)timer; diff --git a/iReSign/iReSign/iReSignAppDelegate.m b/iReSign/iReSign/iReSignAppDelegate.m index d536f4e..8c00ab9 100755 --- a/iReSign/iReSign/iReSignAppDelegate.m +++ b/iReSign/iReSign/iReSignAppDelegate.m @@ -10,9 +10,15 @@ #import "iReSignAppDelegate.h" static NSString *kKeyPrefsBundleIDChange = @"keyBundleIDChange"; +static NSString *kKeyPrefsBuildNumberchange = @"keyBunildNumberChange"; +static NSString *kKeyPrefsVersionNumberChange = @"keyVersionNumberChange"; static NSString *kKeyBundleIDPlistApp = @"CFBundleIdentifier"; +static NSString *kKeyVersionNumberPlistApp = @"CFBundleShortVersionString"; +static NSString *kKeyBuildNumberPlistApp = @"CFBundleVersion"; static NSString *kKeyBundleIDPlistiTunesArtwork = @"softwareVersionBundleId"; +static NSString *kKeyVersionNumberPlistiTunesArtwork = @"bundleShortVersionString"; +static NSString *kKeyBuildNumberPlistiTunesArtwork = @"bundleVersion"; static NSString *kKeyInfoPlistApplicationProperties = @"ApplicationProperties"; static NSString *kKeyInfoPlistApplicationPath = @"ApplicationPath"; static NSString *kFrameworksDirName = @"Frameworks"; @@ -20,6 +26,8 @@ static NSString *kProductsDirName = @"Products"; static NSString *kInfoPlistFilename = @"Info.plist"; static NSString *kiTunesMetadataFileName = @"iTunesMetadata"; +static NSString *kKeyBuildNumber = @"CFBuildNumber"; +static NSString *kKeyVersionNumber = @"VersionNumber"; @implementation iReSignAppDelegate @@ -171,6 +179,14 @@ - (void)checkUnzip:(NSTimer *)timer { [self doBundleIDChange:bundleIDField.stringValue]; } + if (changeBuildNumberCheckBox.state == NSOnState) { + [self doBuildNumber:buildNumberField.stringValue]; + } + + if (changeVersionNumberCheckBox.state == NSOnState) { + [self doVersionNumber:versionumberField.stringValue]; + } + if ([[provisioningPathField stringValue] isEqualTo:@""]) { [self doCodeSigning]; } else { @@ -196,6 +212,15 @@ - (void)checkCopy:(NSTimer *)timer { [self doBundleIDChange:bundleIDField.stringValue]; } + if (changeBuildNumberCheckBox.state == NSOnState) { + [self doBuildNumber:buildNumberField.stringValue]; + } + + if (changeVersionNumberCheckBox.state == NSOnState) { + [self doVersionNumber:versionumberField.stringValue]; + } + + if ([[provisioningPathField stringValue] isEqualTo:@""]) { [self doCodeSigning]; } else { @@ -262,6 +287,122 @@ - (BOOL)changeBundleIDForFile:(NSString *)filePath bundleIDKey:(NSString *)bundl return NO; } +- (BOOL)doBuildNumber:(NSString *)newBuildNumber { + BOOL success = YES; + + success &= [self doAppBuildNumber:newBuildNumber]; + success &= [self doITunesMetadataBuildNumberChange:newBuildNumber]; + + return success; +} + + +- (BOOL)doITunesMetadataBuildNumberChange:(NSString *)newBuildNumber { + NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:workingPath error:nil]; + NSString *infoPlistPath = nil; + + for (NSString *file in dirContents) { + if ([[[file pathExtension] lowercaseString] isEqualToString:@"plist"]) { + infoPlistPath = [workingPath stringByAppendingPathComponent:file]; + break; + } + } + + return [self changeBuildNumberForFile:infoPlistPath buildNumberIDKey:kKeyBuildNumberPlistiTunesArtwork newBuildNumber:newBuildNumber plistOutOptions:NSPropertyListXMLFormat_v1_0]; + +} + +- (BOOL)doAppBuildNumber:(NSString *)newBuildNumber { + NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName] error:nil]; + NSString *infoPlistPath = nil; + + for (NSString *file in dirContents) { + if ([[[file pathExtension] lowercaseString] isEqualToString:@"app"]) { + infoPlistPath = [[[workingPath stringByAppendingPathComponent:kPayloadDirName] + stringByAppendingPathComponent:file] + stringByAppendingPathComponent:kInfoPlistFilename]; + break; + } + } + + return [self changeBuildNumberForFile:infoPlistPath buildNumberIDKey:kKeyBuildNumberPlistApp newBuildNumber:newBuildNumber plistOutOptions:NSPropertyListBinaryFormat_v1_0]; +} + +- (BOOL)changeBuildNumberForFile:(NSString *)filePath buildNumberIDKey:(NSString *)buildNumberIDKey newBuildNumber:(NSString *)newBuildNumber plistOutOptions:(NSPropertyListWriteOptions)options { + + NSMutableDictionary *plist = nil; + + if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { + plist = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; + [plist setObject:newBuildNumber forKey:buildNumberIDKey]; + + NSData *xmlData = [NSPropertyListSerialization dataWithPropertyList:plist format:options options:kCFPropertyListImmutable error:nil]; + + return [xmlData writeToFile:filePath atomically:YES]; + + } + + return NO; +} + + +- (BOOL)doVersionNumber:(NSString *)newVersionNumber { + BOOL success = YES; + + success &= [self doAppVersionNumber:newVersionNumber]; + success &= [self doITunesMetadataVersionNumberChange:newVersionNumber]; + + return success; +} + + +- (BOOL)doITunesMetadataVersionNumberChange:(NSString *)newVersionNumber { + NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:workingPath error:nil]; + NSString *infoPlistPath = nil; + + for (NSString *file in dirContents) { + if ([[[file pathExtension] lowercaseString] isEqualToString:@"plist"]) { + infoPlistPath = [workingPath stringByAppendingPathComponent:file]; + break; + } + } + + return [self changeVersionNumberForFile:infoPlistPath versionNumberIDKey:kKeyVersionNumberPlistiTunesArtwork newVersionNumber:newVersionNumber plistOutOptions:NSPropertyListXMLFormat_v1_0]; + +} + +- (BOOL)doAppVersionNumber:(NSString *)newVersionNumber { + NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName] error:nil]; + NSString *infoPlistPath = nil; + + for (NSString *file in dirContents) { + if ([[[file pathExtension] lowercaseString] isEqualToString:@"app"]) { + infoPlistPath = [[[workingPath stringByAppendingPathComponent:kPayloadDirName] + stringByAppendingPathComponent:file] + stringByAppendingPathComponent:kInfoPlistFilename]; + break; + } + } + + return [self changeVersionNumberForFile:infoPlistPath versionNumberIDKey:kKeyVersionNumberPlistApp newVersionNumber:newVersionNumber plistOutOptions:NSPropertyListBinaryFormat_v1_0]; +} + +- (BOOL)changeVersionNumberForFile:(NSString *)filePath versionNumberIDKey:(NSString *)versionNumberIDKey newVersionNumber:(NSString *)newVersionNumber plistOutOptions:(NSPropertyListWriteOptions)options { + + NSMutableDictionary *plist = nil; + + if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { + plist = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; + [plist setObject:newVersionNumber forKey:versionNumberIDKey]; + + NSData *xmlData = [NSPropertyListSerialization dataWithPropertyList:plist format:options options:kCFPropertyListImmutable error:nil]; + + return [xmlData writeToFile:filePath atomically:YES]; + + } + + return NO; +} - (void)doProvisioning { NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[workingPath stringByAppendingPathComponent:kPayloadDirName] error:nil]; @@ -706,6 +847,24 @@ - (IBAction)changeBundleIDPressed:(id)sender { bundleIDField.enabled = changeBundleIDCheckbox.state == NSOnState; } +- (IBAction)changeVersionNumberPressed:(id)sender { + + if (sender != changeVersionNumberCheckBox) { + return; + } + + versionumberField.enabled = changeVersionNumberCheckBox.state == NSOnState; +} + +- (IBAction)changeBuildNumberPressed:(id)sender { + + if (sender != changeBuildNumberCheckBox) { + return; + } + + buildNumberField.enabled = changeBuildNumberCheckBox.state == NSOnState; +} + - (void)disableControls { [pathField setEnabled:FALSE]; [entitlementField setEnabled:FALSE];