ce55be4a-fb5f-4981-b507-0f4.../Sources/support/HostVersionCheck.swift

47 lines
1.5 KiB
Swift
Raw Permalink Normal View History

//
// HostVersionCheck.swift
// MioIsland AirDrop Plugin
//
// Gates the plugin against a minimum host version. Plugin relies on
// the v2.2.0 panel-sizing rules (min height 120, floating back chip,
// no chrome header), so older hosts would render this plugin wrong.
//
import Foundation
enum HostVersionCheck {
static let minHost = "2.2.0"
/// Bundle.main inside a plugin dylib points to the *host* app, so
/// we can read its CFBundleShortVersionString to gate features.
static func isOK() -> Bool {
let host = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "0.0.0"
return compare(host, ">=", minHost)
}
static func hostVersion() -> String {
Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "?"
}
// MARK: - Pure semver compare
private static func compare(_ a: String, _ op: String, _ b: String) -> Bool {
let aParts = parts(a)
let bParts = parts(b)
let maxLen = max(aParts.count, bParts.count)
let ap = aParts + Array(repeating: 0, count: maxLen - aParts.count)
let bp = bParts + Array(repeating: 0, count: maxLen - bParts.count)
switch op {
case ">=": return !ap.lexicographicallyPrecedes(bp)
case "<": return ap.lexicographicallyPrecedes(bp)
case "==": return ap == bp
default: return false
}
}
private static func parts(_ s: String) -> [Int] {
s.split(separator: ".").compactMap { Int($0) }
}
}