Unity编译iOS工程的自动化配置(XUPorter)

背景

通过Unity3d生成Xcode工程后:

Unity编译iOS工程的自动化配置(XUPorter)_第1张图片


打开 Unity-iPhone.xcodeproj,每次都需要手动添加一些配置选项,比如

1. 需要添加项目中使用的系统库
Unity编译iOS工程的自动化配置(XUPorter)_第2张图片

所以就需要每次都手动添加系统库:


2. bitcode配置 

低版本的unity(5.3.2以下)是不支持bitcode的,但是高版本的Xcode(7.0以上)默认是支持bitcode,这样他们就有冲突


所以就需要每次都关闭bitcode

3. HTTP的支持

iOS9后,默认只支持HTTPS的网络请求,那么HTTP怎么办?

所以就需要每次都手动修改ATS

Unity编译iOS工程的自动化配置(XUPorter)_第3张图片


4. 其他项目配置

Unity编译iOS工程的自动化配置(XUPorter)_第4张图片


这样问题就来了:

1) 如果配置太多,修改的地方太多,产品使用起来就相当不方便

2) 每次build后,都需要重新配置,太浪费时间了

所以希望能有一个自动配置的方式,那就再好不过了。


解决方案:

这里有一个开源的项目:XUPorter,a dependency porter from Unity to Xcode。

XUPorter是一个开源的Unity3D编译Xcode工程的依赖管理工具。它能够在Unity3D生成Xcode工程文件后,根据配置文件自动添加依赖库和引用文件的工具。它使用PostProcessBuild标签,在编写后寻找配置文件并修改Xcode工程文件,完全运行于Unity3D编辑器中,而不需要涉及PostprocessBuildPlayer的脚本编写和调试,十分方便。

XUPorter的适用版本Unity3.5及以上,以及Xcode4.x以上。(Unity4.x及Xcode5中亦能工作正常)


原理

在Unity3.5中,加入了一个很棒的标签——[PostProcessBuild],被该标签标注的函数将自动在build player后被调用,这为大家提供了一个不需要用脚本和命令行就能添加或修改编译得到的工程的绝好的入口。


从上面可以看到,XUPorter是从Unity3.5开始支持的,支持到Xcode4.x和Xcode5,并且作者几年前已经开始不维护了,所以对于新的版本,我们需要做一些修改


1. XUPorter标准的配置

Unity编译iOS工程的自动化配置(XUPorter)_第5张图片

添加动态链接库(仅仅限于dylib文件, Xcode7的tbd不支持),添加frameworks,以及"linker_flags"这些常用的配置都有了,但Xcode7后的新特性并不支持.


XUPorter常量定义

Unity编译iOS工程的自动化配置(XUPorter)_第6张图片

2.  bitcode

Xcode7出现的bitcode特性,Unity5.3.2版本才开始支持,所以在之前的版本需要主动设置为NO。

Unity编译iOS工程的自动化配置(XUPorter)_第7张图片

效果如下:

Unity编译iOS工程的自动化配置(XUPorter)_第8张图片


3. HTTP

Unity 5.2.1开始支持HTTP的设置,在之前的版本,需要修改Plist文件,主动添加上HTTP的支持

手动添加方式

(1) 在Info.plist中添加NSAppTransportSecurity类型Dictionary

(2) 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES

Unity编译iOS工程的自动化配置(XUPorter)_第9张图片


XUPorter的源代码,XCPlist文件在windows下运行会crash,所以最好都在MAC下操作。再mod文件中添加对HTTP的设置



4. 其他配置选项

Unity编译iOS工程的自动化配置(XUPorter)_第10张图片

效果如下:

Unity编译iOS工程的自动化配置(XUPorter)_第11张图片


注意事项:

1. XUPorter必须在MAC下运行,因为自动添加的framework、tbd路径等,只有在MAC下才能配置正确

2. Unity5后,旧的XUPorter代码在projmods文件的 "libs"中添加“libz.tbd”不起效果,需要在"linker_flags"中添加"-lz"才行;不过新的XUPorter代码已经添加了对tbd文件的支持,由于其他作者的努力。

3. 对里面Bool类型的设置,也是字符串的形式, 大写的"YES"对应Yes;大写的"NO"对应No

4.Unity中如果选择mono的话,能捕获除零异常,NullReferenceException由于会触发iOS底层的signal异常,所以APP会崩溃;但如果是IL2CPP模式,NullReferenceException能通过C#捕获,程序不会崩溃,除零异常不会触发。

5. unity5.0.1: Default scripting backend is set to IL2CPP on iOS

6. unity在OSX El Capitan(10.11)下,build iOS项目时会crash

Unity编译iOS工程的自动化配置(XUPorter)_第12张图片


官方说是在 4.6.9已经修复,但在5.0.0以及接下来的多个版本还是存在这个问题,unity5后到底哪个版本修复了,版本太多无法验证,最新的5.3.4是OK的。

iOS: Fixed crash while building iOS project on El Capitan. 


参考:

1. Unity3D研究院之IOS全自动编辑framework、plist、oc代码

2.  http://project.onevcat.com/

3.  https://github.com/onevcat/XUPorter

4.  https://onevcat.com/2012/12/xuporter/

5.  xcode工程文件格式(Xcode Project File Format)详解

你可能感兴趣的:(iOS,Unity)