iOS 部分问题总结(二) - 苹果审核篇

1. 记录下5.1新规后上传被拒的问题排查和解决过程。

几天前,最新一次的更新被拒了,提示Invaild Binary。好在苹果同时发来了说明邮件做了详细说明:

Dear developer,
We have discovered one or more issues with your recent delivery for
"Conquer Online". To process your delivery, the following issues must be
corrected:
iPhone 5 Optimization Requirement - Your binary is not optimized for
iPhone 5. As of May 1, all new iPhone apps and app updates submitted
must support the 4-inch display on iPhone 5. All apps must include a
launch image of the appropriate size. Learn more about
iPhone 5 support by reviewing the iOS Human Interface Guidelines.
Non-public API usage:
Apps are not permitted to access the UDID and must not use the
uniqueIdentifier method of UIDevice. Please update your apps and servers
to associate users with the Vendor or Advertising identifiers
introduced in iOS 6.
If method names in your source code match the private Apple APIs listed
above, altering your method names will help prevent this app from being
flagged in future submissions. In addition, note that one or more of the
above APIs may be located in a static library
that was included with your app. If so, they must be removed.
If you think this message was sent in error and that you have only used
Apple-published APIs in accordance with the guidelines, send the app's
nine-digit Apple ID, along with detailed information about why you
believe the above APIs were incorrectly flagged,
to appreview@apple.com. For further information, visit the Technical
Support Information page.
Once these issues have been corrected, go to the Version Details page
and click "Ready to Upload Binary." Continue through the submission
process until the app status is "Waiting for Upload." You can then
deliver the corrected binary.
Regards,
The App Store team

可以看到,苹果说了两个问题,iPhone 5 Optimization Requirement/Non-public API usage,刚好就是5.1时候的新要求。

a. iPhone 5 Optimization Requirement

iPhone5和iPad毕竟屏幕差距摆在那里,而之前我们提交的也都是iPad版本(把app往iTunes一拖,显示简介就能看到app的适用平台)。最后发现是本次app闹了乌龙,给做成了同时支持iPhone的。

看了下工程设置,很早以前Targets->Summary->Devices就一直是
Universal,Targets->Build
Settings->Combined->Deployment->Targeted Device
Family也一直是iPhone/iPad的(体现在project.pbxproj,TARGETED_DEVICE_FAMILY =
"1,2",1是iPhone,2是iPad。)

为何之前会被认为是仅iPad呢。

网上查了下,原来除了project.pbxproj,还与xxx-info.plist有关。再最近的修改中,其中添加了一项

<key>UIStatusBarHidden~ipad</key>
   </key>

导致苹果将之处理为一个Universal程序了,并且,即使把project.pbxproj的值改为iPad,也依然坚定的这样认为。虽然在我看
来,info.plist是相对不清晰的,project.pbxproj的设置才是明确可见的,苹果不理会project.pbxproj而去看
info.plist,实在令人蛋疼。

将info.plist多出来的项删除,可以看到iTunes已经认为是iPad程序了,上传的结果也证明苹果不再拿iPhone5界面说事了。

一些补充说明:

i.
要注意的是,这是由于我们原来也一直是iPad程序,而不是一个Universal程序,否则仅仅是为了规避这条,将一个已经在外的Universal程
序弄一个iPad版本上传,苹果是不会认的。详见
http://stackoverflow.com/questions/5156382/upgrade-live-universal-app-to-ipad-only
ii.关于iPhone5的Retina。
   在模拟器上即可测试。模拟器选择设备iPhone(Retina
4inch)即可.如果发现取出来的屏幕宽度是960,而非预期的1136。一个可能是因为没有加一张Retina(4-inch)的launch
Images。通常,这个文件会被命名为Default-568h@2x.png。
   但这个文件在Rescources下存在(文件本身存在),在Project
Navigate能看到还不够。还必须保证Target->Summary->iPhone/iPod Deployment
Info->Launch Images->Retina(4-inch)这个格子上实实在在的能看到那张图。
   添加好了,苹果才认为是一个支持iPhone5 Retina的程序,否则在实机上也会带来黑边问题(当然在代码本身要用取出来的宽度而非960来做,否则再怎么加都没用)

b. Non-public API usage。

list above其实就说了一个问题,用了udid,即UIDevice的uniqueIdentifier方法。

事实上,我们自己的代码已经能切实确认没用这个了,那就只能是没有源码的第三方库了。
   目前项目中用到了5个这样的库。而上次除了google的工程师声称他们从没用在其中用过udid的GA,其他4个中的3个都已经更新到了滤除udid的版本。
   剩下的一个略有点小家子气,没用户名密码不给下SDK,不给看Release Note。
   只好找相关同学要了当时的用户名密码,然后看了Release
Note,更新去除udid的版本看不到发布日期,但下一个版本能看到是在2012年发布的,虽然代码中看不到明确的版本,但在.h中发现copy
right 2009-2011,推测是2011的库还是用到了。
   更新到最新再编译打包上传,苹果也不再说这个问题了,于是确认的确是这个库的问题。

2. 繁体上传遇到的麻烦。

也许是现在应用多了要求严格了,也许是不同地区审核团队不一样。外文早已审核通过都运营了好久的版本,在繁体初次提交审核,因为UI问题被拒了,并且申诉不被认可。

大意是苹果不喜欢:

a. 同时操作游戏中的多个界面,如果确有需要,更希望你打开这个就把那个关了,或者弄成模态的。
b. 比如用户反馈等等,他有标准的一套东西,不喜欢你自己弄一套UI来做。

好在对话框有统一的管理,工作量也还好。正在改,等审核过了再看看是不是有效。

附:

重签名脚本

基于源码安全考虑,公司的代码都在专网,连不到外网,程序没法用XCode直接提交。而最后的资源整合,更新一两个配置,又需要重新签名才行。为了避免这个问题,研究了下XCode的签名方法,粗粗做了个重签名脚本resign,能通过苹果的审核

unix shell,如果直接拷贝注意行尾符要用unix行尾,以及给脚本赋权(e.g. chmod 777 resign)。

内容如下

  1. #resign
  2. #Ruoqian, Chen<piao.polar@gmail.com>
  3. #2013.3.19
  4. #
  5. #resign a ipa package, get a file named resigned.ipa in current shell path
  6. #----------
  7. #usage
  8. #resign $ipaPath
  9. #e.g. resign iOS_Sample.ipa
  10. #----------
  11. IPA=$1
  12. PROVISION="/Users/nd/Documents/resign/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxx.mobileprovision"
  13. CERTIFICATE="Banana Inc." # must be in keychain
  14. CENT="/Users/nd/Documents/resign/resignEn.xcent"
  15. export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate"
  16. # unzip the ipa
  17. rm -rf Payload
  18. unzip -q "$IPA"
  19. # remove the signature
  20. #rm -rf Payload/*.app/_CodeSignature Payload/*.app/CodeResources
  21. # replace the provision
  22. cp "$PROVISION" Payload/*.app/embedded.mobileprovision
  23. # sign with the new certificate
  24. /usr/bin/codesign -f -s "$CERTIFICATE" --resource-rules Payload/*.app/ResourceRules.plist --entitlements "$CENT" Payload/*.app
  25. # zip it back up
  26. zip -qr resigned.ipa Payload
  27. codesign -dvvv Payload/*.app

在过程中可能会提示输入用户名密码以完成重签名过程。
PROVISION
CERTIFICATE
CENT
这三个量需要根据各项目的情况替换,,前两个是签名认证相关,CENT是项目自身的设置也有关系,可以在型如
DervedData->$ProjectName$->Build->Intermediates->$ProjectNmae.build->Distribution-
iphoneos->$ProjectName.Build->$ProjectName.xcent找到。(这个路径也可以在XCode编
译的详细信息中查到)

如果不爱开龟速的iTunes,手工做担心出错,或者不爱每次都去finder中相对固定的一个超长的路径下把app挖出来,可以用这个
GetRelease

  1. #resign
  2. #Ruoqian, Chen<piao.polar@gmail.com>
  3. #2013.4.17
  4. #
  5. # get a ipa from a ipa package, dest /Users/nd/Documents/Release
  6. #----------
  7. #usage
  8. #GetRelease $appPath
  9. #e.g. GetRelease iOS_Sample.app
  10. #----------
  11. DEFAULT_DEST_DIR="/Users/nd/Documents/Release"
  12. DEST_DIR=$DEFAULT_DEST_DIR
  13. APP=$1
  14. ext=${APP##*.}
  15. if [ $ext != "app" ]
  16. then
  17. echo "agrv must with the format *.app"
  18. else
  19. name=`basename $APP .app`
  20. file=`basename $APP`
  21. rm -rf $DEST_DIR/$name.ipa
  22. rm -rf $DEST_DIR/Payload
  23. mkdir $DEST_DIR/Payload
  24. cp -R $APP $DEST_DIR/Payload/$file
  25. cd $DEST_DIR
  26. zip -qr $name.ipa Payload
  27. fi

不过这两个都要尤其注意路径问题。别弄错了。

iOS 部分问题总结2 - 苹果审核篇的更多相关文章

  1. iOS开发应用上架必读最新苹果审核规则(史上最全版)

    官方文档 地址https://developer.apple.com/cn/app-store/review/guidelines/ App Store 审核指南 简介 App 正在改变世界,丰富人们 ...

  2. iOS项目之苹果审核被拒

    解读: 3.2 其他业务模式问题下方列表并非详尽清单,并且您提交的 App 可能会导致我们的政策有所更改或更新,但这里有一些额外的应做事宜和勿做事宜需要您谨记在心: 可以接受 (i)在您的 App 中 ...

  3. 近期 Unity 提交苹果审核被拒的问题

    游戏提交苹果审核,被打回.在 bugly 上没有查到崩溃信息,苹果给了 crash 日志也说明. 拒绝原因如下: Your app crashed on iPad or iPhone running ...

  4. iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权

    iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...

  5. 上线---苹果AppStore审核注意事项,Guideline 1.2 - Safety - User Generated Content,2.1等条例(苹果审核六次拒绝)

    前段时间上线app,和战友一起撸了那么久的代码,上线是最激动的.然而安卓各大平台上线了半个月了,苹果却给了六次拒绝. 刚开始等苹果等的焦头烂额,现在内心毫无波澜,目前还在审核中...... 六次的拒绝 ...

  6. iOS进阶指南试读之UI篇

    iOS进阶指南试读之UI篇 UI篇 UI是一个iOS开发工程师的基本功.怎么说?UI本质上就是你调用苹果提供给你的API来完成设计师的设计.所以,想提升UI的功力也很简单,没事就看看UIKit里的各个 ...

  7. [iOS笔试600题]二、常识篇(共有72题)

    [B]1.NSObject是一个根类,几乎所有的类都是从它派生而来.但是根类并不拥有真它类都有的alloc和init方法?[判断题] A. 正确 B. 错误 [A]2. UIResponder可以让继 ...

  8. iOS/iphone开发如何为苹果开发者帐号APPID续费

    原文地址:iOS/iphone开发如何为苹果开发者帐号APPID续费作者:陈双超_群雄 其实相当的简单,这篇内容是给财务看的,有的地方连我自己看了都感觉有点...但如果不详细,她又要为难我,所以我就当 ...

  9. 苹果审核ipv6海外解决思路-About APP Store

    原始简书文章地址(也是我自己的) 首先声明,一我不负责涉及你们内部服务器. 二是好好读文章,别人能过,你们也能过 苹果6月1日出的IPV6协议阻碍了国内大多数积极开发者,我司也不外乎,经过三次被拒后, ...

随机推荐

  1. Java基础知识强化52:经典排序之冒泡排序(BubbleSort)

    1. 冒泡排序的原理图: 2. 冒泡排序代码实现: package cn.itcast_01; /* * 数组排序之冒泡排序: * 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处 ...

  2. openwrt time sycronize

    三行命令搞定这个. opkg update opkg install ntpclient ntpclient -s -c 0 -h ntp.sjtu.edu.cn 最后把这个 放到 rc.local ...

  3. C#读取word模版并对指定域写入数据保存为新word

    引用: using System;using System.Collections.Generic;using System.Aspose.Words;using System.Windows.For ...

  4. 导出数据库中所有数据到Excle中

    Workbook wb = new HSSFWorkbook();//创建工作簿 Connection conn = DataSourceUtils.getDataSource().getConnec ...

  5. 捷易拍与springMVC系统结合

    1. 捷易拍高拍仪在jsp页面的调用 使用ActiveX插件的方式处理解决此问题,捷易拍公司提供了支持IE8以上的32位浏览器的插件,安装插件后,我们可以使用Object标签,使用高拍仪 注意: 1. ...

  6. js_day1

    1)在js写<br>是要"<br>" 2)一些函数a.length,math.random()(1~0),math.floor()(2.3,2.5--> ...

  7. eclipse安装ADT插件重启后不显示Android SDK Manager和Android Virtual Device Manager图标的一种解决办法

    通常安装,搭建安卓环境后,不显示Android SDK Manager和Android Virtual Device Manager ize解决方法:Eclipse ->window->c ...

  8. (转)yum 和 apt-get 用法及区别

    原地址:http://www.cnblogs.com/adforce/archive/2013/04/12/3017577.html 一般来说著名的linux系统基本上分两大类:  1 RedHat系 ...

  9. C# 获取计算机 信息

    /// <summary> /// 获取本机 机器名 /// </summary> /// <returns></returns> public sta ...

  10. 文成小盆友python-num6 -反射 ,常用模块

    本次主要内容: 内容补充 python中的反射 常用模块 一,内容补充: 利用上次说到的递归的方法来实现阶乘. 说明:利用函数递归的方法来实现阶乘如: 1*2*3*4*5*6*7 代码实现如下: de ...