这是一篇把Unity做的应用提审到AppStore的踏坑指南,记录这个过程中遇到的几乎所有问题。
!!注意!! 这篇文章可能具有一定时效性,由于苹果审核策略一直在更改,所以文章中所述言论仅仅基于当前的审核制度。
首先…Show一下苹果对我提交的应用的拒绝记录(我的内心此刻布满黑人问号)
从上图的时间看,苹果的审核速度大大加快,与2013年的审核速度简直云泥之别.然而反观国内的某些平台审核..越来越慢(客观非黑)
环境与版本
0x00 Unity
Unity 5.3.4p4 Unity下载,Unity补丁下载
Q.为什么是 5.3.4p4?
A.由于在2016年6月1日起苹果对所有提交审核的应用都需要支持IPv6+64bit,而Unity刚好在这个版本提供了支持。
Q.什么是IPv6?
A.传送门
更多内容请查看官网说明:苹果官方说明传送门,Unity说明传送门(可能需要梯子).
0x01 IDE and Code
Unity, Xcode7,C#,Objective-c
0x02 Runtime SDK
iOS8 – iOS9.3,arm64,IL2CPP
Q.为什么最低支持的系统版本都那么高?iOS8
A.由于iOS8才支持64-bit
Q.Unity可以同时armv7 arm64,为什么偏偏选arm64
A.首先要支持64bit必须有arm64,其次如果支持两个 则打出来的ipa包超过200M..汗颜,只选arm64包会小几十M
0x03 Test Devices
iPhone6,iPad Air2,iPhone5s
0x04 Profiles(苹果证书申请,配置生成步骤非本文重点,请自行google)
AppStore的iOS Distribution一枚;
AdHoc的iOS Distribution一枚;
Development的Profiles一枚
从应用生成到提交审核
下面简单诉述一下整个流程,已经了解的同学可以跳过这个部分。
应用提请苹果审核的步骤基本是:
- 使用Unity编辑器导出Xcode项目
- 使用Xcode编辑器打包各种类型的应用包
- 配置itunesconnect,添加应用信息
- 使用Xcode工具把包上传到itunesconnect
- 使用TestFlight内部测试
- 提请苹果审核,等待回馈
下面我逐个步骤记录一下我遇到的小泥潭.首先两大编辑器Unity Xcode的设置问题,即使完善如Unity 也不可能每一项设置的作用都给你解析得面面具到,需开发者多关注Unity的官方answers.这里多说几句,大多数的国内Unity开发者都严重忽视这个社区的作用.你在项目里多填几个坑后就会明白,集体的智慧能让我们少走很多的弯路.
0x01.使用Unity编辑器导出Xcode项目
Unity编辑器里的设置主要是注意Other Setting
,真是一个容易让人对这些设置不够重视的名字。
打开File-BuildSetting-iOS-PlayerSetting-OtherSetting
如图所示
部分设置的解释如下:
Identification-Bundle Identifier:
这里写入的是苹果开发证书的ID,这个ID如果你按正常流程创建的话,应该可以在这里查看传送门,对应Xcode里的General-Identity-Bundle Identifier
Identification-Version:
应用程序版本号,对应Xcode里的General-Identity-Version
Identification-Build:
构建标识,可使用字符串可使用数字,对应Xcode里的General-Identity-Build
!!注意!! 这里的Version Build数据填写要谨慎,每次提交到itunesconnect的版本这两个数值都不能与之前的相同,例如你提交了 Version(1.0.0)Build(0),则下次提交的包如果这两参数还是Version(1.0.0)Build(0)则会提交不上去哟.
Configuration-Scripting Backend:
这是一个重要选项,可选IL2CPP Mono2x,如果是打AppStore包 则必须选择IL2CPP.否则无法支持IPv6 64-bit.
Configuration-Target Minimum iOS Version:
最小支持的iOS SDK版本,默认为6.0 需要改为8.0.如果是6.0的话上传到itunesConnect之前就会报错.
如图
这个错误的根源 就是Unity编辑器的设置没提升到8.0
Configuration-Architecture:
只有在IL2CPP模式下才会可选的选项,可选ARMv7 ARM64 Universal,意思分别是 只支持ARMV7 只支持ARM64 两者都支持。在这里我选择ARM64.
Configuration-Api Compatibility Level:
这个一般都选择.NET2.0,能支持更多的.NET特性。
Configuration-AOT Compilation Options:
AOT编译选项,这个厉害了.我在调试应用过程中遇到很多诡异的卡UI卡界面卡调用,最终查明都是由于一个叫蹦床数的数值设置过小,我在这里加入nimt-trampolines=512
之后成功解决这个问题。关于蹦床数严重建议大家阅读一下这篇文章 – Unity中的蹦床数.
Xcode编辑器里需要设置的地方主要是打包证书的选择,如图所示大家一看就明白:
注意右上角打包对象选择:Generic iOS Device,如果你设备连接着Mac的话更要注意,因为这个时候它默认选中的是你的设备.
General-Identity-Team中选择你的证书签名Distribution,如果是个人开发者的话 则选择个人账号ID(一般都是AppleID)
此图为Build Setting中注意的地方,Code Signing中的Code Signing Identity必须选择证书签名Distribution,Provisioning Profile 选择你在证书Name(在此查看-传送门)
0x02.使用Xcode编辑器打包各种类型的应用包
这个主要如图
大约等待个4-5分钟后会弹出各种傻瓜式选项,按需选择即可,这里不多描述,打包完毕后记得导出ipa包。在上传应用程序到itunesconnect可以通过 Xcode导出界面上传 也可以通过Xcode的Open Developer Tool进行上传,在国内的网络环境下,选择Open Developer Tool上传准没错。
在走到这一步之后,相信已经打出了拓展名为.ipa
的苹果应用程序包.(如果一切正常无其他BUG的话,你说有BUG没打出来?回去解决之!)
0x03.配置itunesconnect,添加应用信息
导出.ipa
应用程序文件之后,并不能立即上传到itunsconnect,而是需要在itunesconnect上创建应用。步骤也很简单 大约是:
使用你的开发者账号登陆itunesconnect
如图所示增加你的应用
!!注意!!在增加新应用的时候你需要和美术产品等沟通让他们提供诸如 icon screenhot 产品描述 关键字等等内容。
详细的步骤网上一吨,大家各自寻找.或者去这里看看 – iTunesConnect上创建应用
0x04.使用Xcode工具把包上传到itunesconnect
请查阅之前的链接iTunesConnect上创建应用.有两种方式把应用包上传到itunes,但是个人推荐使用Xcode的工具,打开方式是:
Xcode-Open Developer Tool-Application Loader
然后根据工具操作上传即可.
Q. 为什么要选择这种上传方式?
A. 由于Unity导出的AppStore版本应用程序包一般都比较大(一个helloworld就90M),在我们国内的网络环境下 使用这个工具上传会比较稳定,虽然其实依然不稳定,但是TimeOut次数明显比直接在Xcode里上传要少得多。
!!注意!!在把应用程序包上传到itunes之前,本地工具会进行基本的包体验证,我遇到的如下图这些问题,都是在工具验证的时候报出的:
以上两个操作一开始都是由于设置不统一 或者目标版本设置过低导致的,这类错误一般都会给出详细的错误信息,如此友善的反馈大家改起来相信也不是什么难事.
0x05.使用TestFlight内部测试
把应用程序上传到itunsconnect之后,大约等待30~60分钟苹果服务器就会处理完毕,如果一切正常的话,这个时候大家就可以使用TestFlight进行模拟安装测试了.
!!注意!!AppStore包是无法在mac里通过iTuns直接安装到设备上的.需要苹果设备去AppStore下载一个叫做TestFlight的应用(直接打开AppStore搜索就有),然后通过这个应用把你提交到ituns的应该安装到你的设备上测试.
!!注意!!这个测试非常必要,这是目前测试AppStore包最好的方式.如果仅仅测试AdHoc包就直接提交AppStore给苹果审核,那不够保险,因为你不知道苹果在你上次的包中是否做什么修改,你的AppStore包是否正常使用.
TestFlight的官方教程请转到 – TestFlight官方教程
0x06.提请苹果审核,等待回馈
如果通过TestFlight自己测试应用通过,则可以在itunesconnect上提交以下,这个时候你的应用状态会显示为类似 iOS 正在审核
的黄色字体.接下来就只有等待苹果审核了.
踏坑流水账
从生成应用到提交审核上线,整个过程我遇到过一些问题,这里记录一下
0x01.JsonFx无法工作
问题重现:由于使用了JsonFx,在IL2CPP下无法Serialize和Deserialize(序列化和反序列化).这主要是由于IL2CPP默认就会打开StrippingLevel功能,通过库剥离来减少DLL的空间大小。刚把JsonFx用到的库剥离了.
解决方式: 在Unity项目的Assets文件夹下加入link.xml文件,更详细的文件编写说明请查看Unity官方文档 – Unity-playerSizeOptimization
0x02.Missing-Push-Notification-Entitlement
问题重现:开始我总是每一个版本都会收到这个邮件:
这是由于我的包里有推送的疑似代码,但是创建证书的时候并没有把这个推送功能勾上
解决方式:下次打包应用的时候去开发者中心再生成一次证书,记得勾上推送功能即可.
0x03.应用不支持IPv6
问题重现:在我提交的三个版本中,在苹果的审核人员的设备中均黑屏,这三次苹果均以应用不支持IPv6
的理由拒绝(后面我证明其实并不是这个原因),那么在我查阅了相关资源后发现如下通知:
虽然我被拒的真实原因不是这个,但是我们不妨把这个问题解决
解决方式:
第一步.查看Unity的官方说明 – 应用增加对IPv6的支持Unity官方说明.
第二步.我把我的版本升级到Unity5.3.4p,打包后测试环境使用网上教程搭建NAT64环境测试.
第三步.把我测试的过程拍成一个视频,然后上传到youtube,倘若苹果拒绝,则在itunsconnect把视频反馈给对方,这一步主要是证明NAT64网络下我们的应用在中国的网络下是可以正常跑的.
0x04.StackTrace在iOS发行版中永远为空
问题重现:
在Unity 应用iOS的Release版本中StackTrace永远为空,这个类被无情的剥夺了(具体原因不知道为何),同样的代码在Debug模式下可以new出StackTrace对象并正常打印堆栈输出,但是在Relase版本上这个就一直为空,我发现这个问题花了我整整一周的时间。当我以为我发现的新大陆的时候忽然发现早就有人遇到过 – Unity在iOS发行包中StackTrace永远返回为空…Orz
解决方式:
在Relase中避免使用StackTrace.
0x05.Version+Build冲突
问题重现:
我不小心提交了相同Version 相同Build的应用包到itunesconnect,结构在Application Loader中就报错了
解决方式:
每次提交应用到itunesconnect,注意这两参数都不能与之前的某个包一模一样.
最终审核结果
审核结束之后 如果一切顺利 你会收到类似这样的一封邮件:
则说明已经可以上架了.
参考的文章们
以下是我在这过程中翻阅过或者帮助我解决过某个小问题的文章们:
- Unity引擎IOS执行档大小优化
- JsonFx-with-IL2CPP
- 证书推送选项警告
- 应用增加对IPv6的支持Unity官方说明
- 应用增加对IPv6的支持苹果官方说明
- 由于IPv6理由被拒的解决方案
- 由于友盟的原因被拒的解决方案
- Debugging-Deployed-iOS-Apps
- 苹果应用配置文件Info.plist的元素解释
- 苹果应用发布流程
- StackTrace-in-Release-Build
- Unity-answers
- Unity中的蹦床数
- iTunesConnect上创建应用
- TestFlight官方教程
- Unity-playerSizeOptimization
- Unity在iOS发行包中StackTrace永远返回为空
-EOF-
全人工测试发布,简直要死人。为什么没人开发一款便捷式的发布自检软件,起码可以减少不少坑。
我现在一直在想怎么把更多的东西交给工具..