Bubble/Bubble/AppDelegate.swift

101 lines
4.0 KiB
Swift
Raw Normal View History

2024-01-04 22:17:25 +01:00
//Made by Lumaa
import SwiftUI
import UIKit
2024-02-22 23:16:08 +01:00
import RevenueCat
2024-01-04 22:17:25 +01:00
@Observable
public class AppDelegate: NSObject, UIWindowSceneDelegate, Sendable, UIApplicationDelegate {
public var window: UIWindow?
public private(set) var windowWidth: CGFloat = UIScreen.main.bounds.size.width
public private(set) var windowHeight: CGFloat = UIScreen.main.bounds.size.height
2024-02-22 23:16:08 +01:00
public private(set) var secret: [String: String] = [:]
public static var premium: Bool = false
public func scene(_ scene: UIScene, willConnectTo _: UISceneSession, options _: UIScene.ConnectionOptions) {
guard let windowScene = scene as? UIWindowScene else { return }
window = windowScene.keyWindow
}
override public init() {
super.init()
2024-02-22 23:16:08 +01:00
if let path = Bundle.main.path(forResource: "Secret", ofType: "plist") {
let url = URL(fileURLWithPath: path)
let data = try! Data(contentsOf: url)
if let plist = try! PropertyListSerialization.propertyList(from: data, options: .mutableContainers, format: nil) as? [String: String] {
secret = plist
}
}
2024-09-23 18:30:45 +02:00
AppDelegate.hasPlus { subscribed in
print("User has \(!subscribed ? "no-" : "")access to Plus")
Self.premium = subscribed
}
windowWidth = window?.bounds.size.width ?? UIScreen.main.bounds.size.width
windowHeight = window?.bounds.size.height ?? UIScreen.main.bounds.size.height
Self.observedSceneDelegate.insert(self)
_ = Self.observer // just for activating the lazy static property
}
2024-02-22 23:16:08 +01:00
static func readSecret() -> [String: String]? {
if let path = Bundle.main.path(forResource: "Secret", ofType: "plist") {
let url = URL(fileURLWithPath: path)
let data = try! Data(contentsOf: url)
if let plist = try! PropertyListSerialization.propertyList(from: data, options: .mutableContainers, format: nil) as? [String: String] {
return plist
}
}
return nil
}
2024-03-23 11:17:27 +01:00
/// This function uses the REAL customer info to access the premium state
2024-10-05 13:45:41 +02:00
// static func hasPlus(completionHandler: @escaping (Bool) -> Void) {
// Purchases.shared.getCustomerInfo { (customerInfo, error) in
// guard let error else {
// let hasPrem: Bool = hasActuallyPlus(customerInfo: customerInfo)
// completionHandler(hasPrem)
// return
// }
// fatalError(error.localizedDescription)
// }
// }
2024-09-23 18:30:45 +02:00
/// This function returns a fake "true" value every time whatever the customer info is
2024-10-05 13:45:41 +02:00
static func hasPlus(completionHandler: @escaping (Bool) -> Void) {
self.premium = true
completionHandler(true)
}
2024-03-23 11:17:27 +01:00
2024-02-22 23:16:08 +01:00
private static func hasActuallyPlus(customerInfo: CustomerInfo?) -> Bool {
return customerInfo?.entitlements[PlusEntitlements.lifetime.getEntitlementId()]?.isActive == true || customerInfo?.entitlements[PlusEntitlements.monthly.getEntitlementId()]?.isActive == true || customerInfo?.entitlements[PlusEntitlements.yearly.getEntitlementId()]?.isActive == true
}
deinit {
Task { @MainActor in
Self.observedSceneDelegate.remove(self)
}
}
private static var observedSceneDelegate: Set<AppDelegate> = []
private static let observer = Task {
while true {
try? await Task.sleep(for: .seconds(0.1))
for delegate in observedSceneDelegate {
let newWidth = delegate.window?.bounds.size.width ?? UIScreen.main.bounds.size.width
if delegate.windowWidth != newWidth {
delegate.windowWidth = newWidth
}
let newHeight = delegate.window?.bounds.size.height ?? UIScreen.main.bounds.size.height
if delegate.windowHeight != newHeight {
delegate.windowHeight = newHeight
}
}
}
2024-01-04 22:17:25 +01:00
}
}