我已将 Widgetkit 添加到我的应用程序,但现在当应用程序在 Xcode 12 beta 上启动时,它会在 iOS 13 上崩溃

I have added Widgetkit to my app but now crash on iOS 13 when the app starts on Xcode 12 beta

我已将 WidgetKit 添加到我的应用程序,但在 iOS 13 台设备上,当应用程序启动时它崩溃并出现此错误: dyld`__abort_with_payload

导致崩溃的部分代码是这样的:

static func reloadTimelines () {  
 
    if #available(iOS 14, *) {

      WidgetCenter.shared.reloadTimelines(ofKind: "com.myDomain.myApp.ProgressWidget")
   }
}

我试过其他不成功的变体,例如:

@available(iOS 14, *)
static func reloadTimelines () {

      WidgetCenter.shared.reloadTimelines(ofKind: "com.myDomain.myApp.ProgressWidget")
}

项目在 objective-c 中,我在 swift 中导入 class。

但是如果不在任何地方添加#import "myApp-Swift-h",或者不使用它 class,它就会一直崩溃。

谁能告诉我我做错了什么或发生了什么事?

提前致谢。

编辑: 我在 Xcode 11 上尝试此代码并成功!

#if canImport(WidgetKit)
   WidgetCenter.shared.reloadTimelines(ofKind: "com.literautas.StoryPlanner.ProgressWidget")
#endif

但它在 Xcode 12 beta 4

上崩溃

编辑 2:它也在 Xcode 12 beta 6

上崩溃

另一个人(谢谢你,马克)给了我解决方案。 将 WidgetKit.framework 标记为“可选”就成功了!

对于那些仍然有问题的人。试试这些改变。

进行可选导入

#if canImport(WidgetKit)
import WidgetKit
#endif

检查 iOS 版本

if #available(iOS 14, *) {
     WidgetCenter.shared.reloadAllTimelines()
 }

最后一步 - 最重要

WidgetKit 添加到 Build Phase -> Link Libraries 并使其成为 optional

我错过了最后一步,然后代码也在 iOS 13 中开始工作。

我们有

  • #if canImport(WidgetKit)
  • @available(iOS 14.0, *)
  • WidgetKit 在我们的主要目标中是可选的

崩溃仍在发生,显然甚至在 iOS 14.

我们将所有 WidgetCenter 调用移动到一个文件中,其中包含所有度量和一个附加度量:

  • NSClassFromString("WidgetKit.WidgetCenter")

出于某种原因,我们还无法解释,在某些情况下这实际上返回 nil。我们阻止了崩溃,但在那些情况下,这意味着我们无法真正使用 WidgetCenter API.