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.
+
+
+
+
+
+
+
+---
+
+### 💡 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