加载NativeAdView.xib失败:NSInternalInconsistencyException异常求助
报错信息
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/rishabhtripathi/Library/Developer/CoreSimulator/Devices/A5B3DA12-7E52-4A44-A038-CA16AAC3A137/data/Containers/Bundle/Application/7CD08748-C2FF-47A6-8222-3C2120E8C344/TestApp.app> (loaded)' with name 'NativeAdView''
问题场景
自定义框架MyFramework中使用NativeAdView.xib,该XIB关联Google Mobile Ads SDK的GADNativeAdView类(无自定义关联类),框架依赖Google Ads SDK。打包为MyFramework.xcframework导入测试应用后,两种NIB加载方式均触发上述错误:
- 方式1:
let bundle = Bundle.main return bundle.loadNibNamed("NativeAdView", owner: nil, options: nil)?.first as? GADNativeAdView
- 方式2:
let bundle = Bundle(for: Self.self) return bundle.loadNibNamed("NativeAdView", owner: nil, options: nil)?.first as? GADNativeAdView
解决方案
1. 确认XIB被正确打包进框架
- 打开
NativeAdView.xib的文件检查器,在「目标成员资格」区域,确保勾选了你的自定义框架目标(MyFramework)。 - 进入框架的Build Phases,检查「Copy Bundle Resources」列表中是否包含
NativeAdView.xib,若没有则手动添加。
2. 修正Bundle加载逻辑
框架内的资源文件属于框架自身的Bundle,而非主APP或任意类的Bundle,需精准定位框架Bundle:
// 方法一:通过框架内的类定位(确保该类属于MyFramework) let frameworkBundle = Bundle(for: MyFrameworkMarkerClass.self) // 方法二:通过框架的Bundle ID定位 guard let frameworkBundle = Bundle(identifier: "com.yourdomain.MyFramework") else { fatalError("MyFramework Bundle 未找到") } return frameworkBundle.loadNibNamed("NativeAdView", owner: nil, options: nil)?.first as? GADNativeAdView
注:MyFrameworkMarkerClass是你框架内任意一个自定义类,用于标记框架Bundle;com.yourdomain.MyFramework替换为你框架实际的Bundle ID。
3. 检查XIB的类配置
打开NativeAdView.xib的身份检查器:
- 确认根视图的类设置为
GADNativeAdView,且「模块」选择GoogleMobileAds(而非自定义框架)。
4. 测试APP的框架导入配置
在测试APP的Build Phases > Frameworks, Libraries, and Embedded Content中,确保MyFramework.xcframework的设置为「Embed & Sign」。
内容的提问来源于stack exchange,提问作者risshh18

