oynix

于无声处听惊雷,于无色处见繁花

解决DisallowedUnityFramework问题

升级了一个项目的依赖的一些第三方SDK的版本,导出XCode工程后,打包上传的时候失败了,报错如下:

App Store Connect Operation Error
Invalid Bundle. The bundle at ‘xxx/Frameworks/UnityFramework.framework’ contains disallowed file ‘Framework’.

Xcode中修改

开始查找到的方案,是通过调整 Unity-iPhone Project 下的 General Tab中,Frameworks/Libraries 的 Embed,如果有 item 的设置包含 Sign,那么切换成 Without Sign。这样尝试了几次后,问题依然在。最后在 Stack Overflow 找到了解决方式。

具体操作是,在 UnityFramework Target 下的 Build Settings中,找到 Always Embed Swift Standard Libraries 选项,然后设置成 No,即可。

添加至自动化流程

如果有自动化打包流程,也可以把这个操作添加到其中,这样便不用每次都设置一次。

导出的 Xcode 工程的根目录下,有一个 Unity-iPhone.xcodeproj 文件(一个xcodeproj文件对应一个 XCode Project ),这个文件实质上是一个目录,右击可以看到查看包内容选项,打开后可以看到里面有一个 project.pbxproj 文件,这个文件包含了这个 Project 的所有配置项,包括刚刚的 Build Settings 中的内容,其中 pbx 是 Property Based Xcode 的简写。

这种配置的格式类似于 XML 文件,可用文本编辑器打开,刚刚修改的 Always Embed Swift Standard Libraries 对应的 key 是 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES。

基于这些,需要做的事就很明确了:找到 project.pbxproj 文件,将其中的目标值修改为 NO,即可,代码如下:

1
2
3
4
5
6
7
8
9
10
var pbPath = Path.Combine(request.ExportProjPath, "Unity-iPhone.xcodeproj", "project.pbxproj");
if (File.Exists(pbPath))
{
var proj = new PBXProject();
proj.ReadFromFile(pbPath);
// 一个Project中有多个Target,我们需要修改的是UnityFramework Target
var t = proj.GetUnityFrameworkTargetGuid();
proj.SetBuildProperty(t, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "NO");
proj.WriteToFile(pbPath);
}

如果没有自动化流程,也可以通过 PostProcessBuildAttribute 注解来修饰函数,达到同样的目的。

参考

  • UnityFramework.framework contains disallowed file ‘Frameworks’. Getting this error while getting Unity IOS build
------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2024/05/67f19ee5d550/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道