Revert "Modernize check for TestFlight build" (#880)

Reverts passepartoutvpn/passepartout#875
This commit is contained in:
Davide 2024-11-16 13:54:11 +01:00 committed by GitHub
parent d724ad22d8
commit 589f2f62e0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 71 additions and 11 deletions

View File

@ -24,26 +24,86 @@
// //
import Foundation import Foundation
import StoreKit
// https://developer.apple.com/forums/thread/694461 // https://stackoverflow.com/a/32238344/784615
// https://gist.github.com/lukaskubanek/cbfcab29c0c93e0e9e0a16ab09586996
public final class SandboxChecker { public final class SandboxChecker {
public init() { public init() {
} }
public func isBeta() async -> Bool { public func isBeta() async -> Bool {
#if !DEBUG await Task.detached {
do { self.verifyBetaBuild()
guard case .verified(let tx) = try await AppTransaction.shared else { }.value
return false
} }
return tx.environment == .sandbox
} catch {
return false
} }
// MARK: Shared
private extension SandboxChecker {
// IMPORTANT: check Mac first because os(iOS) holds true for Catalyst
func verifyBetaBuild() -> Bool {
#if os(macOS) || targetEnvironment(macCatalyst)
isMacTestFlightBuild
#elseif os(iOS)
isiOSSandboxBuild
#else #else
false false
#endif #endif
} }
var bundle: Bundle {
.main
} }
}
// MARK: iOS
#if os(iOS)
private extension SandboxChecker {
var isiOSSandboxBuild: Bool {
bundle.appStoreReceiptURL?.lastPathComponent == "sandboxReceipt"
}
}
#endif
// MARK: macOS
#if os(macOS) || targetEnvironment(macCatalyst)
private extension SandboxChecker {
var isMacTestFlightBuild: Bool {
var status = noErr
var code: SecStaticCode?
status = SecStaticCodeCreateWithPath(bundle.bundleURL as CFURL, [], &code)
guard status == noErr else {
return false
}
guard let code else {
return false
}
var requirement: SecRequirement?
status = SecRequirementCreateWithString(
"anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.25.1]" as CFString,
[], // default
&requirement
)
guard status == noErr else {
return false
}
guard let requirement else {
return false
}
status = SecStaticCodeCheckValidity(
code,
[], // default
requirement
)
return status == errSecSuccess
}
}
#endif