Skip to content

Instantly share code, notes, and snippets.

@groob
Created August 23, 2021 21:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save groob/228465833830da6fefabb1bbae8aab66 to your computer and use it in GitHub Desktop.
Save groob/228465833830da6fefabb1bbae8aab66 to your computer and use it in GitHub Desktop.
func getOSVerProfile() throws -> OSVersionRequirement? {
if Utils().demoModeEnabled() {
return nil
}
guard
let osRequirements = nudgeDefaults.object(forKey: "osVersionRequirements") as? [[String:AnyObject]]
else {
// Log missing key in nudgeDefaults
return nil
}
let requirements = osRequirements.map(OSVersionRequirement.init)
guard requirements.isEmpty else {
// OSVersionRequirement.init should throw, otherwise we need another guard for .isEmpty
// If requirements is empty, but osVersionRequirements was present, it's not clear what failed.
// TODO: log something here
return nil
}
// In order, find and return
// first full version match
// first major version match
// explicitly stated "default" rule
// maximum possible required version
if let fullVersionMatch = requirements.first(where: { match in
match.targetedOSVersionsRule != nil && match.targetedOSVersionsRule == currentOSVersion
}) {
return fullVersionMatch
}
if let majorVersionMatch = requirements.first(where: { match in
match.targetedOSVersionsRule != nil && match.targetedOSVersionsRule == String(ProcessInfo().operatingSystemVersion.majorVersion)
}) {
return majorVersionMatch
}
if let defaultVersionMatch = requirements.first(where: {match in
match.targetedOSVersionsRule != nil && match.targetedOSVersionsRule == "default"
}) {
return defaultVersionMatch
}
let maxVersionMatch = try requirements.max(by: {
// Want to find max required version,
// Unfortunately requiredMinimumOSVersion is a String instead of OSVersion, which is another little yaq to shave.
let v0 = try OSVersion($0.requiredMinimumOSVersion!) // does it have to be optional?
let v1 = try OSVersion($1.requiredMinimumOSVersion!)
if v0.major != v1.major {
return v0.major < v1.major
}
return v0.minor < v1.minor
})
return maxVersionMatch
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment