You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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项目中可正常获取测试产品列表。

疑问如下:

  1. DYLIB是否无法对接StoreKit 2测试系统?
  2. 是仅测试模式有问题,真实环境可正常运行?
  3. 还是DYLIB根本无法实现StoreKit相关功能?
  4. 或是我的代码存在问题?

若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本身不支持,大概率是配置或代码细节问题:

  1. StoreKit配置文件关联问题:macOS应用使用本地StoreKit配置文件时,必须确保**主程序(而非DYLIB)**的目标正确关联了配置文件。StoreKit测试配置绑定到主应用的签名和目标,DYLIB作为动态库不会单独读取自身配置。
  2. 主程序权限与签名:macOS应用需开启In-App Purchase权限,测试时使用正确的开发者签名。若主程序通过Lazarus/FPC打包,需确保打包时的签名配置包含内购权限,且与Xcode中DYLIB的签名一致。
  3. 代码细节问题:
    • 确认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:55:26