跳到主要内容

修复 iOS 小部件中最奇怪的错误/崩溃?

· 阅读需 5 分钟
GoSwiftUI
goswiftui.com

今天,当我注意到 SwitchBuddy 倒计时小部件之一出现问题时,我的一天变得相当糟糕。游戏是今天推出的,但小工具显示的是 "明天"。起初,我以为在这种情况下,我的倒计时逻辑只是稍有偏差,而我之前并没有注意到。

然后开始发生的情况是,当我删除小部件并再次添加它时,它根本不会加载即将推出的游戏数据。它显示的是占位符内容。

我认为问题出在我的代码中,也许是过滤掉了已经发布的游戏,因为这些游戏在倒计时小工具中没有什么意义。我调整了一些东西,但没有成功。进一步的测试表明,已经发布的游戏也能正常工作。除了那些今天刚刚发布的游戏外,每个游戏都工作正常。

我不知道并决定尝试使用 Console.app 进行调试。经过一番挖掘,我终于注意到小部件崩溃了。也许这是其他开发人员知道的行为 - 当小部件崩溃时它会显示占位符内容。但我认为问题出在我的条目和基础数据中。

至少对于 Console.app,我终于收到了一条错误消息。超级奇怪,但仍然有错误消息。

我不知道,于是决定尝试用 Console.app 进行调试。经过一番调查,我终于注意到,这个小部件崩溃了。也许这是其他开发者都知道的行为--当小组件崩溃时,它会显示占位符内容。但我认为问题出在我的条目和基础数据上。

至少在 Console.app 中我终于有了错误信息。

Request ended for countdown:systemMedium - error: SwiftUI.(unknown context at $1d9616ca0).CodableTextAttachment.Error.invalidAttachment - The operation couldn’t be completed. (SwiftUI.(unknown context at $1d9616ca0).CodableTextAttachment.Error error 0.)

我没能在谷歌上找到关于这个问题的任何信息。CodableTextAttachment 到底是什么?

由于这个小部件在其他游戏中工作正常,所以令人费解的是为什么会有一个 SwiftUI 的问题。

我决定咨询 ChatGPT。我没想到会有任何帮助,但我很好奇。第一个回复很笼统,但第二个回复让我转向了文本视图。

CodableTextAttachment是 SwiftUI 框架中定义的一种类型,表示文本视图的附件。它符合 Codable 协议,这意味着它可以使用 Encoder 和 Decoder 协议进行编码和解码。这允许它用于需要对数据进行编码和解码的 SwiftUI 视图,例如小部件。CodableTextAttachment 用于在 SwiftUI 应用程序的文本视图中显示图像、视频和其他类型的媒体。

果然,当我检查负责显示文本信息的行时,我看到:

Text(Image(systemName: "sparkes")) + Text("Today!")

出于某种原因,在看到这行字的几秒钟后,我确信这就是让我的小部件崩溃的问题。当发布日期不是今天时,小组件显示的只是带有适当的 info.Text的单一内容。

果不其然,我删除了这Image部分,小部件开始为刚刚发布的游戏完美工作。😵

我写这篇文章主要是为了如果有人遇到上面的错误,我的博文应该可以通过搜索到达。同时也是为了提醒我,要检查你的代码中那些 "完全有效,不需要检查 "的地方。