iOS 部分问题总结2 - 苹果审核篇
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)。
内容如下
- #resign
- #Ruoqian, Chen<piao.polar@gmail.com>
- #2013.3.19
- #
- #resign a ipa package, get a file named resigned.ipa in current shell path
- #----------
- #usage
- #resign $ipaPath
- #e.g. resign iOS_Sample.ipa
- #----------
- IPA=$1
- PROVISION="/Users/nd/Documents/resign/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxx.mobileprovision"
- CERTIFICATE="Banana Inc." # must be in keychain
- CENT="/Users/nd/Documents/resign/resignEn.xcent"
- export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate"
- # unzip the ipa
- rm -rf Payload
- unzip -q "$IPA"
- # remove the signature
- #rm -rf Payload/*.app/_CodeSignature Payload/*.app/CodeResources
- # replace the provision
- cp "$PROVISION" Payload/*.app/embedded.mobileprovision
- # sign with the new certificate
- /usr/bin/codesign -f -s "$CERTIFICATE" --resource-rules Payload/*.app/ResourceRules.plist --entitlements "$CENT" Payload/*.app
- # zip it back up
- zip -qr resigned.ipa Payload
- 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
- #resign
- #Ruoqian, Chen<piao.polar@gmail.com>
- #2013.4.17
- #
- # get a ipa from a ipa package, dest /Users/nd/Documents/Release
- #----------
- #usage
- #GetRelease $appPath
- #e.g. GetRelease iOS_Sample.app
- #----------
- DEFAULT_DEST_DIR="/Users/nd/Documents/Release"
- DEST_DIR=$DEFAULT_DEST_DIR
- APP=$1
- ext=${APP##*.}
- if [ $ext != "app" ]
- then
- echo "agrv must with the format *.app"
- else
- name=`basename $APP .app`
- file=`basename $APP`
- rm -rf $DEST_DIR/$name.ipa
- rm -rf $DEST_DIR/Payload
- mkdir $DEST_DIR/Payload
- cp -R $APP $DEST_DIR/Payload/$file
- cd $DEST_DIR
- zip -qr $name.ipa Payload
- fi
不过这两个都要尤其注意路径问题。别弄错了。