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
是否可以将小部件扩展包含到部署目标为 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