SwiftUI XCFramework公共类在iOS App中无法访问的问题
XCFramework Public类型无法访问的问题解决
问题场景
创建了包含public类MyBridge和结构体DataModel的SwiftUI XCFramework,通过「Target > General > Framework, library, Embedded Content」添加到SwiftUI iOS App后,可正常导入MobileSDK,但访问MyBridge和DataModel时提示「不在作用域内」。
宿主App代码片段
import MobileSDK struct ContentView: View { var body: some View { NavigationView { // 获取完整UI视图 .navigationBarTitle(Text("Host App")) let bridge = MyBridge(dataModel: DataModel(myToken: token)) } } }
XCFramework代码片段
import Foundation import UIKit public struct DataModel { var myToken: String public init(myToken: String){ self.myToken = myToken } } public class MyBridge { private var dataModel: DataModel public init(dataModel: DataModel) { self.dataModel = dataModel } public func launch() { } }
XCFramework构建命令
xcodebuild archive -scheme MobileSDK -destination="iOS Simulator" -archivePath /tmp/Projects/iossimulator.xcarchive -derivedDataPath /tmp/Projects/iphoneos -sdk iphonesimulator SKIP_INSTALL=NO xcodebuild archive -scheme MobileSDK -destination="iOS" -archivePath /tmp/Projects/ios.xcarchive -derivedDataPath /tmp/Projects/iphoneos -sdk iphoneos SKIP_INSTALL=NO xcodebuild -create-xcframework -framework "/private/tmp/Projects/iossimulator.xcarchive/Products/Library/Frameworks/MobileSDK.framework" -framework "/private/tmp/Projects/ios.xcarchive/Products/Library/Frameworks/MobileSDK.framework" -output /tmp/Projects/MobileSDK.xcframework
排查与解决步骤
1. 修复宿主App代码语法错误
宿主App代码存在SwiftUI语法问题,导致编译报错被误判为符号不可访问:
.navigationBarTitle是视图修饰符,不能放在NavigationView的闭包内部,需移至NavigationView外部或闭包内的具体视图后- 不能在
body的视图构建代码中直接声明let变量,需将变量声明移至结构体属性中,或使用合适的属性包装器(如@State)
修正后的示例代码:
import MobileSDK struct ContentView: View { let token = "your_token_here" // 确保token已定义 let bridge: MyBridge init() { self.bridge = MyBridge(dataModel: DataModel(myToken: token)) } var body: some View { NavigationView { Text("SDK Demo") // 添加具体视图内容 .navigationBarTitle(Text("Host App")) } } }
2. 检查XCFramework的符号导出配置
在SDK的Xcode Target中,确保以下Build Settings配置正确:
- Symbols Hidden by Default:设置为
NO(默认是YES,会隐藏所有未显式标记为全局的符号,即使加了public也无法导出) - Strip Debug Symbols During Copy:设置为
NO - Strip Style:设置为
Non-Global Symbols
3. 修正XCFramework构建命令的冲突问题
两次归档命令的-derivedDataPath使用了相同路径/tmp/Projects/iphoneos,会导致第二次归档覆盖第一次的派生数据,引发架构符号缺失。需修改为不同路径:
# 模拟器归档 xcodebuild archive -scheme MobileSDK -destination="iOS Simulator" -archivePath /tmp/Projects/iossimulator.xcarchive -derivedDataPath /tmp/Projects/simulator-derived -sdk iphonesimulator SKIP_INSTALL=NO # 真机归档 xcodebuild archive -scheme MobileSDK -destination="iOS" -archivePath /tmp/Projects/ios.xcarchive -derivedDataPath /tmp/Projects/device-derived -sdk iphoneos SKIP_INSTALL=NO # 创建XCFramework xcodebuild -create-xcframework -framework "/private/tmp/Projects/iossimulator.xcarchive/Products/Library/Frameworks/MobileSDK.framework" -framework "/private/tmp/Projects/ios.xcarchive/Products/Library/Frameworks/MobileSDK.framework" -output /tmp/Projects/MobileSDK.xcframework
4. 验证XCFramework的符号导出
使用nm命令检查符号是否正确导出:
# 检查真机架构的符号 nm -gU MobileSDK.xcframework/ios-arm64/MobileSDK.framework/MobileSDK | grep MyBridge nm -gU MobileSDK.xcframework/ios-arm64/MobileSDK.framework/MobileSDK | grep DataModel
若输出包含_OBJC_CLASS_$_MyBridge、_OBJC_METACLASS_$_MyBridge及DataModel相关符号,则说明符号已正确导出。
内容的提问来源于stack exchange,提问作者Swati
相关产品推荐
相关产品推荐

