From 3def65f5019d618ddbb954430f9becd3dae78c69 Mon Sep 17 00:00:00 2001 From: osy Date: Wed, 10 Jun 2020 14:58:25 -0700 Subject: [PATCH] Preserve device specific keys in Info.plist Apple's Info.plist support platform and device specific keys to augment existing keys. For example `UISupportedInterfaceOrientations~ipad` replaces `UISupportedInterfaceOrientations` when running on an iPad. By using Bundle.infoDictionary, Apple will pre-process the Info.plist and replace any key with its device specific variant. Since AltStore does not support iPad, this will strip out any iPad specific keys for the installing app. We add an extension Bundle.completeInfoDictionary that will return the original de-serialized dictionary including all the device specific keys. See: https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/AboutInformationPropertyListFiles.html#//apple_ref/doc/uid/TP40009254-SW9 # Conflicts: # AltKit/Extensions/Bundle+AltStore.swift # AltStore/Model/DatabaseManager.swift --- AltKit/Extensions/Bundle+AltStore.swift | 5 +++++ AltStore/Model/DatabaseManager.swift | 2 +- AltStore/Operations/ResignAppOperation.swift | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/AltKit/Extensions/Bundle+AltStore.swift b/AltKit/Extensions/Bundle+AltStore.swift index 37fe4374..c028b6bb 100644 --- a/AltKit/Extensions/Bundle+AltStore.swift +++ b/AltKit/Extensions/Bundle+AltStore.swift @@ -50,4 +50,9 @@ public extension Bundle let appGroup = self.appGroups.first { $0.contains(Bundle.baseAltStoreAppGroupID) } return appGroup } + + var completeInfoDictionary: [String : Any]? { + let infoPlistURL = self.infoPlistURL + return NSDictionary(contentsOf: infoPlistURL) as? [String : Any] + } } diff --git a/AltStore/Model/DatabaseManager.swift b/AltStore/Model/DatabaseManager.swift index 88d606ca..6a70c830 100644 --- a/AltStore/Model/DatabaseManager.swift +++ b/AltStore/Model/DatabaseManager.swift @@ -211,7 +211,7 @@ private extension DatabaseManager { let infoPlistURL = bundle.bundleURL.appendingPathComponent("Info.plist") - guard var infoDictionary = bundle.infoDictionary else { throw ALTError(.missingInfoPlist) } + guard var infoDictionary = bundle.completeInfoDictionary else { throw ALTError(.missingInfoPlist) } infoDictionary[kCFBundleIdentifierKey as String] = bundleID try (infoDictionary as NSDictionary).write(to: infoPlistURL) } diff --git a/AltStore/Operations/ResignAppOperation.swift b/AltStore/Operations/ResignAppOperation.swift index 314a59a1..f95b26d6 100644 --- a/AltStore/Operations/ResignAppOperation.swift +++ b/AltStore/Operations/ResignAppOperation.swift @@ -109,7 +109,7 @@ private extension ResignAppOperation { guard let identifier = bundle.bundleIdentifier else { throw ALTError(.missingAppBundle) } guard let profile = profiles[identifier] else { throw ALTError(.missingProvisioningProfile) } - guard var infoDictionary = bundle.infoDictionary else { throw ALTError(.missingInfoPlist) } + guard var infoDictionary = bundle.completeInfoDictionary else { throw ALTError(.missingInfoPlist) } infoDictionary[kCFBundleIdentifierKey as String] = profile.bundleIdentifier infoDictionary[Bundle.Info.altBundleID] = identifier @@ -148,7 +148,7 @@ private extension ResignAppOperation progress.becomeCurrent(withPendingUnitCount: 1) guard let appBundle = Bundle(url: appBundleURL) else { throw ALTError(.missingAppBundle) } - guard let infoDictionary = appBundle.infoDictionary else { throw ALTError(.missingInfoPlist) } + guard let infoDictionary = appBundle.completeInfoDictionary else { throw ALTError(.missingInfoPlist) } var allURLSchemes = infoDictionary[Bundle.Info.urlTypes] as? [[String: Any]] ?? []