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

iOS自定义Framework集成ARCore CocoaPod依赖真机运行崩溃

问题根因

崩溃核心是ARCore SDK包含C++实现的全局组件注册逻辑,当同时给App宿主target和自定义Framework target链接ARCore时,ARCore的完整符号会被同时打包进App主二进制和Framework动态库二进制。真机加载时动态链接器会加载两份ARCore实现,触发全局函数重复注册的断言直接崩溃;模拟器对重复符号的校验规则更宽松,因此不会触发崩溃。
其余依赖仅出现ObjC类重复警告不崩溃,是因为这类依赖没有全局强校验的注册逻辑,系统仅随机加载其中一份实现,不会主动中止进程。

可落地方案(无需修改第三方源码)

方案1:调整Podfile配置+收敛Framework公开接口(优先推荐)

之前仅给Framework配置ARCore依赖时,App侧导入Framework报No Such Module: ARCore,本质是自定义Framework的公开接口泄漏了ARCore依赖,按以下步骤调整即可:

  1. 修改Podfile,将ARCore依赖从公共抽象target层级移到Framework target内部,TestApp target不直接依赖ARCore,参考配置:
    platform :ios, '11.0'
    workspace 'Untitled.xcworkspace'
    
    abstract_target 'CommonPods' do
        # 其余无冲突的公共依赖保留在当前层级
        # pod '普通公共依赖名'
    
        target 'TestApp' do
            project 'TestApp/TestApp.xcodeproj'
            # 禁止在此处添加ARCore依赖
        end
    
        target 'Framework' do
            project 'Framework/Framework.xcodeproj'
            pod 'ARCore/AugmentedFaces', '~> 1.30.0'
        end
    end
    
  2. 执行pod install后打开Framework工程配置:
    • 检查所有public/open修饰的Swift类、方法、属性,禁止在公开接口定义中直接引用ARCore的类型,所有ARCore相关逻辑用internal/private修饰,收敛在Framework内部
    • 确认Framework target的Mach-O Type为Dynamic Library
    • 检查TestApp target的Framework Search Paths配置,确保包含$(inherited),不要手动添加ARCore相关搜索路径
      该配置下ARCore仅会被链接打包进自定义Framework二进制中,App主二进制不包含ARCore符号,不会出现重复加载问题,同时因为公开接口不泄漏ARCore类型,App侧编译时不需要直接依赖ARCore模块,不会报模块找不到的错误。

方案2:调整CocoaPods链接方式,将ARCore作为独立动态库集成

如果业务要求Framework公开接口必须暴露ARCore类型(比如合作方需要直接调用ARCore相关API),可通过动态库集成避免符号重复:

  1. 在Podfile顶部添加全局动态链接配置:
    use_frameworks! :linkage => :dynamic
    
    该配置会让CocoaPods把所有pod依赖打包为独立动态库,ARCore会作为单独的动态framework存在,App和自定义Framework都是动态引用同一份ARCore二进制,不会把ARCore符号静态编入自身,从根源避免符号重复。
  2. 执行pod install后,清理Xcode编译缓存(快捷键Shift+Command+K),删除DerivedData下对应项目的缓存文件,真机卸载旧测试包后重新编译即可。
    该方案缺点是所有CocoaPods管理的依赖都会改为动态链接,会小幅增加App冷启动耗时,不需要修改现有业务代码。

方案3:手动集成ARCore二进制,控制链接目标

如果前两种方案不适用,可手动管理ARCore二进制:

  1. 下载对应版本的ARCore xcframework包,从Podfile中移除ARCore相关pod配置
  2. 将ARCore xcframework拖入Framework工程,在Framework target的Link Binary With Libraries中添加ARCore,设置Embed属性为Do Not Embed
  3. 将同一份ARCore xcframework拖入TestApp工程,在TestApp target的Frameworks, Libraries, and Embedded Content中添加ARCore,设置Embed属性为Embed & Sign
    该方式可保证App包内仅存在一份ARCore二进制,Framework仅做动态引用,不会把ARCore符号编入自身,彻底避免重复冲突。
配置后验证步骤
  1. 项目根目录执行pod deintegrate后重新执行pod install
  2. 清空Xcode DerivedData对应项目缓存,真机卸载旧测试包
  3. 重新编译运行,类重复警告和崩溃问题会消失

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:01:10