Fixes potentially incorrect bundle identifier when resigning/refreshing AltStore

This commit is contained in:
Riley Testut
2020-03-30 15:18:10 -07:00
parent 197c3b3338
commit 45737250a7

View File

@@ -117,12 +117,10 @@ extension FetchProvisioningProfilesOperation
{ {
DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in
let preferredBundleID: String let preferredBundleID: String?
// Check if we have already installed this app with this team before. // Check if we have already installed this app with this team before.
let predicate = NSPredicate(format: "%K == %@ AND %K == %@", let predicate = NSPredicate(format: "%K == %@", #keyPath(InstalledApp.bundleIdentifier), app.bundleIdentifier)
#keyPath(InstalledApp.bundleIdentifier), app.bundleIdentifier,
#keyPath(InstalledApp.team.identifier), team.identifier)
if let installedApp = InstalledApp.first(satisfying: predicate, in: context) if let installedApp = InstalledApp.first(satisfying: predicate, in: context)
{ {
#if DEBUG #if DEBUG
@@ -139,14 +137,36 @@ extension FetchProvisioningProfilesOperation
#else #else
// This app is already installed, so use the same resigned bundle identifier as before. // Teams match if installedApp.team has same identifier as team,
// This way, if we change the identifier format (again), AltStore will continue to use // or if installedApp.team is nil but resignedBundleIdentifier contains the team's identifier.
// the old bundle identifier to prevent it from installing as a new app. let teamsMatch = installedApp.team?.identifier == team.identifier || (installedApp.team == nil && installedApp.resignedBundleIdentifier.contains(team.identifier))
preferredBundleID = installedApp.resignedBundleIdentifier
if teamsMatch
{
// This app is already installed with the same team, so use the same resigned bundle identifier as before.
// This way, if we change the identifier format (again), AltStore will continue to use
// the old bundle identifier to prevent it from installing as a new app.
preferredBundleID = installedApp.resignedBundleIdentifier
}
else
{
preferredBundleID = nil
}
#endif #endif
} }
else else
{
preferredBundleID = nil
}
let bundleID: String
if let preferredBundleID = preferredBundleID
{
bundleID = preferredBundleID
}
else
{ {
// This app isn't already installed, so create the resigned bundle identifier ourselves. // This app isn't already installed, so create the resigned bundle identifier ourselves.
// Or, if the app _is_ installed but with a different team, we need to create a new // Or, if the app _is_ installed but with a different team, we need to create a new
@@ -157,11 +177,11 @@ extension FetchProvisioningProfilesOperation
if app.bundleIdentifier == StoreApp.altstoreAppID || app.bundleIdentifier == StoreApp.alternativeAltStoreAppID if app.bundleIdentifier == StoreApp.altstoreAppID || app.bundleIdentifier == StoreApp.alternativeAltStoreAppID
{ {
// Use legacy bundle ID format for AltStore. // Use legacy bundle ID format for AltStore.
preferredBundleID = "com.\(team.identifier).\(app.bundleIdentifier)" bundleID = "com.\(team.identifier).\(app.bundleIdentifier)"
} }
else else
{ {
preferredBundleID = app.bundleIdentifier.replacingOccurrences(of: parentBundleID, with: updatedParentBundleID) bundleID = app.bundleIdentifier.replacingOccurrences(of: parentBundleID, with: updatedParentBundleID)
} }
} }
@@ -177,7 +197,7 @@ extension FetchProvisioningProfilesOperation
} }
// Register // Register
self.registerAppID(for: app, name: preferredName, bundleIdentifier: preferredBundleID, team: team, session: session) { (result) in self.registerAppID(for: app, name: preferredName, bundleIdentifier: bundleID, team: team, session: session) { (result) in
switch result switch result
{ {
case .failure(let error): completionHandler(.failure(error)) case .failure(let error): completionHandler(.failure(error))