基于Lazarus/FPC/C的macOS应用内购:DYLIB方案问题与替代建议
问题描述
现有一个基于Lazarus/FPC/C开发的大型macOS程序(未使用Xcode),需接入macOS应用内购以提交至Apple App Store。因代码量超百万行,无法重写为Swift。
测试方案为:用Xcode编写Swift DYLIB实现StoreKit功能,由主程序链接调用。DYLIB编译成功,但使用StoreKit配置文件本地测试时始终无法发起购买:初始化Store类时,向Product类传入productIds获取[Product]数组,结果始终为空;但相同操作在iOS项目中可正常获取测试产品列表。
疑问如下:
- DYLIB是否无法对接StoreKit 2测试系统?
- 是仅测试模式有问题,真实环境可正常运行?
- 还是DYLIB根本无法实现StoreKit相关功能?
- 或是我的代码存在问题?
若DYLIB确实无法完整实现StoreKit功能,针对基于Lazarus/FPC/C的macOS应用,还有哪些接入内购的方案建议?
附上无法生成预期Product数组的代码:
@MainActor func requestProducts() async { do { // productDict包含StoreKit配置文件中创建的产品名称-ID对 log = "req values: " for v in productDict.values { // 此处确认字典中存在正确的ID log += " " + v + " " } // 尝试创建Product数组 let storeProducts = try await Product.products(for: productDict.values) log += " assigned" // 此时storeProducts应包含产品项 for product in storeProducts { log += " \(product.id)" // 此处应能遍历到创建的产品,但实际为空
问题解答
关于DYLIB与StoreKit 2的兼容性
DYLIB本身可以实现StoreKit 2功能,测试模式下无法获取产品并非DYLIB本身不支持,大概率是配置或代码细节问题:
- StoreKit配置文件关联问题:macOS应用使用本地StoreKit配置文件时,必须确保**主程序(而非DYLIB)**的目标正确关联了配置文件。StoreKit测试配置绑定到主应用的签名和目标,DYLIB作为动态库不会单独读取自身配置。
- 主程序权限与签名:macOS应用需开启
In-App Purchase权限,测试时使用正确的开发者签名。若主程序通过Lazarus/FPC打包,需确保打包时的签名配置包含内购权限,且与Xcode中DYLIB的签名一致。 - 代码细节问题:
- 确认
productDict.values中的ID与StoreKit配置文件中的产品ID完全一致(大小写、拼写均不能出错)。 - 检查
@MainActor调用上下文:若主程序从非主线程调用该异步方法,可能导致MainActor上下文异常,影响StoreKit初始化。需确保requestProducts在主线程的异步上下文中执行,或调用时显式切换到主线程。 - 补充错误捕获:你的代码未处理
catch分支,无法得知Product.products(for:)抛出的具体错误。建议添加catch块打印错误信息:catch { log += " Error: \(error.localizedDescription)" }
- 确认
测试模式与真实环境的差异
若测试模式的配置问题解决,真实环境通常可正常运行,但需注意:
- 真实环境中产品ID必须与App Connect中配置的完全一致,且应用已开启内购功能并通过审核。
- 动态库签名需与主应用一致,否则可能因权限问题导致StoreKit调用失败。
替代方案(若DYLIB方案仍无法解决)
如果Swift DYLIB方案遇到难以排查的问题,可尝试以下方式:
- 直接使用StoreKit 1的C接口:StoreKit 1提供了C语言API,可直接在FPC/C代码中调用,无需通过Swift DYLIB,更适配原生C/FPC项目。
- Xcode包装App壳:将现有Lazarus/FPC程序打包为Xcode项目中的辅助二进制,用Swift编写轻量主App壳处理StoreKit逻辑,再调用核心程序。这种方式可利用Xcode完整配置能力,确保StoreKit功能正常,且无需重写核心代码。
- Objective-C静态库:Objective-C静态库与C/FPC兼容性更好,调用更直接。可使用Objective-C封装StoreKit 2功能,编译成静态库后由主程序链接调用。
内容的提问来源于stack exchange,提问作者MMazzon
相关产品推荐
相关产品推荐

