背景
电脑升级MacOS 26.0,之后旧版Xcode不支持了,下载Xcode26 Beta5,运行项目后崩溃,提示:dyld[xxx]: Symbol not found: _NSUserActivityTypeBrowsingWeb
排查过程
- 在StackOverFlow上有看到说移除
CoreServices
后可以解决,但是排查后发现项目主工程并没有引用这个库 - 又有说把宏重定义
NSUserActivityTypeBrowsingWeb
改为字符串"NSUserActivityTypeBrowsingWeb"
可以解决,但是搜索后,项目工程中没有使用这个字符串 - 怀疑是项目Pods中三方库使用了这个宏,通过grep搜索后发现太多了,促使三方库开发者更新不限时。
- 最后发现,有说把
Foundation.framework
在链接参数中位置提到CoreServices
的前面可以解决,经过尝试确认方法有效。
解决办法
解决办法就是:把 Foundation 的在链接参数中的位置往前面提到 CoreServices 之前
方法 1:通过 Build Phases 调整框架链接顺序
Xcode 的 Link Binary With Libraries 列表的顺序可能影响链接器处理框架的优先级(部分场景下),可先尝试直接调整顺序:
打开 Xcode 项目,进入目标 Target 的配置页:
选中项目文件(左侧导航栏顶部)→ 选择你的 Target → 切换到 Build Phases 标签。
找到 Link Binary With Libraries 列表:
这里显示了所有需要链接的框架(.framework)和库(.a/.dylib)。
调整框架顺序:
找到 Foundation.framework
和 CoreServices.framework
。
拖动 Foundation.framework
到 CoreServices.framework
上方(确保 Foundation 在前)。
若列表中没有 CoreServices.framework
,说明它可能被间接依赖(如通过其他框架自动引入),需手动添加后再调整顺序。
方法 2:通过 Other Linker Flags 强制指定链接顺序
如果方法 1 不生效(部分系统框架的链接顺序由 Xcode 自动管理),可通过 手动指定链接器参数 强制控制顺序:
进入 Target 的 Build Settings 标签:
选中 Target → Build Settings → 搜索 Other Linker Flags。
手动添加框架链接参数:
点击 Other Linker Flags 右侧的 + 号,按以下顺序添加(确保 Foundation 在 CoreServices 之前):
1 | -framework |
(若有其他框架,按需求排列在后面)
移除自动链接的冲突框架(可选):
若系统自动链接的 CoreServices 仍在 Foundation 之前,可先在 Link Binary With Libraries 中移除 CoreServices.framework
,仅通过 Other Linker Flags 手动指定。
最终按照方法2的方法解决了问题。