Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
folium-app
GitHub Repository: folium-app/Folium
Path: blob/a-new-beginning/Folium-iOS/Structures/AppStoreCheck.swift
2 views
//
//  AppStoreCheck.swift
//  Folium-iOS
//
//  Created by Jarrod Norwell on 17/8/2025.
//

import Foundation

struct AppStoreCheck {
    enum Environment : Int {
        case appStore = 0, testFlight = 1, other = 2
    }
    
    static let shared = AppStoreCheck()
    
    var currentAppEnvironment: Environment {
#if targetEnvironment(simulator)
        return .other
#else
        var hasEmbeddedMobileProvision: Bool {
            Bundle.main.path(forResource: "embedded", ofType: "mobileprovision") != nil
        }
        
        if hasEmbeddedMobileProvision {
            return .other
        }
        
        var isAppStoreReceipt: Bool {
            #if targetEnvironment(simulator)
            false
            #else
            if let url = Bundle.main.appStoreReceiptURL {
                url.lastPathComponent == "sandboxReceipt"
            } else {
                false
            }
            #endif
        }
        
        if isAppStoreReceipt {
            return .testFlight
        }
        
        return .appStore
#endif
    }
    
    var debugging: Bool {
        var info = kinfo_proc()
        var size = MemoryLayout.stride(ofValue: info)
        var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()]
        let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0)
        assert(junk == 0, "sysctl failed")
        return (info.kp_proc.p_flag & P_TRACED) != 0
    }
    
    var additionalFeaturesAreAllowed: Bool {
        [.appStore, .testFlight].contains(currentAppEnvironment) || debugging
    }
}