前言:“2017年最新让你加急在苹果app store中上架的app教程”作者我作为一名业余的iOS开发者,把开发出来的App上传到App Store是必须的。下面就来详细介绍下具体流程。
因为最近苹果app store商店出现大量的app泛滥上架,苹果app应用上架的比较多,审核比较慢且不易通过,现在基本每一个app从提交到上架短则7到8天,长则半个月。小编最近我在实际上线应用时,总结了一个非常实用的小技巧,可以加快上架时间,最快可以三天,最近使用这种方法后,我们基本上从提交应用到上架基本上控制在1个星期以内。
现在一般发布app流程:
1:app开发测试完成2.0。
2:在iTunesconnect上增加新版本更新2.0。
3:上传应用
4:应用进入 Waiting for review 状态 (2-9天)
5:应用进入In review 状态 (2-5天)
6:Processing for App store(10分钟)
7:Ready for sale (5分钟)
8:For Sale
app store审核中,主要费时的是第4到第5步骤。在4步骤中,请注意的是我们说的排队时间,这个时间和这段时间上传的应用有数量有关,如果数量多,排队时间就比较长。如果数量少,排队时间就少。没有经验的通过+【Q.2.2.0.5.3.5.7.0.0.7】就能加急免审核上架app,排队结束后,直接进入In Review状态,这个和应用本身设计有关,设计复杂的应用,审核时间稍微长些,并且还有其他一些因素影响,如果被打回,会重新进入4步的队列中,不过根据我的观察,应该有个专门被打回应用的队列,这个队列的优先级高于新上传的应用,所以,即使应用被打回,也会有较高优先级进入In Review,但是这个不是我们想看到的。
在整个上述过程中,花费的总时间我们没有办法控制,但是我们可以通过一些技巧,尽量做到,我们真实提交app时,我们的应用,处在4中队列的前面。所以,我们的做法是
1:开发应用的同时,在在iTunesconnect上增加新版本更新2.0,并在当前版本上简单升级版本号,上传应用(这样做的目的:及时审核通过,用户也可以正常使用应用)
2:应用进入Waiting for review状态,同时开发测试新版本应用(这个时间控制在5天左右)
3:新版本应用开发完毕。
4:从iTunesconnect上撤销用于排队版本应用,上传新版本app(一般3天左右)
5:应用进入In review 状态 (2-5天)
6:Processing for App store(10分钟)
7:Ready for sale (5分钟)
8:For Sale
这个改变非常简单,整个流程,由应用开发和苹果审核的串行过程修改为并行进行,从而加快app上线速度
苹果的审核策略和流程一直在变化,我们要做的是在变化过程中寻找技巧,解决 app 应用上线最后一公里的问题。
顺便给大家说一下“应用提交 App Store 上架被拒的原因都有哪些?”
以下为详细原因列表以及所占比例:
1、信息提交不全(14%)
2、应用存在漏洞(8%)
3、不遵守《开发者项目授权协议》(6%)
4、用户界面太复杂或不够好(6%)
5、名称、描述、截屏与应用内容或功能不相关(5%)
6、包含错误、欺诈或误导性内容,或者使用与其他应用相似的的名称或图标(5%)
7、iTunes Connect中的应用名与设备上显示的应用名不相似,引发困扰(4%)
8、包含占位文本(4%)
9、评级不合适(3%)
10、beta、demo、trail或test版软件也会被拒
而且“【Q.2.2.0.5.3.5.7.0.0.7】.”却能够上架被拒绝多次的app
之前应用维护一下,被拒了,说是什么得支持IPV6,好吧。。。果然是苹果打个哈欠,iOS行业内就得起一次风暴呀。自从5月初Apple明文规定所有开发者在6月1号以后提交新版本需要支持IPV6-Only的网络,大家便开始热火朝天的研究如何支持IPV6,以及应用中哪些模块目前不支持IPV6。
一、IPV6-Only支持是啥?
首先IPV6,是对IPV4地址空间的扩充。目前当我们用iOS设备连接上Wifi、4G、3G等网络时,设备被分配的地址均是IPV4地址,但是随着运营商和企业逐渐部署IPV6 DNS64/NAT64网络之后,设备被分配的地址会变成IPV6的地址,而这些网络就是所谓的IPV6-Only网络,并且仍然可以通过此网络去获取IPV4地址提供的内容。客户端向服务器端请求域名解析,首先通过DNS64 Server查询IPv6的地址,如果查询不到,再向DNS Server查询IPv4地址,通过DNS64 Server合成一个IPV6的地址,最终将一个IPV6的地址返回给客户端。如图所示:
2017年最新让你加急在苹果app store中上架的app教程
NAT64-DNS64-ResolutionOfIPv4_2x.png
在Mac OS 10.11+的双网卡的Mac机器(以太网口+无线网卡),我们可以通过模拟构建这么一个local IPv6 DNS64/NAT64 的网络环境去测试应用是否支持IPV6-Only网络,大概原理如下:
2017年最新让你加急在苹果app store中上架的app教程
local_ipv6_dns64_nat64_network_2x.png
参考资料:
https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1
二、Apple如何审核支持IPV6-Only?
首先第一点:这里说的支持IPV6-Only网络,其实就是说让应用在 IPv6 DNS64/NAT64 网络环境下仍然能够正常运行。但是考虑到我们目前的实际网络环境仍然是IPV4网络,所以应用需要能够同时保证IPV4和IPV6环境下的可用性。从这点来说,苹果不会去扫描IPV4的专有API来拒绝审核通过,因为IPV4的API和IPV6的API调用都会同时存在于代码中(不过为了减小审核被拒风险,建议将IPV4专有API通过IPV6的兼容API来替换)。
其次第二点:Apple官方声明iOS9开始向IPV6支持过渡,在iOS9.2+支持通过getaddrInfo方法将IPV4地址合成IPV6地址(The ability to synthesize IPv6 addresses was added to getaddrinfo in iOS 9.2 and OS X 10.11.2)。其提供的Reachability库在iOS8系统下,当从IPV4切换到IPV6网络,或者从IPV6网络切换到IPV4,是无法监控到网络状态的变化。也有一些开发者针对这些Bug询问Apple的审核部门,给予的答复是只需要在苹果最新的系统上保证IPV6的兼容性即可。
最后第三点:只要应用的主流程支持IPV6,通过苹果审核即可。对于不支持IPV6的模块,考虑到我们现实IPV6网络的部署还需要一段时间,短时间内不会影响我们用户的使用。但随着4G网络IPV6的部署,这部分模块还是需要逐渐安排人力进行支持。
追加第四点:如果应用一直直接使用IPV4地址通过NSURLConenction或者NSURLSession进行网络请求(一般需要服务器允许,且客户端需要在header中伪装host);经测试,IPV6网络环境下,直接使用IPV4地址在iOS9及以上的系统仍然能够正常访问;在iOS8.4及以下不能正常访问;这一点苹果的解释和建议是这样的:
Note: In iOS 9 and OS X 10.11 and later, NSURLSession and CFNetwork automatically synthesize IPv6 addresses from IPv4 literals locally on devices operating on DNS64/NAT64 networks. However, you should still work to rid your code of IP address literals.
三、应用如何支持IPV6-Only?
对于如何支持IPV6-Only,官方给出了如下几点标准:(这里就不对其进行解释了,大家看上面的参考链接即可)
1. Use High-Level Networking Frameworks;2. Don’t Use IP Address Literals;3. Check Source Code for IPv6 DNS64/NAT64 Incompatibilities;4. Use System APIs to Synthesize IPv6 Addresses;
3.1 NSURLConnection是否支持IPV6?
官方的这句话让我们疑惑顿生:
using high-level networking APIs such as NSURLSession and the CFNetwork frameworks and you connect by name, you should not need to change anything for your app to work with IPv6 addresses
只说了NSURLSession和CFNetwork的API不需要改变,但是并没有提及到NSURLConnection。 从上文的参考资料中,我们看到NSURLSession、NSURLConnection同属于Coc
OA的url loading system,可以猜测出NSURLConnection在ios9上是支持IPV6的。
应用里面的API网络请求,大家一般都会选择AFNetworking进行请求发送,由于历史原因,应用的代码基本上都深度引用了AFHTTPRequestOperation类,所以目前API网络请求均需要通过NSURLConnection发送出去,所以必须确认NSURLConnection是否支持IPV6. 经过测试,NSURLConnection在最新的iOS9系统上是支持IPV6的。
3.2 Cocoa的URL Loading System从iOS哪个版本开始支持IPV6?
目前我们的应用最低版本还需要支持iOS7,虽然苹果只要求最新版本支持IPV6-Only,但是出于对用户负责的态度,我们仍然需要搞清楚在低版本上URL Loading System的API是否支持IPV6.
(to fix me, make some experiments)待续~~~
3.3 Reachability是否需要修改支持IPV6?
我们可以查到应用中大量使用了Reachability进行网络状态判断,但是在里面却使用了IPV4的专用API。
在Pods:Reachability中AF_INET Files:Reachability.mstruct sockaddr_in Files:Reachability.h , Reachability.m
那Reachability应该如何支持IPV6呢?
(1)目前Github的开源库Reachability的最新版本是3.2,苹果也出了一个Support IPV6 的Reachability的官方样例,我们比较了一下源码,跟Github上的Reachability没有什么差异。
(2)我们通常都是通过一个0.0.0.0 (ZeroAddress)去开启网络状态监控,经过我们测试,在iOS9以上的系统上IPV4和IPV6网络环境均能够正常使用;但是在iOS8上IPV4和IPV6相互切换的时候无法监控到网络状态的变化,可能是因为苹果在iOS8上还并没有对IPV6进行相关支持相关。(但是这仍然满足苹果要求在最新系统版本上支持IPV6的网络)。
(3)当大家都在要求Reachability添加对于IPV6的支持,其实苹果在iOS9以上对Zero Address进行了特别处理,官方发言是这样的:
综上所述,Reachability不需要做任何修改,在iOS9上就可以支持IPV6和IPV4,但是在iOS9以下会存在bug,但是苹果审核并不关心。
四、底层的socket API如何同时支持IPV4和IPV6?
由于在应用中使用了网络诊断的组件,大量使用了底层的 socket API,所以对于IPV6支持,这块是个重头戏。如果你的应用中使用了长连接,其必然会使用底层socket API,这一块也是需要支持IPV6的。 对于Socket如何同时支持IPV4和IPV6,可以参考谷歌的开源库CocoaAsyncSocket.
下面我针对我们的开源 网络诊断组件, 说一下是如何同时支持IPV4和IPV6的。
开源地址:https://github.com/Lede-Inc/LDNetDiagnoService_IOS.git
这个网络诊断组件的主要功能如下:
本地网络环境的监测(本机IP+本地网关+本地DNS+域名解析);
通过TCP Connect监测到域名的连通性;
通过Ping 监测到目标主机的连通耗时;
通过traceRoute监测设备到目标主机中间每一个路由器节点的ICMP耗时;
4.1 IP地址从二进制到符号的转化
之前我们都是通过inet_ntoa()进行二进制到符号,这个API只能转化IPV4地址。而inet_ntop()能够兼容转化IPV4和IPV6地址。 写了一个公用的in6_addr的转化方法如下:
4.2 本机IP获取支持IPV6
相当于我们在终端中输入ifconfig命令获取字符串,然后对ifconfig结果字符串进行解析,获取其中en0(Wifi)、pdp_ip0(移动网络)的ip地址。
注意:
(1)在模拟器和真机上都会出现以FE80开头的IPV6单播地址影响我们判断,所以在这里进行特殊的处理(当第一次遇到不是单播地址的IP地址即为本机IP地址)。
(2)在IPV6环境下,真机测试的时候,第一个出现的是一个IPV4地址,所以在IPV4条件下第一次遇到单播地址不退出。
4.3 设备网关地址获取获取支持IPV6
其实是在IPV4获取网关地址的源码的基础上进行了修改,初开把AF_INET->AF_INET6, sockaddr -> sockaddr_in6之外,还需要注意如下修改,就是拷贝的地址字节数。去掉了ROUNDUP的处理。 (解析出来的地址老是少了4个字节,结果是偏移量搞错了,纠结了半天),具体参考源码库。
4.4 设备DNS地址获取支持IPV6
IPV4时只需要通过res_ninit进行初始化就可以获取,但是在IPV6环境下需要通过res_getservers()接口才能获取。
4.4 域名DNS地址获取支持IPV6
在IPV4网络下我们通过gethostname获取,而在IPV6环境下,通过新的gethostbyname2函数获取。
//ipv4phot = gethostbyname(hostN);//ipv6phot = gethostbyname2(hostN, AF_INET6);
4.5 ping方案支持IPV6
Apple的官方提供了最新的支持IPV6的ping方案,参考地址如下:
https://developer.apple.com/library/mac/samplecode/SimplePing/Introduction/Intro.html
只是需要注意的是:
(1)返回的packet去掉了IPHeader部分,IPV6的header部分也不返回TTL(Time to Live)字段;
(2)IPV6的ICMP报文不进行checkSum的处理;
4.6 traceRoute方案支持IPV6
其实是通过创建socket套接字模拟ICMP报文的发送,以计算耗时;
两个关键的地方需要注意:
(1)IPV6中去掉IP_TTL字段,改用跳数IPV6_UNICAST_HOPS来表示;
(2)sendto方法可以兼容支持IPV4和IPV6,但是需要最后一个参数,制定目标IP地址的大小;因为前一个参数只是指明了IP地址的开始地址。千万不要用统一的sizeof(struct sockaddr), 因为sockaddr_in 和 sockaddr都是16个字节,两者可以通用,但是sockaddr_in6的数据结构是28个字节,如果不显式指定,sendto方法就会一直返回-1,erroNo报22 Invalid argument的错误。
关键代码如下:(完整代码参考开源组件)
如果说你已经按照上边步骤操作完成并且在本地用IPV6网络测试成功,但是app还是没有通过审核的话,那你就只能和苹果交涉了,可以写邮件说我此app已经支持iPV6网络,让他们重新测试,也可以直接回复他们。
2017年最新让你加急在苹果app store中上架的app教程
核心关注:拓步ERP系统平台是覆盖了众多的业务领域、行业应用,蕴涵了丰富的ERP管理思想,集成了ERP软件业务管理理念,功能涉及供应链、成本、制造、CRM、HR等众多业务领域的管理,全面涵盖了企业关注ERP管理系统的核心领域,是众多中小企业信息化建设首选的ERP管理软件信赖品牌。
转载请注明出处:拓步ERP资讯网http://www.toberp.com/
本文标题:在苹果app store中上架的教程
本文网址:http://www.toberp.com/html/support/11121521059.html