AppShared.swift 3.38 KB
//
//  AppShared.swift
//  Runner
//
//  Created by 权海 on 2026/6/17.
//

import Foundation

let kAppId = "6747254434"

class AppShared{
    static let shared = AppShared()

    var isLogin: Bool{
        baseUrl.hasPrefix("http") && (token?.count ?? 0 > 0)
    }

    private(set) var agent = UserAgent()
    private(set) var payment = ApplePayment()

    var baseUrl: String{
        myUserInfo?.baseUrl ?? "https://api.doublefeel.cn"
    }
    var token: String?{
        myUserInfo?.token
    }
    var userId: Int?{
        myUserInfo?.userId
    }
    private(set) var myUserInfo: UserInfoModel?{
        didSet{
            WatchConnectivityService.shared.transferLoginInfo(userInfo: myUserInfo)
        }
    }

    /// 冷启动待处理的urlstring
    var unhandedUrl: String?
    
    private init(){
        login(userInfo: nil)
    }

    func login(userInfo: UserInfoModel?){
        if let userInfo{
            myUserInfo = userInfo
            return
        }
        
        guard let data = AppGroupConstants.defaults?.data(forKey: AppGroupConstants.Key.myUserInfo) else{
            return
        }
        do{
            myUserInfo = try JSONDecoder().decode(UserInfoModel.self, from: data)
        }catch{
            
        }
    }

    func logout(){
        myUserInfo = nil
        AppGroupConstants.defaults?.removeObject(forKey: AppGroupConstants.Key.myUserInfo)
    }

    func reportDeviceInfo() async{
        guard AppShared.shared.isLogin else {
            print("reportDeviceInfo not login")
            return
        }

        guard let baseURL = URL(string: AppShared.shared.baseUrl),
              let url = URL(string: "/client/doublefeel/user/device/", relativeTo: baseURL)?.absoluteURL else {
            print("error invalid baseUrl \(AppShared.shared.baseUrl)")
            return
        }
        /// 推送平台 choices: [(1, '小米'), (2, '华为'), (3, 'oppo'), (4, 'vivo'), (5, '荣耀'), (100, '苹果')]
        var params: [String: String] = ["push_platform": "100"]
        params["device_info"] = AppShared.shared.agent.deviceInfo
        params["device_token"] = AppGroupConstants.defaults?.string(forKey: AppGroupConstants.Key.appDeviceToken)
        params["watch_device_token"] = AppGroupConstants.defaults?.string(forKey: AppGroupConstants.Key.watchDeviceToken)

        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.timeoutInterval = 30
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("application/json", forHTTPHeaderField: "Accept")
        request.setValue(AppShared.shared.token, forHTTPHeaderField: "access_token")
        request.setValue(AppShared.shared.agent.finalUA, forHTTPHeaderField: "User-Agent")

        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: params)
            let (data, response) = try await URLSession.shared.data(for: request)
            guard let httpResponse = response as? HTTPURLResponse else {
                return
            }

            let bodyText = String(data: data, encoding: .utf8) ?? ""
            print("upload device info status=\(httpResponse.statusCode), body=\(bodyText)")

            guard (200..<300).contains(httpResponse.statusCode) else {
                return
            }
        } catch {
            print("upload device info failed: \(error.localizedDescription)")
        }

    }
}