Unity提审AppStore踏坑指南

这是一篇把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,注意这两参数都不能与之前的某个包一模一样.

最终审核结果

审核结束之后 如果一切顺利 你会收到类似这样的一封邮件:

则说明已经可以上架了.

参考的文章们

以下是我在这过程中翻阅过或者帮助我解决过某个小问题的文章们:

  1. Unity引擎IOS执行档大小优化
  2. JsonFx-with-IL2CPP
  3. 证书推送选项警告
  4. 应用增加对IPv6的支持Unity官方说明
  5. 应用增加对IPv6的支持苹果官方说明
  6. 由于IPv6理由被拒的解决方案
  7. 由于友盟的原因被拒的解决方案
  8. Debugging-Deployed-iOS-Apps
  9. 苹果应用配置文件Info.plist的元素解释
  10. 苹果应用发布流程
  11. StackTrace-in-Release-Build
  12. Unity-answers
  13. Unity中的蹦床数
  14. iTunesConnect上创建应用
  15. TestFlight官方教程
  16. Unity-playerSizeOptimization
  17. Unity在iOS发行包中StackTrace永远返回为空

-EOF-

2 评论

  1. 全人工测试发布,简直要死人。为什么没人开发一款便捷式的发布自检软件,起码可以减少不少坑。

发表评论

电子邮件地址不会被公开。 必填项已用*标注