iOS - 使用部署目标 < 14 的应用发布小部件扩展

iOS - Ship Widget Extension with app having deployment target < 14

是否可以将小部件扩展包含到部署目标为 10.3.2 的主机应用程序中?

想法是 - 如果设备支持扩展(即具有 iOS >= 14),则应使用该小部件,否则不支持(iOS < 14)。

问题是,如果小部件的部署版本与主机的不同,则甚至无法编译小部件目标 - 它们应该相同 (>= 14)。

如果不是我们有这样的错误,我想是因为用于编译新旧部署目标的 Swift 版本不同。扩展至少需要 Swift 5.1 支持小部件中使用的不透明类型(some 属性)。

Undefined symbol: _swift_getOpaqueTypeConformance
Undefined symbol: _swift_getTypeByMangledNameInContextInMetadataState

上面的障碍似乎是最重要的障碍,它阻止了我的 SwiftUI 为较旧的 运行 时间构建扩展,因为否则我可以使用 @available(iOS 14.0, *)整个扩展以抑制有关不兼容性的错误。

所以我的另一个想法是使用具有 iOS 14 的其他主机目标构建小部件,然后将生成的 appex 包复制到支持 iOS 10.3.2 的真实目标,但我仍然不知道它是否有效并值得一试。

欢迎提出任何建议

UPD

找到 this thread 类似的解决方案

Xcode was auto-resolving WidgetKit and implicitly adding it as a required framework. Adding it manually as an optional framework fixed the issue.

但我其实不明白我应该在哪里添加WidgetKit“手动作为可选框架”?

UPD 2

我也使用 Link Binary With Libraries 状态为 Optional 的构建阶段手动将 WidgetKit 添加到主机目标,并对小部件目标进行了相同的操作,但也没有帮助,错误保持不变。

好奇点: 如果我清理项目并重建它,它会编译成功,但只有第一次,如果我 运行 第二次构建,就会出现以上错误再次发生。

UPD 3

OK,接近黑暗之心。使用 Objective C(就像在我的主项目中一样)主机 10.3.2 目标和小部件 14.1 目标从头开始创建一个测试项目,它无需额外设置即可工作。

问题似乎出在 Cocoapods 中,我最初在其中使用了这样的嵌套目标

target 'Host' do
    shared_pods

    target 'Widget' do
        inherit! :search_paths
    end
end

我所做的是移出小部件目标 romoving prefs 继承,现在构建它(但没有 pods!)

target 'Host' do
    shared_pods
end

target 'Widget' do
    shared_pods # another errors uhhh
end

下一个挑战是让小部件使用主机应用程序使用的pods

UPD 4

尝试add/remove $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME) 对所有受影响的目标进行各种组合 - 没有成功。 添加 swift-5.2 但如果 $(TOOLCHAIN_DIR)/usr/lib.

中不存在这样的目录,它应该如何工作

swift -version给了我Apple Swift version 5.3.2,但是有人说没必要在我的项目中使用这个版本

通过将 Xcode 从 12.4 升级到 12.5 并将系统升级到 Big Sur 来解决(因为 Xcode 需要它)。不知道这背后有什么魔法,也许是 Swift 版本的东西。

  • 不需要$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)
  • 小部件代码不需要 @available(iOS 14.0, *)
  • 无需为 Podfile 中的 widget pod 目标使用 config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.1' post_install hook