WidgetKit - API 调用

Posted

技术标签:

【中文标题】WidgetKit - API 调用【英文标题】:WidgetKit - API Calls 【发布时间】:2022-01-21 13:03:38 【问题描述】:

我正在尝试创建一个可以显示我的汽车信息的小部件。我目前正在为我的主应用程序使用 API,但也想将它包含在我的小部件中,但还没有找到方法。

如何从 API 中获取值,并在小部件中显示该值?这在WidgetKit 中是否可行?我应该在 getTimeline 函数中包含 API 调用吗?

编辑:这是我用于 API 调用的代码:

let apii = TeslaSwift()
    
   if let jsonString = UserDefaults.standard.object(forKey: "tesla.token") as? String,
       let token: AuthToken = jsonString.decodeJSON(),
       let _ = UserDefaults.standard.object(forKey: "tesla.token") as? String 
        apii.reuse(token: token, email: nil)
    
    
    apii.useMockServer = false
    apii.debuggingEnabled = true
    
    let id = UserDefaults(suiteName: "xxxx")!.string(forKey: "GlobalSelectedID")
    
    apii.getVehicle(id!).done 
        (vehicle: Vehicle) -> Void in
        
        apii.getAllData(vehicle).done  (extendedVehicle: VehicleExtended) in
            
            carState = (extendedVehicle.state!)
            batteryLevel = (extendedVehicle.chargeState?.batteryLevel)!
            interiorTemperature = (extendedVehicle.climateState?.insideTemperature!.celsius)!
            
            let formatter = DateFormatter()
            formatter.dateFormat = "dd.MM.yyyy - HH:mm:ss"
            let now = Date()
            let dateString = formatter.string(from:now)
            lastUpdated = dateString
            
        .catch  (error) in
            
            print("error1: \(error)")
        
        
    .catch  error in
        print("error2: \(error)")
    

【问题讨论】:

【参考方案1】:

您可以通过两种方式在 API 的小部件中显示值。

    从主应用程序中将数据保存在 userdefaults 中,然后在 getTimeLine 函数中从 userdefaults 中检索此数据。您需要将应用组用于共享用户默认值。在 userdefaults 中保存数据后,您可以轻松地从主应用重新加载小部件。

    来自 getTimeLine 的 API 调用

【讨论】:

我实际上已经在使用你说的第一种方式,但是由于小部件应该显示有关汽车的信息,我希望它自动更新,而无需用户打开主应用程序来获取最新的信息。 getTimeline 会在一段时间后自动调用,所以我认为从 getTimeline 调用 API 会更好地满足您的需求。 不知何故,通过在getTimeline 中添加 API 调用,我设法从 API 中获取价值,但是在我从主应用程序运行 WidgetCenter.shared.reloadAllTimelines() 之前,小部件不会显示这些值。我希望它在不打开主应用程序的情况下显示值。我错过了什么? 主应用API解析数据后最好调用reloadAllTimelines。实际上,它会在一小时或更长时间内调用 getTimeline 而不打开主应用程序,但它肯定会调用。你可以在 getTimeline 中调试并等待。 天啊,我成功了!终于..花了这么长时间,但终于。谢谢你!给你一个复选标记:)

以上是关于WidgetKit - API 调用的主要内容,如果未能解决你的问题,请参考以下文章

WidgetKit - 与文本和图像的链接

Joomla 3 Widgetkit 未显示在组件菜单中

WidgetKit 未更新

仅限于 WidgetKit 时间线条目?

我无法从 widgetKit 扩展上的应用程序中检索 xcdatamodeld 数据

在 WidgetKit 的应用程序组上存储一个数组