diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index e168cee0..10193919 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -374,7 +374,7 @@ D55467C52A8D72C300F4CE90 /* ActiveAppsWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55467C42A8D72C300F4CE90 /* ActiveAppsWidget.swift */; }; D561B2EB28EF5A4F006752E4 /* AltSign-Dynamic in Frameworks */ = {isa = PBXBuildFile; productRef = D561B2EA28EF5A4F006752E4 /* AltSign-Dynamic */; }; D561B2ED28EF5A4F006752E4 /* AltSign-Dynamic in Embed Frameworks */ = {isa = PBXBuildFile; productRef = D561B2EA28EF5A4F006752E4 /* AltSign-Dynamic */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; - D56915062AD5D75B00A2B747 /* Regex+Permissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D56915052AD5D75B00A2B747 /* Regex+Permissions.swift */; }; + D56915072AD5E91B00A2B747 /* Regex+Permissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D56915052AD5D75B00A2B747 /* Regex+Permissions.swift */; }; D5708417292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5708416292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift */; }; D570841A2924680D00D42D34 /* OperatingSystemVersion+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5708416292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift */; }; D571ADD02A02FC7200B24B63 /* ALTAppPermission.swift in Sources */ = {isa = PBXBuildFile; fileRef = D571ADCF2A02FC7200B24B63 /* ALTAppPermission.swift */; }; @@ -1737,6 +1737,7 @@ D5893F7E2A14183200E767CD /* NSManagedObjectContext+Conveniences.swift */, D52A2F962ACB40F700BDF8E3 /* Logger+AltStore.swift */, D5B6F6A82AD75D01007EED5A /* ProcessInfo+Previews.swift */, + D56915052AD5D75B00A2B747 /* Regex+Permissions.swift */, ); path = Extensions; sourceTree = ""; @@ -3103,6 +3104,7 @@ D5F99A1A28D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift in Sources */, D5177B0D2A26944600270065 /* AltStore12ToAltStore13.xcmappingmodel in Sources */, BFAECC562501B0A400528F27 /* ALTServerError+Conveniences.swift in Sources */, + D56915072AD5E91B00A2B747 /* Regex+Permissions.swift in Sources */, BFAECC592501B0A400528F27 /* Result+Conveniences.swift in Sources */, D571ADD02A02FC7200B24B63 /* ALTAppPermission.swift in Sources */, D5E3FB9828FDFAD90034B72C /* NSError+AltStore.swift in Sources */, diff --git a/AltStore/Extensions/Regex+Permissions.swift b/AltStoreCore/Extensions/Regex+Permissions.swift similarity index 91% rename from AltStore/Extensions/Regex+Permissions.swift rename to AltStoreCore/Extensions/Regex+Permissions.swift index 18232937..0528050d 100644 --- a/AltStore/Extensions/Regex+Permissions.swift +++ b/AltStoreCore/Extensions/Regex+Permissions.swift @@ -9,7 +9,7 @@ import RegexBuilder @available(iOS 16, *) -extension Regex where Output == (Substring, Substring) +public extension Regex where Output == (Substring, Substring) { static var privacyPermission: some RegexComponent<(Substring, Substring)> { Regex { diff --git a/AltStoreCore/Model/AppPermission.swift b/AltStoreCore/Model/AppPermission.swift index 909684ee..d58fadbd 100644 --- a/AltStoreCore/Model/AppPermission.swift +++ b/AltStoreCore/Model/AppPermission.swift @@ -230,7 +230,8 @@ internal struct AppPermissions: Decodable let usageDescription = dictionary[CodingKeys.usageDescription.rawValue] - let permission = AppPermission(permission: name, usageDescription: usageDescription, type: .privacy, context: context) + let convertedName = "NS" + name + "UsageDescription" // Convert legacy privacy permissions to their NS[Privacy]UsageDescription equivalent. + let permission = AppPermission(permission: convertedName, usageDescription: usageDescription, type: .privacy, context: context) return permission } diff --git a/AltStoreCore/Protocols/ALTAppPermission.swift b/AltStoreCore/Protocols/ALTAppPermission.swift index 5db62992..be1f0e7c 100644 --- a/AltStoreCore/Protocols/ALTAppPermission.swift +++ b/AltStoreCore/Protocols/ALTAppPermission.swift @@ -6,6 +6,8 @@ // Copyright © 2023 Riley Testut. All rights reserved. // +import RegexBuilder + import AltSign extension ALTAppPermissionType @@ -156,5 +158,10 @@ extension ALTAppPrivacyPermission: ALTAppPermission { public var type: ALTAppPermissionType { .privacy } - public var synthesizedName: String? { nil } + public var synthesizedName: String? { + guard #available(iOS 16, *), let match = self.rawValue.wholeMatch(of: Regex.privacyPermission) else { return nil } + + let synthesizedNamed = String(match.1) + return synthesizedNamed + } } diff --git a/AltStoreCore/Resources/Permissions.plist b/AltStoreCore/Resources/Permissions.plist index dbf20d38..138a48ec 100644 --- a/AltStoreCore/Resources/Permissions.plist +++ b/AltStoreCore/Resources/Permissions.plist @@ -865,291 +865,291 @@ privacy - BluetoothAlways + NSBluetoothAlwaysUsageDescription name Bluetooth key - BluetoothAlways + NSBluetoothAlwaysUsageDescription symbol antenna.radiowaves.left.and.right - BluetoothPeripheral + NSBluetoothPeripheralUsageDescription name Bluetooth (Peripherals) key - BluetoothPeripheral + NSBluetoothPeripheralUsageDescription symbol antenna.radiowaves.left.and.right - Calendars + NSCalendarsUsageDescription name Calendars key - Calendars + NSCalendarsUsageDescription symbol calendar - Reminders + NSRemindersUsageDescription name Reminders key - Reminders + NSRemindersUsageDescription symbol note.text - Camera + NSCameraUsageDescription name Camera key - Camera + NSCameraUsageDescription symbol camera - Microphone + NSMicrophoneUsageDescription name Microphone key - Microphone + NSMicrophoneUsageDescription symbol mic - Contacts + NSContactsUsageDescription name Contacts key - Contacts + NSContactsUsageDescription symbol person.crop.circle - FaceID + NSFaceIDUsageDescription name Face ID key - FaceID + NSFaceIDUsageDescription symbol faceid - GKFriendList + NSGKFriendListUsageDescription name Game Center Friends List key - GKFriendList + NSGKFriendListUsageDescription symbol gamecontroller - HealthClinicalHealthRecordsShare + NSHealthClinicalHealthRecordsShareUsageDescription name Health (Clinical Records) key - HealthClinicalHealthRecordsShare + NSHealthClinicalHealthRecordsShareUsageDescription symbol heart.text.square - HealthShare + NSHealthShareUsageDescription name Health key - HealthShare + NSHealthShareUsageDescription symbol heart.text.square - HealthUpdate + NSHealthUpdateUsageDescription name Health (Add) key - HealthUpdate + NSHealthUpdateUsageDescription symbol heart.text.square - HomeKit + NSHomeKitUsageDescription name HomeKit key - HomeKit + NSHomeKitUsageDescription symbol homekit - LocationAlways + NSLocationAlwaysUsageDescription name Location (Background) key - LocationAlways + NSLocationAlwaysUsageDescription symbol location.fill - LocationAlwaysAndWhenInUse + NSLocationAlwaysAndWhenInUseUsageDescription name Location (Always) key - LocationAlwaysAndWhenInUse + NSLocationAlwaysAndWhenInUseUsageDescription symbol location.fill - Location + NSLocationUsageDescription name Location key - Location + NSLocationUsageDescription symbol location.fill - LocationWhenInUse + NSLocationWhenInUseUsageDescription name Location (When Using) key - LocationWhenInUse + NSLocationWhenInUseUsageDescription symbol location - LocationTemporary + NSLocationTemporaryUsageDescription name Location (Temporary) key - LocationTemporary + NSLocationTemporaryUsageDescription symbol location - AppleMusic + NSAppleMusicUsageDescription name Apple Music key - AppleMusic + NSAppleMusicUsageDescription symbol music.note - Motion + NSMotionUsageDescription name Motion key - Motion + NSMotionUsageDescription symbol figure.run - FallDetection + NSFallDetectionUsageDescription name Fall Detection key - FallDetection + NSFallDetectionUsageDescription symbol figure.fall - LocalNetwork + NSLocalNetworkUsageDescription name Local Network key - LocalNetwork + NSLocalNetworkUsageDescription symbol network - NearbyInteraction + NSNearbyInteractionUsageDescription name Nearby Interaction key - NearbyInteraction + NSNearbyInteractionUsageDescription symbol dot.radiowaves.left.and.right - NearbyInteractionAllowOnce + NSNearbyInteractionAllowOnceUsageDescription name Nearby Interaction (Once) key - NearbyInteractionAllowOnce + NSNearbyInteractionAllowOnceUsageDescription symbol dot.radiowaves.left.and.right - NFCReader + NFCReaderUsageDescription name NFC key - NFCReader + NSNFCReaderUsageDescription symbol sensor.tag.radiowaves.forward - PhotoLibraryAdd + NSPhotoLibraryAddUsageDescription name Photos (Add) key - PhotoLibraryAdd + NSPhotoLibraryAddUsageDescription symbol photo - PhotoLibrary + NSPhotoLibraryUsageDescription name Photos key - PhotoLibrary + NSPhotoLibraryUsageDescription symbol photo.stack - UserTracking + NSUserTrackingUsageDescription name User Tracking key - UserTracking + NSUserTrackingUsageDescription symbol location.magnifyingglass - SensorKit + NSSensorKitUsageDescription name SensorKit key - SensorKit + NSSensorKitUsageDescription symbol sensor - Siri + NSSiriUsageDescription name Siri key - Siri + NSSiriUsageDescription symbol mic.circle - SpeechRecognition + NSSpeechRecognitionUsageDescription name Speech Recognition key - SpeechRecognition + NSSpeechRecognitionUsageDescription symbol waveform.and.mic - Identity + NSIdentityUsageDescription name ID Cards key - Identity + NSIdentityUsageDescription symbol wallet.pass