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

Swift含StoreKit2的单例Store类,Objective-C引用报链接错误

问题分析与解决建议

问题根源

你遇到的链接错误,核心原因是StoreKit 2的核心类型(如StoreKit.Transaction、Product.SubscriptionInfo等)是Swift专属类型,没有Objective-C兼容层。即使你的Store类继承了NSObject并添加了@objcMembers,只要类内部定义了基于这些Swift-only类型的typealias或直接引用了StoreKit 2 API,编译器就不会将这个类暴露给Objective-C,最终导致链接时找不到类符号。

解决办法

既然StoreKit 2无法直接和Objective-C兼容,我们需要通过中间桥接层隔离Swift-only逻辑,只把Objective-C需要访问的属性/方法暴露出去。具体步骤如下:

1. 拆分Store类的接口与实现

保留纯Swift的Store类处理StoreKit 2逻辑,新增一个专门给Objective-C调用的桥接类,中转所有需要跨语言访问的内容:

// Store.swift
import StoreKit

// 仅给Objective-C调用的桥接类,完全不涉及StoreKit 2类型
@available(iOS 15.0, *)
@objcMembers public class StoreBridge: NSObject {
    static let shared = StoreBridge()
    
    // 中转Store类的属性
    @objc var testing2: String {
        return Store.shared.testing2
    }
    
    // 中转Store类的方法
    @objc func initAndLoad() {
        Store.shared.initAndLoad()
    }
    
    // 其他需要暴露给Objective-C的属性/方法都在这里添加中转逻辑
}

// 纯Swift层的Store类,专注处理StoreKit 2逻辑
public class Store: ObservableObject {       
    typealias Transaction = StoreKit.Transaction
    typealias RenewalInfo = StoreKit.Product.SubscriptionInfo.RenewalInfo
    typealias RenewalState = StoreKit.Product.SubscriptionInfo.RenewalState
    
    static let shared = Store()
    var testing2 = "hello from actual Store"
    
    func initAndLoad() {
        // StoreKit 2相关业务逻辑
    }
    
    // 其他StoreKit 2相关代码
}

2. 修改Objective-C调用代码

只通过桥接类StoreBridge访问Swift层的内容,避免直接引用Store类:

#import "myapp-Swift.h"

if (@available(iOS 15.0, *)) {
    NSString *test2 = [StoreBridge shared].testing2;
    NSLog(@"%@", test2);
    [[StoreBridge shared] initAndLoad];
} else {
    // iOS 15以下版本的兼容逻辑
}

3. 额外注意事项

  • 不要尝试让Store类直接兼容Objective-C:只要类内部包含Swift-only类型,无论添加多少@objc相关标记,编译器都不会生成Objective-C桥接代码,这是苹果的设计限制。
  • 检查代码提示:Xcode可能会错误提示Store类在Objective-C中可用,但实际编译时会失败,以编译结果为准。

内容的提问来源于stack exchange,提问作者user6631314

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:15:07