diff --git a/AltStore/Managing Apps/AppManager.swift b/AltStore/Managing Apps/AppManager.swift index 614c8ce3..4eb342ea 100644 --- a/AltStore/Managing Apps/AppManager.swift +++ b/AltStore/Managing Apps/AppManager.swift @@ -478,7 +478,7 @@ private extension AppManager return group } - private func _install(_ app: AppProtocol, operation: AppOperation, group: RefreshGroup, completionHandler: @escaping (Result) -> Void) -> Progress + private func _install(_ app: AppProtocol, operation: AppOperation, group: RefreshGroup, additionalEntitlements: [ALTEntitlement: Any]? = nil, completionHandler: @escaping (Result) -> Void) -> Progress { let progress = Progress.discreteProgress(totalUnitCount: 100) @@ -542,6 +542,7 @@ private extension AppManager /* Fetch Provisioning Profiles */ let fetchProvisioningProfilesOperation = FetchProvisioningProfilesOperation(context: context) + fetchProvisioningProfilesOperation.additionalEntitlements = additionalEntitlements fetchProvisioningProfilesOperation.resultHandler = { (result) in switch result { diff --git a/AltStore/Operations/FetchProvisioningProfilesOperation.swift b/AltStore/Operations/FetchProvisioningProfilesOperation.swift index dfffd645..2110e0a4 100644 --- a/AltStore/Operations/FetchProvisioningProfilesOperation.swift +++ b/AltStore/Operations/FetchProvisioningProfilesOperation.swift @@ -16,6 +16,8 @@ class FetchProvisioningProfilesOperation: ResultOperation<[String: ALTProvisioni { let context: AppOperationContext + var additionalEntitlements: [ALTEntitlement: Any]? + private let appGroupsLock = NSLock() init(context: AppOperationContext) @@ -300,14 +302,20 @@ extension FetchProvisioningProfilesOperation func updateFeatures(for appID: ALTAppID, app: ALTApplication, team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result) -> Void) { - let requiredFeatures = app.entitlements.compactMap { (entitlement, value) -> (ALTFeature, Any)? in + var entitlements = app.entitlements + for (key, value) in additionalEntitlements ?? [:] + { + entitlements[key] = value + } + + let requiredFeatures = entitlements.compactMap { (entitlement, value) -> (ALTFeature, Any)? in guard let feature = ALTFeature(entitlement: entitlement) else { return nil } return (feature, value) } var features = requiredFeatures.reduce(into: [ALTFeature: Any]()) { $0[$1.0] = $1.1 } - if let applicationGroups = app.entitlements[.appGroups] as? [String], !applicationGroups.isEmpty + if let applicationGroups = entitlements[.appGroups] as? [String], !applicationGroups.isEmpty { features[.appGroups] = true } @@ -348,8 +356,14 @@ extension FetchProvisioningProfilesOperation func updateAppGroups(for appID: ALTAppID, app: ALTApplication, team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result) -> Void) { + var entitlements = app.entitlements + for (key, value) in additionalEntitlements ?? [:] + { + entitlements[key] = value + } + // TODO: Handle apps belonging to more than one app group. - guard let applicationGroups = app.entitlements[.appGroups] as? [String], let groupIdentifier = applicationGroups.first else { + guard let applicationGroups = entitlements[.appGroups] as? [String], let groupIdentifier = applicationGroups.first else { return completionHandler(.success(appID)) }