diff --git a/README.md b/README.md index d8872cb..4a5456f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,21 @@ -## Retroactive is an app that lets you run Aperture, iPhoto, and iTunes on macOS Catalina. It also lets you run Final Cut Pro 7, Logic Pro 9, and fix Keynote ’09 on macOS Mojave and macOS High Sierra. [Click to download the Retroactive app](https://github.com/cormiertyshawn895/Retroactive/releases/download/1.5/Retroactive.1.5.zip), or [view the release page](https://github.com/cormiertyshawn895/Retroactive/releases). +### Retroactive is an app that lets you run Aperture, iPhoto, and iTunes on macOS Catalina. It also lets you run Final Cut Pro 7, Logic Pro 9, and fix Keynote ’09 on macOS Mojave and macOS High Sierra. +

+ Download Retroactive +

+

+ View Release Page +

+ +--- + +### 💡 iTunes and macOS Catalina 10.15.4 + +If you have installed iTunes on macOS Catalina with Retroactive 1.4 or earlier, and have updated to macOS Catalina 10.15.4 or later, **you need to re-install iTunes with [the latest version of Retroactive](https://github.com/cormiertyshawn895/Retroactive/releases/download/1.5/Retroactive.1.5.zip).** + +Re-installing iTunes with [the latest version of Retroactive](https://github.com/cormiertyshawn895/Retroactive/releases/download/1.5/Retroactive.1.5.zip) resolves error -42408, -45076, and 11571, so that you can continue to use Apple Music, iTunes Store, and App Store in iTunes. It also resolves an issue where iTunes cannot read the contents of a connected iOS or iPadOS device. + +--- ### Opening Retroactive @@ -43,7 +59,8 @@ If you chose iTunes, Retroactive will ask you which version to install, then aut - iTunes 12.9.5 supports Dark Mode and most DJ apps. - iTunes 12.6.5 supports downloading and archiving iOS apps. -- iTunes 10.7 (not recommended) supports CoverFlow. +- iTunes 11.4 has a classic look. +- iTunes 10.7 supports CoverFlow. If you don’t know which version to install, keep the default setting and click “Continue”. @@ -85,7 +102,11 @@ After successfully modifying or installing the app, you can play with it to your - All features should work for iTunes 12.9.5. -- All features should work for iTunes 12.6.5 except for backing up an iOS device. Use iTunes 12.9.5 or Finder to back up instead. Thumbnails of download apps may appear distorted. +- All features should work for iTunes 12.6.5 except for backing up an iOS device. Use iTunes 12.9.5 or Finder to back up your device instead. Thumbnails of download apps may appear distorted. + +- Movies and TV Shows downloaded from the iTunes Store may be unable to play in iTunes. Download or play them in the TV app instead. + +- Some dialogs in iTunes may display a crossed-out iTunes icon. This is purely cosmetic and has no functional impact. - All Final Cut Pro 7 features should work. @@ -124,6 +145,6 @@ To use editing features such as timeline and preview, install macOS Mojave on a --- ### Last words -- If GateKeeper prevents you from running modified versions of your chosen app, [temporarily disable GateKeeper in Terminal with `sudo spctl --master-disable`](http://osxdaily.com/2015/05/04/disable-gatekeeper-command-line-mac-osx/). +- If GateKeeper prevents you from running modified versions of your chosen app, [temporarily disable GateKeeper in Terminal](http://osxdaily.com/2015/05/04/disable-gatekeeper-command-line-mac-osx/) with `sudo spctl --master-disable`. - To learn more about how Retroactive works, [take a technical deep dive](https://medium.com/@cormiertyshawn895/deep-dive-how-does-retroactive-work-95fe0e5ea49e). diff --git a/Retroactive.xcodeproj/project.pbxproj b/Retroactive.xcodeproj/project.pbxproj index a38ab52..2c7a572 100644 --- a/Retroactive.xcodeproj/project.pbxproj +++ b/Retroactive.xcodeproj/project.pbxproj @@ -64,6 +64,8 @@ 60E4B4B6240207AC00919F36 /* iTunesLauncher-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 60E4B4B5240207AC00919F36 /* iTunesLauncher-Info.plist */; }; 60E4B4B8240207B400919F36 /* iTunesLauncher-PkgInfo in Resources */ = {isa = PBXBuildFile; fileRef = 60E4B4B7240207B400919F36 /* iTunesLauncher-PkgInfo */; }; 60E4B4BA240207C100919F36 /* iTunesLauncher in Resources */ = {isa = PBXBuildFile; fileRef = 60E4B4B9240207C100919F36 /* iTunesLauncher */; }; + 60E4B4D524022BF900919F36 /* OriginFixer in Resources */ = {isa = PBXBuildFile; fileRef = 60E4B4D424022BF900919F36 /* OriginFixer */; }; + 60E4B4D724022C4600919F36 /* iTunesOriginLauncher in Resources */ = {isa = PBXBuildFile; fileRef = 60E4B4D624022C4600919F36 /* iTunesOriginLauncher */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -137,6 +139,8 @@ 60E4B4B5240207AC00919F36 /* iTunesLauncher-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "iTunesLauncher-Info.plist"; sourceTree = ""; }; 60E4B4B7240207B400919F36 /* iTunesLauncher-PkgInfo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "iTunesLauncher-PkgInfo"; sourceTree = ""; }; 60E4B4B9240207C100919F36 /* iTunesLauncher */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = iTunesLauncher; sourceTree = ""; }; + 60E4B4D424022BF900919F36 /* OriginFixer */ = {isa = PBXFileReference; lastKnownFileType = folder; path = OriginFixer; sourceTree = ""; }; + 60E4B4D624022C4600919F36 /* iTunesOriginLauncher */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = iTunesOriginLauncher; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -229,6 +233,7 @@ 046034E62381C18A00070C86 /* ProKit.framework.zip */, 046034E12381B41200070C86 /* KeynoteFixer */, 32F763552364EA2200200ED7 /* ApertureFixer */, + 60E4B4D424022BF900919F36 /* OriginFixer */, 32F763532364DEA700200ED7 /* NyxAudioAnalysis */, 042E9E452381AC2B001D3F38 /* AppKit */, 042E9E482381AC2B001D3F38 /* VideoFixer */, @@ -334,6 +339,7 @@ isa = PBXGroup; children = ( 60E4B4B9240207C100919F36 /* iTunesLauncher */, + 60E4B4D624022C4600919F36 /* iTunesOriginLauncher */, 60E4B4B7240207B400919F36 /* iTunesLauncher-PkgInfo */, 60E4B4B5240207AC00919F36 /* iTunesLauncher-Info.plist */, ); @@ -406,6 +412,8 @@ 606CA12A23665CBF001C550E /* Credits.rtfd in Resources */, 606CA154236666B3001C550E /* ConfettiView.bundle in Resources */, 046034E72381C18A00070C86 /* BrowserKit.framework.zip in Resources */, + 60E4B4D524022BF900919F36 /* OriginFixer in Resources */, + 60E4B4D724022C4600919F36 /* iTunesOriginLauncher in Resources */, 046034EA2381DDB300070C86 /* ProApplicationsUpdate2010-02.dist in Resources */, 60D728A023D5787B0006F233 /* VMFCPFixerScript in Resources */, 042E9E4B2381AC2C001D3F38 /* GeneralFixerScript in Resources */, @@ -626,7 +634,7 @@ CODE_SIGN_ENTITLEMENTS = Retroactive/Support/Retroactive.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 25; INFOPLIST_FILE = Retroactive/Support/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -647,7 +655,7 @@ CODE_SIGN_ENTITLEMENTS = Retroactive/Support/Retroactive.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 25; INFOPLIST_FILE = Retroactive/Support/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", diff --git a/Retroactive/AppManager.swift b/Retroactive/AppManager.swift index 2c3f2c1..4488c87 100644 --- a/Retroactive/AppManager.swift +++ b/Retroactive/AppManager.swift @@ -19,6 +19,7 @@ enum AppType { enum iTunesVersion { case darkMode case appStore + case classicTheme case coverFlow } @@ -312,6 +313,10 @@ class AppManager: NSObject { return configurationDictionary?["iTunes126Dive"] as? String } + var iTunes114Dive: String? { + return configurationDictionary?["iTunes114Dive"] as? String + } + var iTunes107Dive: String? { return configurationDictionary?["iTunes107Dive"] as? String } @@ -362,6 +367,8 @@ class AppManager: NSObject { return configurationDictionary?["iTunes129URL"] as? String case .appStore: return configurationDictionary?["iTunes126URL"] as? String + case .classicTheme: + return configurationDictionary?["iTunes114URL"] as? String case .coverFlow: return configurationDictionary?["iTunes107URL"] as? String case .none: @@ -463,6 +470,8 @@ class AppManager: NSObject { return ["12.9.5"] case .appStore: return ["12.6.5"] + case .classicTheme: + return ["11.4"] case .coverFlow: return ["10.7"] case .none: @@ -493,6 +502,8 @@ class AppManager: NSObject { return "12.9.5" case .appStore: return "12.6.5" + case .classicTheme: + return "11.4" case .coverFlow: return "10.7" case .none: @@ -540,18 +551,8 @@ class AppManager: NSObject { case .iphoto: return "com.apple.iPhoto9" case .itunes: - switch choseniTunesVersion { - // These are intentionally left unused - case .darkMode: - return "com.apple.iTunes129" - case .appStore: - return "com.apple.iTunes126" - case .coverFlow: - return "com.apple.iTunes10" - case .none: - return "" - } - // These are intentionally left unused + // Intentionally left unused + return "com.apple.intentionally-left-unused" case .finalCutPro7: return "com.apple.FinalCutPro7" case .logicPro9: @@ -599,7 +600,7 @@ class AppManager: NSObject { case .iphoto: return "ApertureFixer" case .itunes: - return "" + return "OriginFixer" case .finalCutPro7: return "VideoFixer" case .logicPro9: @@ -632,8 +633,10 @@ class AppManager: NSObject { return "12.9.5" case .appStore: return "12.6.5" + case .classicTheme: + return "11.4" case .coverFlow: - return "12.7" + return "10.7" case .none: return "" } @@ -730,6 +733,8 @@ class AppManager: NSObject { return iTunes129Dive case .appStore: return iTunes126Dive + case .classicTheme: + return iTunes114Dive case .coverFlow: return iTunes107Dive case .none: @@ -807,9 +812,7 @@ class AppManager: NSObject { switch choseniTunesVersion { case .darkMode: return "25 minutes".localized() - case .appStore: - return "10 minutes".localized() - case .coverFlow: + case .appStore, .classicTheme, .coverFlow: return "10 minutes".localized() case .none: return "an hour".localized() @@ -883,6 +886,8 @@ class AppManager: NSObject { return nil case .appStore: return "Thumbnails of download apps may appear distorted. Use iTunes 12.9.5 or Finder to back up instead.".localized() + case .classicTheme: + return nil case .coverFlow: return nil case .none: diff --git a/Retroactive/Dependencies/OriginFixer/OriginFixer.xcodeproj/project.pbxproj b/Retroactive/Dependencies/OriginFixer/OriginFixer.xcodeproj/project.pbxproj new file mode 100644 index 0000000..0605714 --- /dev/null +++ b/Retroactive/Dependencies/OriginFixer/OriginFixer.xcodeproj/project.pbxproj @@ -0,0 +1,331 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 60E4B4CA24022A8C00919F36 /* OriginFixer.h in Headers */ = {isa = PBXBuildFile; fileRef = 60E4B4C824022A8C00919F36 /* OriginFixer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 60E4B4D224022A9600919F36 /* NSView+Fixer.h in Headers */ = {isa = PBXBuildFile; fileRef = 60E4B4D024022A9600919F36 /* NSView+Fixer.h */; }; + 60E4B4D324022A9600919F36 /* NSView+Fixer.m in Sources */ = {isa = PBXBuildFile; fileRef = 60E4B4D124022A9600919F36 /* NSView+Fixer.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 60E4B4C524022A8B00919F36 /* OriginFixer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OriginFixer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 60E4B4C824022A8C00919F36 /* OriginFixer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OriginFixer.h; sourceTree = ""; }; + 60E4B4C924022A8C00919F36 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 60E4B4D024022A9600919F36 /* NSView+Fixer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSView+Fixer.h"; sourceTree = ""; }; + 60E4B4D124022A9600919F36 /* NSView+Fixer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSView+Fixer.m"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 60E4B4C224022A8B00919F36 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 60E4B4BB24022A8B00919F36 = { + isa = PBXGroup; + children = ( + 60E4B4C724022A8C00919F36 /* OriginFixer */, + 60E4B4C624022A8B00919F36 /* Products */, + ); + sourceTree = ""; + }; + 60E4B4C624022A8B00919F36 /* Products */ = { + isa = PBXGroup; + children = ( + 60E4B4C524022A8B00919F36 /* OriginFixer.framework */, + ); + name = Products; + sourceTree = ""; + }; + 60E4B4C724022A8C00919F36 /* OriginFixer */ = { + isa = PBXGroup; + children = ( + 60E4B4C824022A8C00919F36 /* OriginFixer.h */, + 60E4B4D024022A9600919F36 /* NSView+Fixer.h */, + 60E4B4D124022A9600919F36 /* NSView+Fixer.m */, + 60E4B4C924022A8C00919F36 /* Info.plist */, + ); + path = OriginFixer; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 60E4B4C024022A8B00919F36 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 60E4B4CA24022A8C00919F36 /* OriginFixer.h in Headers */, + 60E4B4D224022A9600919F36 /* NSView+Fixer.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 60E4B4C424022A8B00919F36 /* OriginFixer */ = { + isa = PBXNativeTarget; + buildConfigurationList = 60E4B4CD24022A8C00919F36 /* Build configuration list for PBXNativeTarget "OriginFixer" */; + buildPhases = ( + 60E4B4C024022A8B00919F36 /* Headers */, + 60E4B4C124022A8B00919F36 /* Sources */, + 60E4B4C224022A8B00919F36 /* Frameworks */, + 60E4B4C324022A8B00919F36 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = OriginFixer; + productName = OriginFixer; + productReference = 60E4B4C524022A8B00919F36 /* OriginFixer.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 60E4B4BC24022A8B00919F36 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = Tyshawn; + TargetAttributes = { + 60E4B4C424022A8B00919F36 = { + CreatedOnToolsVersion = 11.3.1; + }; + }; + }; + buildConfigurationList = 60E4B4BF24022A8B00919F36 /* Build configuration list for PBXProject "OriginFixer" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 60E4B4BB24022A8B00919F36; + productRefGroup = 60E4B4C624022A8B00919F36 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 60E4B4C424022A8B00919F36 /* OriginFixer */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 60E4B4C324022A8B00919F36 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 60E4B4C124022A8B00919F36 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 60E4B4D324022A9600919F36 /* NSView+Fixer.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 60E4B4CB24022A8C00919F36 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 60E4B4CC24022A8C00919F36 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 60E4B4CE24022A8C00919F36 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = OriginFixer/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.tyshawn.OriginFixer; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 60E4B4CF24022A8C00919F36 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = OriginFixer/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.tyshawn.OriginFixer; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 60E4B4BF24022A8B00919F36 /* Build configuration list for PBXProject "OriginFixer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 60E4B4CB24022A8C00919F36 /* Debug */, + 60E4B4CC24022A8C00919F36 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 60E4B4CD24022A8C00919F36 /* Build configuration list for PBXNativeTarget "OriginFixer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 60E4B4CE24022A8C00919F36 /* Debug */, + 60E4B4CF24022A8C00919F36 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 60E4B4BC24022A8B00919F36 /* Project object */; +} diff --git a/Retroactive/Dependencies/OriginFixer/OriginFixer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Retroactive/Dependencies/OriginFixer/OriginFixer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..c735791 --- /dev/null +++ b/Retroactive/Dependencies/OriginFixer/OriginFixer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Retroactive/Dependencies/OriginFixer/OriginFixer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Retroactive/Dependencies/OriginFixer/OriginFixer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Retroactive/Dependencies/OriginFixer/OriginFixer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Retroactive/Dependencies/OriginFixer/OriginFixer.xcodeproj/xcshareddata/xcschemes/OriginFixer.xcscheme b/Retroactive/Dependencies/OriginFixer/OriginFixer.xcodeproj/xcshareddata/xcschemes/OriginFixer.xcscheme new file mode 100644 index 0000000..9f7d30e --- /dev/null +++ b/Retroactive/Dependencies/OriginFixer/OriginFixer.xcodeproj/xcshareddata/xcschemes/OriginFixer.xcscheme @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Retroactive/Dependencies/OriginFixer/OriginFixer/Info.plist b/Retroactive/Dependencies/OriginFixer/OriginFixer/Info.plist new file mode 100644 index 0000000..9f56c37 --- /dev/null +++ b/Retroactive/Dependencies/OriginFixer/OriginFixer/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSHumanReadableCopyright + Copyright © 2020 Tyshawn. All rights reserved. + + diff --git a/Retroactive/Dependencies/OriginFixer/OriginFixer/NSView+Fixer.h b/Retroactive/Dependencies/OriginFixer/OriginFixer/NSView+Fixer.h new file mode 100644 index 0000000..6e88852 --- /dev/null +++ b/Retroactive/Dependencies/OriginFixer/OriginFixer/NSView+Fixer.h @@ -0,0 +1,20 @@ +// +// NSView+Fixer.h +// OriginFixer +// +// Created by Tyshawn on 2/22/20. +// Copyright © 2020 Tyshawn. All rights reserved. +// + +#import + + + + +NS_ASSUME_NONNULL_BEGIN + +@interface NSView (Fixer) + +@end + +NS_ASSUME_NONNULL_END diff --git a/Retroactive/Dependencies/OriginFixer/OriginFixer/NSView+Fixer.m b/Retroactive/Dependencies/OriginFixer/OriginFixer/NSView+Fixer.m new file mode 100644 index 0000000..1db1a19 --- /dev/null +++ b/Retroactive/Dependencies/OriginFixer/OriginFixer/NSView+Fixer.m @@ -0,0 +1,32 @@ +// +// NSView+Fixer.m +// OriginFixer +// +// Created by Tyshawn on 2/22/20. +// Copyright © 2020 Tyshawn. All rights reserved. +// + +#import +#import "NSView+Fixer.h" +#import + +@implementation NSView (Fixer) + ++ (void)load { + Class class = [self class]; + + method_exchangeImplementations(class_getInstanceMethod([NSView class], @selector(setFrameOrigin:)), + class_getInstanceMethod(class, @selector(fix_setFrameOrigin:))); +} + +- (void)fix_setFrameOrigin:(NSPoint)newOrigin +{ + @try { + [self fix_setFrameOrigin:newOrigin]; + } + @catch (NSException *exception) { + NSLog(@"Caught exception %@ when setting frame origin to %@", exception, NSStringFromPoint(newOrigin)); + } +} + +@end diff --git a/Retroactive/Dependencies/OriginFixer/OriginFixer/OriginFixer.h b/Retroactive/Dependencies/OriginFixer/OriginFixer/OriginFixer.h new file mode 100644 index 0000000..cf31612 --- /dev/null +++ b/Retroactive/Dependencies/OriginFixer/OriginFixer/OriginFixer.h @@ -0,0 +1,19 @@ +// +// OriginFixer.h +// OriginFixer +// +// Created by Tyshawn on 2/22/20. +// Copyright © 2020 Tyshawn. All rights reserved. +// + +#import + +//! Project version number for OriginFixer. +FOUNDATION_EXPORT double OriginFixerVersionNumber; + +//! Project version string for OriginFixer. +FOUNDATION_EXPORT const unsigned char OriginFixerVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Retroactive/RetroApp.swift b/Retroactive/RetroApp.swift index 10ee039..aff12fe 100644 --- a/Retroactive/RetroApp.swift +++ b/Retroactive/RetroApp.swift @@ -5,9 +5,9 @@ import Cocoa -let itunesVersionMapping: [iTunesVersion: String] = [.darkMode: "12.9.5", .appStore: "12.6.5", .coverFlow: "10.7"] -let itunesFeatureMapping: [iTunesVersion: String] = [.darkMode: "DJ apps and Dark Mode".localized(), .appStore: "App Store".localized(), .coverFlow: "CoverFlow".localized()] -let itunesScreenshotMapping: [iTunesVersion: String] = [.darkMode: "itunes12_9", .appStore: "itunes12_6", .coverFlow: "itunes_10_7"] +let itunesVersionMapping: [iTunesVersion: String] = [.darkMode: "12.9.5", .appStore: "12.6.5", .classicTheme: "11.4", .coverFlow: "10.7"] +let itunesFeatureMapping: [iTunesVersion: String] = [.darkMode: "DJ apps and Dark Mode".localized(), .appStore: "App Store".localized(), .classicTheme: "Classic Look".localized(), .coverFlow: "CoverFlow".localized()] +let itunesScreenshotMapping: [iTunesVersion: String] = [.darkMode: "itunes12_9", .appStore: "itunes12_6", .classicTheme: "itunes11_4", .coverFlow: "itunes_10_7"] class iTunesApp: NSObject { var version: iTunesVersion! diff --git a/Retroactive/StepOne/VersionViewController.swift b/Retroactive/StepOne/VersionViewController.swift index 737a24a..c1e95bd 100644 --- a/Retroactive/StepOne/VersionViewController.swift +++ b/Retroactive/StepOne/VersionViewController.swift @@ -8,10 +8,12 @@ import Cocoa class VersionViewController: NSViewController { @IBOutlet weak var darkModeVersionView: NSView! @IBOutlet weak var appStoreVersionView: NSView! + @IBOutlet weak var classicThemeVersionView: NSView! @IBOutlet weak var coverFlowVersionView: NSView! @IBOutlet weak var nextButton: NSButton! @IBOutlet weak var darkModeButton: HoverButton! @IBOutlet weak var appStoreButton: HoverButton! + @IBOutlet weak var classicThemeButton: HoverButton! @IBOutlet weak var coverFlowButton: HoverButton! var choiceVCs: [VersionChoiceViewController] = [] @@ -23,7 +25,7 @@ class VersionViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() - let versionViews : [(NSView, HoverButton, iTunesVersion)] = [(darkModeVersionView, darkModeButton, .darkMode), (appStoreVersionView, appStoreButton, .appStore), (coverFlowVersionView, coverFlowButton, .coverFlow)] + let versionViews : [(NSView, HoverButton, iTunesVersion)] = [(darkModeVersionView, darkModeButton, .darkMode), (appStoreVersionView, appStoreButton, .appStore), (classicThemeVersionView, classicThemeButton, .classicTheme), (coverFlowVersionView, coverFlowButton, .coverFlow)] for (view, button, version) in versionViews { let choiceVC = VersionChoiceViewController.instantiate() choiceVC.itunesApp = iTunesApp(version) @@ -56,6 +58,10 @@ class VersionViewController: NSViewController { self.selectedVersion = .appStore } + @IBAction func classicThemeClicked(_ sender: Any) { + self.selectedVersion = .classicTheme + } + @IBAction func coverFlowClicked(_ sender: Any) { self.selectedVersion = .coverFlow } diff --git a/Retroactive/StepThree/ProgressViewController.swift b/Retroactive/StepThree/ProgressViewController.swift index 27927ad..5960dc1 100644 --- a/Retroactive/StepThree/ProgressViewController.swift +++ b/Retroactive/StepThree/ProgressViewController.swift @@ -361,7 +361,7 @@ class ProgressViewController: NSViewController, URLSessionDelegate, URLSessionDa self.subProgress2.inProgress = false self.subProgress3.inProgress = true if (isDownloadMode) { - self.guessProgressForTimer(approximateDuration: 5, startingPercent: 0.38, endingPercent:0.40) + self.guessProgressForTimer(approximateDuration: 5, startingPercent: isProVideoUpdate ? 0.38 : 0.70, endingPercent: isProVideoUpdate ? 0.40 : 0.88) } else { self.progressIndicator.doubleValue = 0.3 } @@ -373,7 +373,7 @@ class ProgressViewController: NSViewController, URLSessionDelegate, URLSessionDa self.subProgress3.inProgress = false self.subProgress4.inProgress = true if (isDownloadMode) { - self.guessProgressForTimer(approximateDuration: 35, startingPercent: 0.40, endingPercent: 1.0) + self.guessProgressForTimer(approximateDuration: isProVideoUpdate ? 35 : 10, startingPercent: isProVideoUpdate ? 0.40 : 0.88, endingPercent: 1.0) } else { self.progressIndicator.doubleValue = 0.4 self.guessProgressForTimer(approximateDuration: 30, startingPercent: 0.4, endingPercent: 1.0) @@ -464,8 +464,13 @@ class ProgressViewController: NSViewController, URLSessionDelegate, URLSessionDa self.guessProgressForTimer(approximateDuration: 15, startingPercent: 0.0, endingPercent: 0.4) let shaSum = self.sha256String(fileURL: URL(fileURLWithPath: dmgPath)) print("shasum is \(shaSum) for \(dmgPath)") - // Pro App 2010-02, 12.9.5, 12.6.5, 10.7 - if ["2c50f7d57d92bd783773c188de8952e2a75b81a8d886a15890d7e0164cabbb43", "defd3e8fdaaed4b816ebdd7fdd92ebc44f12410a0deeb93e34486c3d7390ffb7","7404f9b766075f45f8441cd0657f51ac227249cf205281212618dffa371c50f0", "3d92702ac8b7b2a07bcfe13cc6e0ce07c67362eb4bb2db69f3aebc0cbef27548"].contains(shaSum) { + // Pro App 2010-02, 12.9.5, 12.6.5, 11.4, 10.7 + if ["2c50f7d57d92bd783773c188de8952e2a75b81a8d886a15890d7e0164cabbb43", + "defd3e8fdaaed4b816ebdd7fdd92ebc44f12410a0deeb93e34486c3d7390ffb7", + "7404f9b766075f45f8441cd0657f51ac227249cf205281212618dffa371c50f0", + "70a8369ca794251fb22fd976eb8019001f8178d3e1d5044c22a665cca81b3fd8", + "3d92702ac8b7b2a07bcfe13cc6e0ce07c67362eb4bb2db69f3aebc0cbef27548"] + .contains(shaSum) { self.syncMainQueue { self.kickOffInstallation() } @@ -557,11 +562,8 @@ class ProgressViewController: NSViewController, URLSessionDelegate, URLSessionDa case .darkMode: self.installDarkModeiTunes() break - case .appStore: - self.installAppStoreiTunes() - break - case .coverFlow: - self.installCoverFlowiTunes() + case .appStore, .classicTheme, .coverFlow: + self.installPackagediTunes() break case .none: break @@ -626,11 +628,7 @@ class ProgressViewController: NSViewController, URLSessionDelegate, URLSessionDa self.installiTunesCommon("Packages/Core.pkg", appLocation: "Payload/Applications/iTunes.app") } - func installAppStoreiTunes() { - self.installiTunesCommon("Install iTunes.pkg", appLocation: "iTunesX.pkg/Payload/Applications/iTunes.app") - } - - func installCoverFlowiTunes() { + func installPackagediTunes() { self.installiTunesCommon("Install iTunes.pkg", appLocation: "iTunesX.pkg/Payload/Applications/iTunes.app") } @@ -664,7 +662,14 @@ class ProgressViewController: NSViewController, URLSessionDelegate, URLSessionDa self.runTask(toolPath: "/bin/mkdir", arguments: ["\(appPath)/Contents"]) self.runTask(toolPath: "/bin/mkdir", arguments: ["\(appPath)/Contents/MacOS"]) self.runTask(toolPath: "/bin/mkdir", arguments: ["\(appPath)/Contents/Resources"]) - self.runTask(toolPath: "/bin/cp", arguments: ["\(resourcePath)/iTunesLauncher", "\(appPath)/Contents/MacOS/iTunes"]) + if (AppManager.shared.choseniTunesVersion == .classicTheme) { + // iTunes 11.4 asserts when setting frame origin to {nan, nan}. Insert a library to fix it. + self.runTask(toolPath: "/bin/mkdir", arguments: ["\(appPath)/Contents/Frameworks"]) + self.runTask(toolPath: "/bin/cp", arguments: ["\(resourcePath)/iTunesOriginLauncher", "\(appPath)/Contents/MacOS/iTunes"]) + self.runTask(toolPath: "/bin/cp", arguments: ["-R", "\(resourcePath)/OriginFixer", "\(appPath)/\(AppManager.shared.fixerFrameworkSubPath)"]) + } else { + self.runTask(toolPath: "/bin/cp", arguments: ["\(resourcePath)/iTunesLauncher", "\(appPath)/Contents/MacOS/iTunes"]) + } self.runTask(toolPath: "/bin/cp", arguments: ["\(resourcePath)/iTunesLauncher-Info.plist", "\(appPath)/Contents/Info.plist"]) self.runTask(toolPath: "/bin/cp", arguments: ["\(resourcePath)/iTunesLauncher-PkgInfo", "\(appPath)/Contents/PkgInfo"]) self.runTaskAtTemp(toolPath: "/bin/cp", arguments: ["\(afterPackagePath)/Contents/Resources/iTunes.icns", "\(appPath)/Contents/Resources/iTunes.icns"]) @@ -675,13 +680,22 @@ class ProgressViewController: NSViewController, URLSessionDelegate, URLSessionDa self.stage4Started() self.runTaskAtTemp(toolPath: "/bin/cp", arguments: ["-R", afterPackagePath, "\(appPath)/Contents/MacOS/iTunes.app"]) - // Only copy additional frameworks for iTunes 10.7. Other iTunes version will break if resigned. + // Copy additional frameworks for iTunes 10.7 and iTunes 11.4. Other versions of iTunes will break with additional frameworks. if (AppManager.shared.choseniTunesVersion == .coverFlow) { self.runTaskAtTemp(toolPath: "/bin/cp", arguments: ["-R", "\(packageExtractionPath)/CoreFP.pkg/Payload/System/Library/PrivateFrameworks/CoreFP.framework", "\(inAppFrameworksPath)/CoreFP.framework"]) self.runTaskAtTemp(toolPath: "/bin/cp", arguments: ["-R", "\(packageExtractionPath)/iTunesAccess.pkg/Payload/System/Library/PrivateFrameworks/iTunesAccess.framework", "\(inAppFrameworksPath)/iTunesAccess.framework"]) self.runTaskAtTemp(toolPath: "/bin/cp", arguments: ["-R", "\(packageExtractionPath)/iTunesLibrary.pkg/Payload/System/Library/Frameworks/iTunesLibrary.framework", "\(inAppFrameworksPath)/iTunesLibrary.framework"]) self.runTaskAtTemp(toolPath: "/bin/cp", arguments: ["-R", "\(packageExtractionPath)/MobileDevice.pkg/Payload/System/Library/PrivateFrameworks/DeviceLink.framework", "\(inAppFrameworksPath)/DeviceLink.framework"]) } + + if (AppManager.shared.choseniTunesVersion == .classicTheme) { + self.runTaskAtTemp(toolPath: "/bin/cp", arguments: ["-R", "\(packageExtractionPath)/CoreADI.pkg/Payload/System/Library/PrivateFrameworks/CoreADI.framework", "\(inAppFrameworksPath)/CoreADI.framework"]) + self.runTaskAtTemp(toolPath: "/bin/cp", arguments: ["-R", "\(packageExtractionPath)/CoreFP.pkg/Payload/System/Library/PrivateFrameworks/CoreFP.framework", "\(inAppFrameworksPath)/CoreFP.framework"]) + self.runTaskAtTemp(toolPath: "/bin/cp", arguments: ["-R", "\(packageExtractionPath)/iTunesAccess.pkg/Payload/System/Library/PrivateFrameworks/iTunesAccess.framework", "\(inAppFrameworksPath)/iTunesAccess.framework"]) + self.runTaskAtTemp(toolPath: "/bin/cp", arguments: ["-R", "\(packageExtractionPath)/iTunesX.pkg/Payload/Library/Frameworks/iTunesLibrary.framework", "\(inAppFrameworksPath)/iTunesLibrary.framework"]) + self.runTaskAtTemp(toolPath: "/bin/cp", arguments: ["-R", "\(packageExtractionPath)/MobileDevice.pkg/Payload/System/Library/PrivateFrameworks/AirTrafficHost.framework", "\(inAppFrameworksPath)/AirTrafficHost.framework"]) + self.runTaskAtTemp(toolPath: "/bin/cp", arguments: ["-R", "\(packageExtractionPath)/MobileDevice.pkg/Payload/System/Library/PrivateFrameworks/DeviceLink.framework", "\(inAppFrameworksPath)/DeviceLink.framework"]) + } self.runTaskAtTemp(toolPath: "/usr/bin/touch", arguments: [appPath]) self.runTask(toolPath: "/usr/bin/xattr", arguments: ["-d", "com.apple.quarantine", "\(appPath)"]) diff --git a/Retroactive/Support/Assets.xcassets/itunes11_4.imageset/Contents.json b/Retroactive/Support/Assets.xcassets/itunes11_4.imageset/Contents.json new file mode 100644 index 0000000..4e49f94 --- /dev/null +++ b/Retroactive/Support/Assets.xcassets/itunes11_4.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "itunes11_4.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Retroactive/Support/Assets.xcassets/itunes11_4.imageset/itunes11_4.png b/Retroactive/Support/Assets.xcassets/itunes11_4.imageset/itunes11_4.png new file mode 100644 index 0000000..802700f Binary files /dev/null and b/Retroactive/Support/Assets.xcassets/itunes11_4.imageset/itunes11_4.png differ diff --git a/Retroactive/Support/Assets.xcassets/itunes12_6.imageset/itunes12_6.png b/Retroactive/Support/Assets.xcassets/itunes12_6.imageset/itunes12_6.png index b6f1877..524e2ba 100644 Binary files a/Retroactive/Support/Assets.xcassets/itunes12_6.imageset/itunes12_6.png and b/Retroactive/Support/Assets.xcassets/itunes12_6.imageset/itunes12_6.png differ diff --git a/Retroactive/Support/Base.lproj/Main.storyboard b/Retroactive/Support/Base.lproj/Main.storyboard index f861943..e7b5a67 100644 --- a/Retroactive/Support/Base.lproj/Main.storyboard +++ b/Retroactive/Support/Base.lproj/Main.storyboard @@ -957,58 +957,99 @@ You can use {name} now. - - + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + @@ -1027,9 +1068,9 @@ You can use {name} now. - + - + @@ -1037,18 +1078,18 @@ You can use {name} now. - + - + - + - + diff --git a/Retroactive/Support/OriginFixer/Headers b/Retroactive/Support/OriginFixer/Headers new file mode 120000 index 0000000..a177d2a --- /dev/null +++ b/Retroactive/Support/OriginFixer/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/Retroactive/Support/OriginFixer/Modules b/Retroactive/Support/OriginFixer/Modules new file mode 120000 index 0000000..5736f31 --- /dev/null +++ b/Retroactive/Support/OriginFixer/Modules @@ -0,0 +1 @@ +Versions/Current/Modules \ No newline at end of file diff --git a/Retroactive/Support/OriginFixer/OriginFixer b/Retroactive/Support/OriginFixer/OriginFixer new file mode 120000 index 0000000..f9fe282 --- /dev/null +++ b/Retroactive/Support/OriginFixer/OriginFixer @@ -0,0 +1 @@ +Versions/Current/OriginFixer \ No newline at end of file diff --git a/Retroactive/Support/OriginFixer/Resources b/Retroactive/Support/OriginFixer/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/Retroactive/Support/OriginFixer/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/Retroactive/Support/OriginFixer/Versions/A/Headers/OriginFixer.h b/Retroactive/Support/OriginFixer/Versions/A/Headers/OriginFixer.h new file mode 100644 index 0000000..c4fac90 --- /dev/null +++ b/Retroactive/Support/OriginFixer/Versions/A/Headers/OriginFixer.h @@ -0,0 +1,19 @@ +// +// OriginFixer.h +// OriginFixer +// +// Created by ct on 2/22/20. +// Copyright © 2020 Tyshawn. All rights reserved. +// + +#import + +//! Project version number for OriginFixer. +FOUNDATION_EXPORT double OriginFixerVersionNumber; + +//! Project version string for OriginFixer. +FOUNDATION_EXPORT const unsigned char OriginFixerVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Retroactive/Support/OriginFixer/Versions/A/Modules/module.modulemap b/Retroactive/Support/OriginFixer/Versions/A/Modules/module.modulemap new file mode 100644 index 0000000..e0c6d2a --- /dev/null +++ b/Retroactive/Support/OriginFixer/Versions/A/Modules/module.modulemap @@ -0,0 +1,6 @@ +framework module OriginFixer { + umbrella header "OriginFixer.h" + + export * + module * { export * } +} diff --git a/Retroactive/Support/OriginFixer/Versions/A/OriginFixer b/Retroactive/Support/OriginFixer/Versions/A/OriginFixer new file mode 100755 index 0000000..45cdeca Binary files /dev/null and b/Retroactive/Support/OriginFixer/Versions/A/OriginFixer differ diff --git a/Retroactive/Support/OriginFixer/Versions/A/Resources/Info.plist b/Retroactive/Support/OriginFixer/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..bdc9328 --- /dev/null +++ b/Retroactive/Support/OriginFixer/Versions/A/Resources/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 19E234g + CFBundleDevelopmentRegion + en + CFBundleExecutable + OriginFixer + CFBundleIdentifier + com.tyshawn.OriginFixer + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + OriginFixer + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 11C504 + DTPlatformVersion + GM + DTSDKBuild + 19B90 + DTSDKName + macosx10.15 + DTXcode + 1130 + DTXcodeBuild + 11C504 + LSMinimumSystemVersion + 10.15 + NSHumanReadableCopyright + Copyright © 2020 Tyshawn. All rights reserved. + + diff --git a/Retroactive/Support/OriginFixer/Versions/A/_CodeSignature/CodeResources b/Retroactive/Support/OriginFixer/Versions/A/_CodeSignature/CodeResources new file mode 100644 index 0000000..60caa27 --- /dev/null +++ b/Retroactive/Support/OriginFixer/Versions/A/_CodeSignature/CodeResources @@ -0,0 +1,142 @@ + + + + + files + + Resources/Info.plist + + IXzzqo/6b/p1lCf4e2maddDP6Rg= + + + files2 + + Headers/OriginFixer.h + + hash2 + + Uptc1cd7ZZzDzsiHE/0/1LL3eZ2YBwuZHeJBGe8fyf0= + + + Modules/module.modulemap + + hash2 + + pJyg5VqNwsvaq2kWNhkj0q7H/wAgJhXqAc3kXOeJqSk= + + + Resources/Info.plist + + hash2 + + 1URmYfOOS9oSvW0neO5cU5U3i6ER1KJZU40nOb/o80E= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/Retroactive/Support/OriginFixer/Versions/Current b/Retroactive/Support/OriginFixer/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/Retroactive/Support/OriginFixer/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/Retroactive/Support/SupportPath.plist b/Retroactive/Support/SupportPath.plist index da7a45e..7a4f2f3 100644 --- a/Retroactive/Support/SupportPath.plist +++ b/Retroactive/Support/SupportPath.plist @@ -5,22 +5,28 @@ NewVersionVisibleTitle Retroactive 1.5 improves iTunes compatibility with macOS Catalina 10.15.4 and is available for download. NewVersionChangelog - • Resolves an issue where authenticating with Apple Music, iTunes Store, or App Store may fail with iTunes 12.9.5 and iTunes 12.6.5 running on macOS Catalina 10.15.4 (11571 and -42408). -• Resolves an issue where iTunes 10.7 may prompt to reinstall itself (-42401). + • Resolves an issue where authenticating with Apple Music, iTunes Store, or App Store may fail in iTunes 12.9.5 and iTunes 12.6.5 running on macOS Catalina 10.15.4 (-42408, -45076, and 11571). +• Resolves an issue where iTunes cannot read the contents of a connected iOS or iPadOS device. +• Resolves an issue where iTunes 10.7 may prompt to reinstall itself (-42401). +• Adds support for installing iTunes 11.4. NewVersionVisibleTitlezhHans 新版本解印 1.5 改善了 iTunes 与 macOS Catalina 10.15.4 的兼容性,现已提供下载: NewVersionChangelogzhHans - • 修复了 iTunes 12.9.5 和 iTunes 12.6.5 无法在 macOS Catalina 10.15.4 下登录 Apple Music、iTunes Store 和 App Store (11571 和 -42408) 的问题 -• 修复了 iTunes 10.7 可能提示需要重新安装 (-42401) 的问题 + • 修复了 iTunes 12.9.5 和 iTunes 12.6.5 无法在 macOS Catalina 10.15.4 下登录 Apple Music、iTunes Store 和 App Store (-42408、-45076 和 11571) 的问题 +• 修复了 iTunes 不能读取 iOS 和 iPadOS 设备内容的问题 +• 修复了 iTunes 10.7 可能提示需要重新安装 (-42401) 的问题 +• 支持安装 iTunes 11.4 NewVersionVisibleTitlezhHant 新版本解印 1.5 改善了 iTunes 與 macOS Catalina 10.15.4 的兼容性,現已提供下載: NewVersionChangelogzhHant - • 修復了 iTunes 12.9.5 和 iTunes 12.6.5 無法在 macOS Catalina 10.15.4 下登錄 Apple Music、iTunes Store 和 App Store (11571 和 -42408) 的問題 -• 修復了 iTunes 10.7 可能提示需要重新安裝 (-42401) 的問題 + • 修復了 iTunes 12.9.5 和 iTunes 12.6.5 無法在 macOS Catalina 10.15.4 下登錄 Apple Music、iTunes Store 和 App Store (-42408、-45076 和 11571) 的問題 +• 修復了 iTunes 無法讀取 iOS 和 iPadOS 設備內容的問題 +• 修復了 iTunes 10.7 可能提示需要重新安裝 (-42401) 的問題 +• 支持安裝 iTunes 11.4 LatestZIP https://github.com/cormiertyshawn895/Retroactive/releases/download/1.5/Retroactive.1.5.zip LatestBuildNumber - 22 + 25 SupportPathURL https://raw.githubusercontent.com/cormiertyshawn895/Retroactive/master/Retroactive/Support/SupportPath.plist ReleasePage @@ -43,6 +49,8 @@ http://swcdn.apple.com/content/downloads/17/32/061-26589-A_8GJTCGY9PC/25fhcu905eta7wau7aoafu8rvdm7k1j4el/InstallESDDmg.pkg iTunes107URL http://appldnld.apple.com/iTunes10/041-7195.20120912.d3uzQ/iTunes10.7.dmg + iTunes114URL + https://secure-appldnld.apple.com/iTunes11/031-06978.20140909.HuRRe/iTunes11.4.dmg iTunes126URL https://secure-appldnld.apple.com/itunes12/091-87821-20180912-69177170-B085-11E8-B6AB-C1D03409AD2A/iTunes12.6.5.dmg ApertureDive @@ -53,6 +61,8 @@ https://forums.macrumors.com/threads/itunes-12-6-5-3-on-macos-catalina-10-15.2184518/page-4?post=27843550#post-27843550 iTunes126Dive https://forums.macrumors.com/threads/itunes-12-6-5-3-on-macos-catalina-10-15.2184518/page-4?post=27807492#post-27807492 + iTunes114Dive + https://osxdaily.com/2014/10/26/downgrades-itunes-12/ iTunes107Dive https://forums.macrumors.com/threads/how-to-safely-re-install-itunes-10-7-in-mavericks.1667115/ iWork09DVD diff --git a/Retroactive/Support/iTunesLauncher/iTunesOriginLauncher b/Retroactive/Support/iTunesLauncher/iTunesOriginLauncher new file mode 100755 index 0000000..691b47b --- /dev/null +++ b/Retroactive/Support/iTunesLauncher/iTunesOriginLauncher @@ -0,0 +1,8 @@ +#!/bin/bash +iTunes_PATH="`dirname "${0}"`" +iTunes_BIN=$iTunes_PATH/iTunes.app/Contents/MacOS/iTunes +export DYLD_FRAMEWORK_PATH="${iTunes_PATH}/iTunes.app/Contents/Frameworks" +export DYLD_LIBRARY_PATH="${iTunes_PATH}/iTunes.app/Contents/Frameworks" +export DYLD_INSERT_LIBRARIES="${iTunes_PATH}/../Frameworks/OriginFixer.framework/Versions/A/OriginFixer" + +"$iTunes_BIN" diff --git a/Retroactive/Support/zh-Hans.lproj/Localizable.strings b/Retroactive/Support/zh-Hans.lproj/Localizable.strings index 54fb400..014be1f 100644 --- a/Retroactive/Support/zh-Hans.lproj/Localizable.strings +++ b/Retroactive/Support/zh-Hans.lproj/Localizable.strings @@ -117,3 +117,4 @@ "VMware Fusion" = " VMware Fusion 虚拟机"; "Parallels Desktop" = " Parallels Desktop 虚拟机"; "a virtual machine" = "虚拟机"; +"Classic Look" = "经典外观"; diff --git a/Retroactive/Support/zh-Hant.lproj/Localizable.strings b/Retroactive/Support/zh-Hant.lproj/Localizable.strings index 04fc879..e89f067 100644 --- a/Retroactive/Support/zh-Hant.lproj/Localizable.strings +++ b/Retroactive/Support/zh-Hant.lproj/Localizable.strings @@ -117,3 +117,4 @@ "VMware Fusion" = " VMware Fusion 虛擬機"; "Parallels Desktop" = " Parallels Desktop 虛擬機"; "a virtual machine" = "虛擬機"; +"Classic Look" = "經典外觀"; diff --git a/screenshots/resources/button.sketch b/screenshots/resources/button.sketch new file mode 100644 index 0000000..962a02f Binary files /dev/null and b/screenshots/resources/button.sketch differ diff --git a/screenshots/resources/download-button.png b/screenshots/resources/download-button.png new file mode 100644 index 0000000..5a10260 Binary files /dev/null and b/screenshots/resources/download-button.png differ diff --git a/screenshots/resources/release-button.png b/screenshots/resources/release-button.png new file mode 100644 index 0000000..0198971 Binary files /dev/null and b/screenshots/resources/release-button.png differ