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
相关产品推荐
相关产品推荐

