如何让XCFramework支持额外info.plist字段?嵌入IOSSecuritySuite遇难题
问题解答
关于第一个问题
你的思路完全可行:将IOSSecuritySuite源码单独打包为XCFramework,并开启Build Libraries for Distribution选项,这是二进制依赖必须满足的要求,能保证跨版本的ABI兼容性,不会有问题。
关于第二个问题:封装LSApplicationQueriesSchemes到XCFramework的限制与解决方案
首先明确:LSApplicationQueriesSchemes是应用级别的Info.plist配置,框架(包括XCFramework)的配置无法直接作用于宿主应用。iOS系统中,每个应用的权限配置由自身的主Info.plist决定,框架的Info.plist仅用于描述框架本身的元数据,不会影响宿主应用的权限或配置,所以你直接在XCFramework里加自定义Info.plist是无效的。
给你几个可行的解决方向:
1. 通过包管理工具自动注入配置
如果你用CocoaPods分发你的XCFramework,可以在podspec中添加post_install钩子,自动修改宿主项目的Info.plist,把需要的Scheme添加进去:
post_install do |installer| installer.pods_project.targets.each do |target| next unless target.name == '你的XCFramework名称' info_plist_path = File.join(installer.pods_project.path.dirname, 'Info.plist') if File.exist?(info_plist_path) plist = Plist.parse_xml(info_plist_path) plist['LSApplicationQueriesSchemes'] ||= [] schemes = ['undecimus', 'sileo', 'zbra', 'filza', 'activator'] schemes.each do |scheme| plist['LSApplicationQueriesSchemes'] << scheme unless plist['LSApplicationQueriesSchemes'].include?(scheme) end Plist.save_plist(info_plist_path, plist) end end end
如果用Swift Package Manager,可以编写一个Build Plugin,在构建阶段自动修改宿主的Info.plist,实现类似的自动注入。
2. 修改IOSSecuritySuite的实现逻辑(无需宿主配置)
既然这些Scheme是用来检测越狱相关应用,你可以修改IOSSecuritySuite的源码,替换掉canOpenURL的调用逻辑:
- 改为检查越狱设备特有的文件路径,比如
/Applications/Sileo.app、/Applications/Filza.app等,通过FileManager.default.fileExists(atPath:)来判断,这种方式不需要LSApplicationQueriesSchemes配置。 - 或者检查进程列表,通过
sysctl获取运行中的进程,判断是否存在越狱相关进程(比如Sileo、Filza)。
这样修改后,你的XCFramework可以完全封装功能,不需要宿主做任何额外配置。
3. 文档告知+简化配置
如果上述两种方式都无法实施,最直接的方式是在你的框架文档中明确说明需要添加的配置,并提供可直接复制的plist片段,尽量降低用户的操作成本。
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

