96SEO 2026-08-02 19:59 1
话说回来,
chat_bottom_container 这个插件我发布也有段时间了iOS 端一直只配了 CocoaPods走的是「预编译 xcframework + podspec 里 prepare_command 去 GitHub Releases 下载」的方案。直到最近有人提了一个支持 Swift Package Manager 的 issue。按理说,

了解完发现,从 Flutter 起。SPM 默认就是开着的,而我这插件只有 podspec,没有 Package.swift,纯 SPM 的工程自然就找不到它。其实,前后的默认行为正好反过来:
| Flutter 版本 | SPM 默认状态 | 手动开关 |
|---|---|---|
| .44以下得手动执行 flutter config --enable-swift-package-manager 才开;3.+默认开启反过来想关得设 enable-swift-package-manager: false | ||
| CocoaPods 官方仓库会从 -- 起转为只读、进入维护模式;SPM 是明摆着的未来插件迟早都得补上。不过, | ||
"老使用者担心升级 Flutter 后建立失败"是一个常见痛点。因为 podspec 与 SPM 共存可能导致兼容性问题。为此,我决定在保持 podspec 的同时添加 Package.swift。让两条方法共源,
加 SPM。要不要顺手把 podspec 换掉?结论是不能删,保留才是官方推荐做法。原因这方面,
从思路来看,新增 Package.swift。让其与 podspec 编译同一份源码、依赖同一个 xcframework,而不是二选一。老实说,除非彻底抛弃 CocoaPods,否则不应删掉它。否则对已发布公开插件来说就是 breaking change。
SPM 对目录结构有硬性要求:target 的源码默认放在 Sources/
ios/
├── chat_bottom_container/
│ ├── Package.swift 👈 新增
│ └── Sources/
│ └── chat_bottom_container/
│ ├── ChatBottomContainerPlugin.swift 👈 从 Classes/ 挪过来
│ └── FSAChatBottomContainerGeneratedApis.g.swift 👈 pigeon 生成物
├── Frameworks/
│ └── FSAChatBottomContainer.xcframework
└── chat_bottom_container.podspec
⚠️ 一旦迁移错误。只能通过 Podfile.lock 或 XCode 日志定位到错误方法,请务必检查。不过,
随后更新 podspec 的 source_files 指向新方法:
# 改前 - s.source_files = 'Classes/**/*'
# 改后 + s.source_files = 'chat_bottom_container/Sources/chat_bottom_container/**/*.swift'
Pigeon 输出方法写死在 pigeons/bottom_container.dart 里。文件搬走后如重新跑一次 Pigeon,会照旧方法生成孤儿文件,为避免未来出现编译错误,需要同步改:
// 改前 - swiftOut: 'ios/Classes/FSAChatBottomContainerGeneratedApis.g.swift',// 改后 + swiftOut: 'ios/chat_bottom_container/Sources/chat_bottom_container/FSAChatBottomContainerGeneratedApis.g.swift'。
// swift-tools-version:4.0
import PackageDescription
let package = Package(
说到name,"chat_bottom_container",platforms:,products:,dependencies:,targets:
)
]
)
"老使用者担心最低程序版本被拉高"这一痛点值得注意。 将 podspec 与 Package.swift 两边统一抬到相同 iOS 最低版本:
s.platform = :ios。'' # podspec
// Swift:
platforms: # Package.swift
# 提示:如果只改 one side,可能导致两边建立行为不同步,引发奇怪 bug!请双重确认,”
Spm 建立时会生成本地缓存和锁文件,这些不该提交至 repo。请在 ios/.gitignore 中加入三行忽略:
/.build/
/.spm/
/.build/.swiftpm/Package.resolved
三、验证
CocoaPods 模式:先保证没坑到老使用者
bash
cd packages/chat_bottom_container/exampleflutter \
config --no-enable-swift-package-manager # 确保关闭 SPM \
flutter clean \
cd ios && rm -rf Pods Podfile.lock && pod install && cd .. \
flutter build ios --simulator --debug
-
- 检查 example/ios/Podfile.lock 是否列出 chat_bottom_container.
-
- example/ios/Pods 下是否存在对应目录.
-
- Frameworks/FSAChatBottomContainer.xcframework 是否已由 prepare_command 下载.
-
- 能否编译成功至新迁移后的 Swift 源码.
.
SPM 模式:再证明新功能真的生效
bash
cd packages/chat_bottom_container/exampleflutter \
config --enable-swift-package-manager # 开启 SPM \
flutter clean \
cd ios && rm -rf Pods Podfile.lock && cd .. \
flutter build ios --simulator --debug
-
- 查看 example/ios/Flutter/ephemeral/.../FlutterGeneratedPluginSwiftPackage/Package.swift 中是否包含 `.package`。不过,
-
- Podfile.lock 中 **不存在** chat_bottom_container。
.
-
- 建立日志中出现 `Downloading binary artifact ...ios_0..zip`。怎么说呢,
.
-
- XCode DerivedData 下可找到下载并解压后的 xcframework .
.
:
最省事的方法是检查 PODFILE.LOCK 里是否含有该插件名:\
\
-
- 有 → 正在使用 CocoaPods;不过,
\
-
- 没有且应用正常 → 正在使用 SPM.
\
\\\\
:
• 忘记关闭SMP后运行 `flutter run` 会残留旧配置。需要
`flutter clean` 并手动清理 XCode 中的 SwiftPackageDependency。• 更新 xcframework 时如果仅改了 Podspec 或仅改了 Package swift。将导致两条方法不同步,出现不可预料错误。\\\\
: 同步修改所有相关字段,并两种模式均可成功建立。<\/div>
四、最终
版本兼容边界
集成方式
所需 Flutter 最低版本
说明
CocoaPods 无特殊要求
=
行为与以前完全一致,不受任何影响。老使用者无需担忧升级流程即可继续使用 CocoaPods。不过,
*?
*?
*?
*?
*?
*?
*?
*?*,-->
---
---
---
---
---
---
---
---
---
---
---
---
---
---
---
----?,?盆VÿÐ
盆׈
ç
--
—-
---
---
--
—-
————
———–
––––––!—–,
👉 点击查看完整表格链接及代码实现细节!👉 ♂️👆📚🖱️🗂️💻📦🚀✂️💬🔗🌐🛠️⌨️🏗️🧩🎯😃🙌🤓🤖💡👨💻👩💻🔧🛠️🚀🎉🍾🥂🏆👏🎊✨🔥🌟💎🌈📦✅⏳🕒🎤🚨🔐⚙️🚨🛑🔥✨⭐️☑️❌✔️➕➖✏️✂🏼👍👎🔁🔃↪︎↩︎➡︎⬅︎⇌↺↸⬇︎⬆︎⬅︎➡︎⬆↓↕⇅⇧⇩⏬⏫⏭⏮⏯⏮▶◀▶▶◀◼▶◻▶▸▾▾▸▴◉◉✶☚☞✉☘🐾🐶🐱🐭🐹🐰🐻🐼🐸🌍🌞🌜⭐★☆⚽⚾🏀🏐🏒🏑⚽🥎⚾🏓🥊🥋🤿🥵😱👿😤🤬😰😶🙃😥😂🤣🙈🙉🙊🙏🤝👍👏😉😊😘❤️😍😚😜👣🍰🍕🍔🍟🥪🍜🍲🍝🍣🍱🥗🥘🎂☕ 🍵 🍺 🍷 🥃 ☘ 🍼 🍫 🎁 🎉 🎊 😢😭😭😭😭😭😭😭😭😭😭 😤🤯🙏😁😂🤣😉🙃😊🙂🙁 🙌 🌞 ☁ ☂ ❄ ☃ 🌙 ★ ☆ ✨ 💫 🔥 ⚡ 💡 🌓 ⛄ 🌈 🌞 🌇 🌉 🌇 💐 🌹 🚕 🚙 🚗 🚚 🚛 🚓🚕🚦🚧🚓 🚦🚧 📺 🎤 🎶 📷 📺 📺 📲📲📲 '。
支持 SPM 的步骤清单:
-
源码挪到 Sources/
/ 布局,并同步修改 podspec 的 source_files 方法;
-
将 Pigeon 等代码生成工具的输出方法同步更新,以免留下孤儿文件;
-
若未同步。将导致每次跑 Pigeon 时产生多余文件,最终报错。不过,<\/ul>
-
新增 Package.swift。并 checksum,
-
binaryTarget 必须带校验和,否则安装失败。<\/ul>
-
借助 FlutterFramework 获取 Flutter 模块,并据此设置最低依赖下限至 Flutter+;
-
Future-proofing,但需确保所有开发者均满足条件。按理说,<\/ul>
You should also add a README section outlining se steps so that future contributors can follow m quickly.
<\/div>
This completes our guide on adding Swift PM support while keeping CocoaPod compatibility intact.
If you have furr questions or run into issues during your own plugin migration。feel free to reach out via GitHub issues or Discord.
Happy coding!不过,
<\/div>
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback