gpt4 book ai didi

iOS - Today 扩展小部件随时间清除

转载 作者:IT王子 更新时间:2023-10-29 05:44:44 29 4
gpt4 key购买 nike

理应如此

Proper situation

我们有一个今天的小部件,它最多显示 6 个按钮,具体取决于相应应用中的数据集。此数据使用应用程序组共享。如果至少配置了一个按钮,它将如上图所示显示。如果用户未登录,或者没有配置任何按钮,它将显示一条消息,如下图所示。

No buttons configured

问题

几个小时后(大约 4 到 7 小时)没有打开应用程序,小部件恢复到“未配置按钮” View 。

到目前为止的分析

从应用程序组加载数据的方式是使用如下所示的代码完成的。 ( gist for full code ) 按照我编写的方式,可以显示“未配置按钮” View 的唯一方法是 buttons 数组实际存在但长度为零。

我预计会发生缓存清除或后台服务停止之类的事情,但据我所知,应该更早地捕获异常:

  • 如果无法连接到应用程序组数据,userDefaults 应该为 nil,因此它应该显示“未登录 View ”。
  • 如果从未定义按钮,buttons 应该为 nil,因此它应该再次显示“未登录 View ”

考虑到应用程序在后台不执行任何操作,应用程序本身不能更改按钮。

我尝试在连接调试器的同时重现此问题,但问题不会重现。

有没有人知道如何解决这个问题或如何开始调试这个问题?

相关文件:

相关代码:

private struct sharedData {
static var baseUrl: String?
static var token: String?
static var phoneDeviceId: String?
static var buttons: Array<Button>?
}

func loadData() {
let groupIdentifier = "group." + NSBundle.mainBundle().bundleIdentifier!
var groupIdArray = groupIdentifier.componentsSeparatedByString(".")
groupIdArray.removeAtIndex(groupIdArray.count - 1)
let appGroupIdentifier = groupIdArray.joinWithSeparator(".");

let userDefaults = NSUserDefaults.init(suiteName: appGroupIdentifier)
if (userDefaults == nil) {
print("Error in user defaults")
setButtonTitle("Not logged in. Open Triggi to continue.")
return false
}
sharedData.baseUrl = userDefaults?.valueForKey("baseUrl") as? String
sharedData.token = userDefaults?.valueForKey("token") as? String
sharedData.phoneDeviceId = userDefaults?.valueForKey("phoneDeviceId") as? String
let buttons = userDefaults?.valueForKey("buttons") as? NSArray

if (sharedData.baseUrl == nil || sharedData.token == nil || sharedData.phoneDeviceId == nil || buttons == nil) {
print("Missing data")
setButtonTitle("Not logged in. Open Triggi to continue.")
return false
}

if (buttons?.count == 0) {
print("No buttons configured")
setButtonTitle("No buttons configured. Open Triggi to continue.")
return false;
}

// More things are done with the data here
}

最佳答案

Today Extension Controller 是一个 UIViewController,因此遵循与 UIViewController 相同的生命周期。因此,每次加载 widget 时都会调用生命周期方法 viewDidLoad()

此外,widgetPerformUpdateWithCompletionHandler 被调用:

  1. 当小部件在后台更新时
  2. 在获取小部件快照之前

因此,除了在 widgetPerformUpdateWithCompletionHandler 中调用 loadData() 之外,还可以从 viewDidLoad() 中调用它。

此外,您在哪里编写了从 superview 添加/删除 UIButtons 以及在代码中显示“未配置按钮”的代码?

关于iOS - Today 扩展小部件随时间清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44434018/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com