iOS-使用具有部署目标的应用程序发布小部件扩展<;14

iOS-使用具有部署目标的应用程序发布小部件扩展<;14,ios,swift,swiftui,ios-app-extension,Ios,Swift,Swiftui,Ios App Extension,是否可以将小部件扩展包括到主机应用程序中,例如部署目标是10.3.2 这个想法是-如果设备支持扩展(即iOS>=14),它应该使用小部件,否则就不能使用(iOS=14) 如果不是这样的话,我们会有这样的错误,我想是因为用于编译较旧和较新部署目标的不同Swift版本。扩展至少需要支持小部件中使用的不透明类型(someattribute)的Swift 5.1 Undefined symbol: _swift_getOpaqueTypeConformance Undefined symbol: _sw

是否可以将小部件扩展包括到主机应用程序中,例如部署目标是10.3.2

这个想法是-如果设备支持扩展(即iOS>=14),它应该使用小部件,否则就不能使用(iOS<14)

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

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

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

因此,我的另一个想法是使用具有iOS 14的其他主机目标构建小部件,然后将生成的
appex
捆绑包复制到支持iOS 10.3.2的实际目标,但我仍然不知道它是否可行,是否值得尝试

欢迎提出任何建议

UPD

找到这样的解决方案

Xcode自动解析WidgetKit并将其隐式添加为 所需的框架。将其作为可选框架手动添加已修复 这个问题

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

UPD 2

我也使用
linkbinary With Libraries
build phase With
Optional
status手动将WidgetKit添加到宿主目标,并对widget target进行了相同的操作,这也没有帮助,错误保持不变

奇怪的是:如果我清理并重建项目,它会被成功编译,但只有第一次,如果我第二次运行building,上述错误就会再次发生

UPD 3

好的,接近黑暗的中心。用Objective C(就像在我的主项目中一样)host 10.3.2目标和widget 14.1目标从头开始创建了一个测试项目,它只需在没有额外设置的情况下工作

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

target 'Host' do
    shared_pods

    target 'Widget' do
        inherit! :search_paths
    end
end
我所做的是将widget target romoving prefs继承移出,现在就可以构建了(但没有pods!)

下一个挑战是让widget使用主机应用程序使用的pod

UPD 4

试图以各种组合向所有受影响的目标添加/删除
$(工具链目录)/usr/lib/swift-5.0/$(平台名称)
,但未成功。添加
swift-5.2
,但如果
$(TOOLCHAIN_DIR)/usr/lib
中不存在此类目录,该如何工作


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

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

  • 无需
    $(工具链目录)/usr/lib/swift-5.0/$(平台名称)
  • 小部件代码无需
    @可用(iOS 14.0,*)
  • 无需对Podfile
    post\u安装中的小部件pod目标使用
    config.build\u设置['IPHONEOS\u部署\u目标]='14.1'

Def。可能-没有答案,但是像Apollo这样的应用程序有小部件,但需要iOS 12,这绝对是可能的。我们的widget扩展目标的iOS部署目标设置为ios14.0,项目的iOS部署目标设置为ios12.0。我认为您需要在整个项目中使用相同的Swift版本,并且至少需要Swift 5。@AdamPro13您可以分享您的解决方案吗?我确实使用Swift 5实现了目标为10.3.2的主项目和目标为14.1的扩展,但是我得到了上述错误您得到了哪些错误?正如你在实验中发现的,这是绝对可能的,所以你的问题一定在其他地方,但不知道错误是怎么说的,我们不能提出很多事情。@ EmiLopelaz我战胜了这些暂时的错误,但是现在又对“代码>未定义的符号:Y-SWIFTT.……/代码>再次获得相同的错误。尝试包含一个包含C++代码的本地POD。我已经添加了一个<代码>哑.SWIFT 到那些C++ POD项目,但是没有用。
target 'Host' do
    shared_pods
end

target 'Widget' do
    shared_pods # another errors uhhh
end