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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:36:58