AppShared.swift 2.81 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") && (userSummary?.accessToken?.count ?? 0 > 0)
    }
    
    private(set) var agent = UserAgent()
    private(set) var payment = ApplePayment()
    
    var baseUrl: String = "https://api.doublefeel.cn"
    var token: String?
    var userId: String?
    var userSummary: FlutterUserSummary?
    
    /// 冷启动待处理的urlstring
    var unhandedUrl: String?

    private init(){
        login()
    }

    func login(){
        token = AppGroupConstants.defaults?.string(forKey: AppGroupConstants.Key.token)
        userId = AppGroupConstants.defaults?.string(forKey: AppGroupConstants.Key.userId)
        if let url = AppGroupConstants.defaults?.string(forKey: AppGroupConstants.Key.baseUrl){
            baseUrl = url
        }
    }

    func logout(){
        token = nil
        userId = nil
        userSummary = nil
    }

    func reportDeviceInfo() async{
        guard AppShared.shared.isLogin else {
            print("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
        }

        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)")
        } catch {
            print("upload device info failed: \(error.localizedDescription)")
        }
    }
}