关于使用 Unity 在 Windows 端导出带有 Admob 插件的 XCode 工程后,再到 Mac 端打包的问题

最近公司需要把之前的一个安卓 app 上架苹果商城,所以需要研究下 Mac 出包的流程。
而由于一些原因,无法直接在 Mac 上通过 Unity 出包,所以想到的替代方案就是先从 Windows 上导出 XCode 工程,然后通过 SVN 同步到 Mac 端,之后再出包。

使用软件如下:

  • TortoiseSVN (Windows 端的 SVN)
  • Cornerstone (Mac 端的 SVN)

在通过 SVN 同步时需要小心是否有文件没有被上传的情况出现,至少我电脑上的 TortoiseSVN 默认设置里会忽略掉 .a 后缀名的文件,导致一开始用 XCode 工程打包时总包 dll 丢失的错误。后来修改下设置就正常了。


由于在 Mac 端出包的版本和安卓端有所差异,需要把之前的广告相关逻辑重写。所以在第一次打包时就先删除了所有广告插件,整个流程还是比较顺畅的。
基本打包流程可以参考这篇文章中的内容

但是,在重新加入广告插件后问题产生了。
Admob 官方文档说明中需要使用一个叫 .xcworkspace 的后缀名文件打开 XCode 工程才能正常编译成功。但是在 Windows 端出的包里没这个文件,只有一个 .xcodeproj 后缀名的文件,如果不使用 Admob 之类的插件的话,直接用 .xcodeproj 文件就可以正常出包了,但是既然用了人家的插件那就只能想办法搞出这个 .xcworkspace 的文件。

1、一切的开始,安装 CocoaPods

想要生成这个 .xcworkspace 文件,就必须安装 CocoaPods(应用级别的依赖管理器)。
如果之前 Mac 中已经安装了这个东西,那么恭喜你,最大的障碍被扫除了。
整个过程最好全程链接外网,并且保证网络通畅。因为有时候你会看到一些奇怪的安装错误的日志,实际上可能就是网络原因导致的,我最后也是在公司其他人都下班之后才利用充裕的带宽安装成功。
之所以说这东西是最大的障碍,原因在于想要安装 CocoaPods 就需要先安装 Ruby 环境,虽然 Mac 内置了一个 Ruby,但是至少我试了几次没成,所以为了安装新版的 Ruby,又要先去安装一个 RVM(ruby version manager)。
并且整个过程中还很可能需要使用到 VIM 相关操作对文件进行编辑。作为小白来讲光是查这些资料就挺头疼了。
在安装完 CocoaPods 后,就可以进行下一步工作了。

2、修改 Podfile

从 Windows 端导出的 XCode 工程应该会含有一个 Podfile 文件,如果没有的话就自己创建一个,内容大致如下:

source 'https://github.com/CocoaPods/Specs'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'

target 'Unity-iPhone' do
  pod 'Google-Mobile-Ads-SDK', '~>9.0'
end
use_frameworks!

其中 pod 'Google-Mobile-Ads-SDK', '~>9.0' 就是对于 admb sdk 的依赖项。
确认了这个 Podfile 文件后,我们需要通过终端进入这个文件所在的目录(也就是当前项目的 XCode 工程根目录),之后执行如下命令:

pod install

此时在程序跑完时可能会报错,大概意思是和这个 admob 依赖的版本之类的有关,解决方法就是把 '~>9.0' 去掉。
修改后的依赖变成 pod 'Google-Mobile-Ads-SDK',此时重新执行 pod install 就可以了,等程序运行完成后,在当前的 XCode 项目根目录中就会生成一个 .xcworkspace 后缀名的文件了。


打包时的新问题 MapFileParse.sh: Permission denied

解决方案参考这篇官方反馈日志
原文如下:

RESOLUTION NOTE (FIX VERSION 2021.2):
MapFileParser will be removed from 2021.1+ version
For earlier versions:
By default SMB configuration on Mac device does not allow to set an executable flag for security reasons.
One way to work around this is to make Xcode to set it for you.
Open generated Xcode project go to UnityFramework target / Build Phases / Run Script
at line 1 add:
chmod +x "$PROJECT_DIR/MapFileParser.sh"
line 2 of what it was on line 1:
"$PROJECT_DIR/MapFileParser.sh"
you can do it:

  • manually
  • with BuildPostProcessor via PBXProject API
  • or if you want to make this change for all iOS/tvOS generated projects change Unity-iPhone.xcodeproj in your Unity Editor installation for iOS/tvOS platform support modules Trampoline folder

p.s. In order to build directly to Mac shared folder you can Map Network Drive on windows and use it as target to Generate Xcode project.

大概意思就是说这东西在新版里快被淘汰了,所以需要手动配置下,在 Build Phases -> Run Script 里面添加如下配置:

chmod +x "$PROJECT_DIR/MapFileParser.sh"

之后就可以顺利通过了。


XCode 打包虚拟机 Bug: no known instance method for selector 'presentDrawable:afterMinimumDuration

查看 Unity 官方网站时,比较靠前的相关反馈如下:

we are aware about the issues when building/running on xcode beta simulator. No ETA for now for a complete fix
附注:该问题的提出者的 Unity 版本为 2019.4 LTS

也就是说这个是一个 Unity 2019 版本的未修复的 bug。
下面网友给出的可行性的解决方案:
首先找到 bug 定位的地方。

Change error line

[UnityCurrentMTLCommandBuffer() presentDrawable: surface->drawable afterMinimumDuration: 1.0 / targetFPS]; // Error is here

to

[UnityCurrentMTLCommandBuffer() presentDrawable: surface->drawable];

猜你喜欢

转载自blog.csdn.net/EverNess010/article/details/123679211