苹果App Store审核指南: https://developer.apple.com/app-store/review/guidelines/
update at 2020.08.04
COVID-19疫情相关引用
由于苹果正在打击与COVID-19冠状病毒爆发有关的应用,只有来自政府或医院等公认机构发布的应用才能发布疫情相关的内容及引用
解决办法:删除应用中所有与当下疫情相关的内容,记得包括AppStoreConnect中的预览、截屏、描述等所有地方都要检查一遍
Objectionable Content(1.1大礼包)
主要原因基本上就是不良内容,原文翻译:应用不应含有冒犯性的、不敏感的、令人不安的、旨在让人厌恶的、特别差劲的、或者仅仅是令人毛骨悚然的内容。
- 苹果是禁止含有赌博、色情、有偿陪伴等违反法律的内容,尤其为用户提供付费社交服务的app(说直白一点就是苹果认为你做的app内容有违法或擦边球成分,遇上这类拒绝的小伙伴基本上心理都有数,例如:在线直播类app需要提供网络文化许可经营证);
- 标题、副标题、描述、屏幕快照、应用内部等 不要出现敏感内容;
- 如果应用大多数内容都与女性有关,例如很多女生喜欢上传自拍,但是男人基本不会这么做,这样一来可能会被苹果认为这是一种物化女性的行为,适当调整下内容做到男女平衡。
User Generated Content(1.2大礼包)
- 如果你的应用内允许用户发帖等UGC(用户产生内容),必须要求用户同意条款(EULA),并且对敏感内容需要做过滤、举报,尤其针对色情、暴力、身体威胁、欺凌等内容;
- IDFA (identifier for advertising)能够较精准地识别用户,通常是由于采集了IDFA却未集成广告服务,尤其对广告主追踪广告转化率帮助很大。苹果开发者计划许可协议中规定:只有使用广告服务才有权采集IDFA。在App Store Connect提交构建版本审核时,若app中使用了IDFA需要向苹果申明。
App Completeness(2.1大礼包)
简单来说就是苹果认为你App不完善
- 例如:页面打开空白、占位符文本、加载失败、按钮点击没有反应、背景提示“功能开发中...”等;
- 提供的测试账号有问题,无法正常登录(很多App可能涉及账号认证等业务,则需要提供一个已认证通过可以正常使用业务功能的账号给苹果审核人员,提交审核提前和后台、测试小伙伴沟通好,不要动这个账号即可);
上面的内容经查都没有问题,就逐一检查SDK,例如:第三方登录、第三方支付(类似alipay字样的SDK如果app中没有用到就删掉)
Beta Testing(2.2大礼包)
一句话概括就是:演示版、beta版、测试版、demo的app不允许上架App Store
- 应用内部、描述、App icon、屏幕快照、预览中不要出现:”demo“、”trial“、”beta“、”test“、“测试”、“asdfgh”这些无意义的数据内容,请删除并填充上正常的数据;
- 应用使用过程中有明显的bug和闪退现象,审核规范中有一个条例明确说明苹果爸爸没有义务给你的应用做”测试工作“,所以自测后再提交的构建版本;
- 如果是为了分发给测试人员,请使用TestFlight。
Accurate Metadata(2.3大礼包)
- 请在提交审核之前,保证你的App预览、屏幕快照、描述等与你App当前最新版本一致,不要出现屏幕快照、预览、描述内容与App实际功能严重不符这类低级错误;
关于屏幕快照和预览另开一个技术贴:https://www.jianshu.com/p/d9cc67bba211 - 无论在你的工程代码内、App Store Connect任何地方!注意!是任何地方!苹果爸爸对这类内容零容忍!不要出现字眼(安卓、Android)、绿色小机器人图标等,或引导用户知晓或安装对应安卓平台应用,曾有电商平台App因为售卖安装安卓系统的三星手机被拒;
- 屏幕适配,当前所有App必须适配iPhone X这类的刘海屏,并且需要在App Store Connect中上传6.5英寸刘海屏的屏幕快照。
- 保证应用完整性,不要刻意隐藏一些功能模块,比如有些人喜欢自作聪明,审核阶段把一个模块隐藏,审核通过后再放开供用户使用,这样做很有可能会被苹果盯上,不想丢掉开发者账号就别搞小动作;
- 如果App内有使用苹果内购(IAP),请确保苹果在审核阶段可以看到对应的内购商品展示页面,并且可以正常购买并使用,有必要时使用屏幕快照告知用户app中的付费项目、级别、订阅等是否需要额外购买。
- 如有博彩、婚配、两性、色情或暗示、暴力、卡通幻想等内容,请如实设置年龄分级,也就是软件级别(限制年龄段用户下载使用及家长控制);
- 若你的app已经有暴力、血腥、色情、性暗示等内容,还需要注意不要在屏幕快照、App预览或描述中体现,因为这些元数据无论用户年龄是否满足都会展示在App Store中。
Software Requirements(2.5大礼包)
- 使用私有API,高压线敢碰一定会被拒,苹果对此是零容忍。例如:prefs:root跳转(后面内容有介绍);
- 传输病毒文件/代码;
- 常驻后台的应用程序(例如后台持续获取定位),目前苹果只允许:VoIP、音频播放、定位、任务完成、本地通知等在后台常驻,若真的需要使用,最好让审核人员能直观的感受到对App实际产生的功能影响,有必要的话可以录一个视频(记得上传到YouTube而不是土豆优酷),并且在App Store Connect内对应App描述添加“App在后台持续使用xxx可能会显著缩短电池寿命”。
- IPv6,协议没有指明必须使用IPv6,但是必须保证运行app设备在IPv6环境下可以使用,若因为该问题被拒,请检查公司使用的服务器,以及第三方SDK;
In-App Purchase(3.1大礼包)
苹果爸爸觉得你的App里卖的某个虚拟商品很诱人,想从中抽成30%,让你必须集成IAP内购否则不给上架
关于IAP内购如何集成另开一个技术贴:https://www.jianshu.com/p/b3fef2601e17
Business Model Issues(3.2大礼包)
通常这类问题都出现在类似P2P金融、理财、小额贷款这类App上,现在苹果对这类应用审核非常严格,提交1000个有999个不给过,如果执意想上架还需要提供以下几点:
- 需要向苹果审核机构提供:政府颁发的对应公司执照、备案、ICP、当地下发的整改通知书、和银行存管签约的合同等(很重要!如果没有或者公司经营执照中没有相关的业务登记,或开发者账号所属的名称和App内的金融机构名称不匹配就不用继续看下去了,必被拒);
- 需要在注册页面显眼位置展示对应的用户服务协议入口,在协议内容中要明确您的应用所提供服务的条款和条件,提交审核有必要截图给苹果看;
- 和钱相关的东西最容易产生纠纷,当平台/商家和用户存在争议时,需要向苹果提供对应的解决方案(例如:购买xxx将产生对应法律效益,附带合同模板。可以通过线上客服/平台官方电话沟通解决。发生卖家商品本身质量问题时提供平台第三方退货担保等);
- 例如投资、理财等产品在签署合同时,需要明文申明对应的责任条款:违约、不可抗因素、合同双方产生争议时通过何种途径解决(也就是第3条);
- 如何追查责任,这里最好要提供对应的担保公司或者理财产品是否有对应的风险控制团队。
或者你的App已经上架,只是后续迭代过程中有个别页面涉及上述内容,通常苹果审核人员会截图提供给你作参考,直接去掉对应入口并重新提交审核即可。
Minimum Functionality(4.2大礼包)
提交的app应用应该包括:功能,内容,和用户界面,对一个网页的简单重新包装不被审核通过,音乐、电影应提交至iTunes,图书应提交至iBooks
- 保证展示给苹果审核人员看的是正常数据,并且UI、UE符合最基本的人机交互规范;
- 涉及微信、QQ等快捷登录,需要判断当前设备是否已安装微信App,未安装应隐藏对应入口按钮。否则点击没有效果会直接导致审核被拒,第三方类似微信、QQ分享、支付功能、跳转高德、百度导航等也一样;
- 再次强调:与2.1大礼包一样,无用的按钮需要置灰或直接隐藏,点击无反应或未开发完成的功能模块不要向用户展示。
Spam(4.3大礼包)
同样的应用不要绑定多个Bundle ID提交App Store(剑指马甲包) ,如果你的应用有两个端类似:拼夕夕(客户版)、拼夕夕(商家版),则最好在首次提交应用时向苹果方面表明其二者的明显区别,否则也有可能会被拒,发布有垃圾信息的app会导致你从开发者名单中剔除。
Sign in with Apple(4.8大礼包)
自iOS 13起,如果你加入了快捷登录,就需要添加苹果登录(Sign with Apple),并且苹果登录选项必须在排在首位,强制性要求不要问为什么,加上就是了;
Privacy(5.1大礼包)
从iOS 10开始,苹果更加注重用户隐私,很多像:定位、相机、相册、蓝牙、通讯录等功能需要用户同意后才能使用(注意自Xcode11/iOS 13后蓝牙Bluetooth有变动),对于App内隐私权限获取另开一贴:https://www.jianshu.com/p/bb90beead155
隐私权限判断代码:
https://github.com/Geniune/LJPrefs
Data Class | Xcode Key | Raw Info.plist Key |
---|---|---|
Apple Music | Privacy - Media Library Usage Description | NSAppleMusicUsageDescription |
Bluetooth | Privacy - Bluetooth Always Usage Description | NSBluetoothAlwaysUsageDescription |
Calendar | Privacy - Calendars Usage Description | NSCalendarsUsageDescription |
Camera | Privacy - Camera Usage Description | NSCameraUsageDescription |
Contacts | Privacy - Contacts Usage Description | NSContactsUsageDescription |
Health | Privacy - Health Share Usage Description Privacy - Health Update Usage Description |
NSHealthShareUsageDescription NSHealthUpdateUsageDescription |
Home | Privacy - HomeKit Usage Description | NSHomeKitUsageDescription |
Location | Privacy - Location Always Usage Description Privacy - Location When In Use Usage Description |
NSLocationAlwaysUsageDescription NSLocationWhenInUseUsageDescription |
Microphone | Privacy - Microphone Usage Description | NSMicrophoneUsageDescription |
Motion | Privacy - Motion Usage Description | NSMotionUsageDescription |
Photos | Privacy - Photo Library Usage Description | NSPhotoLibraryUsageDescription |
Reminders | Privacy - Reminders Usage Description | NSRemindersUsageDescription |
Siri | Privacy - Siri Usage Description | NSSiriUsageDescription |
注意:当需要调用对应方法时,请在info.pilst中配置对应项,使用隐私访问key时,对应value必须填写上使用的目的。例如:需要使用当前用户位置用于获取当地天气信息,不要只写“是否允许App获取您的位置”,一定要写出获取用户位置的明确目的,否则审核会被拒。
Intellectual Property(5.2大礼包)
我的app被人抄袭了怎么办?不要担心,苹果开设了专门的申诉渠道(苹果在审核时不会check版权问题,发现被侵权应第一时间联系苹果官方客服进行申诉)
通常情况下你在公司开发的产品都拥有向工商局注册的商标、版权,并且在开发完成后也会进行对应的软著申请,这是防止你的app版权被侵犯的重要武器,当然有很多小伙伴基本上没有遇上过这样的事情。
相反,苹果也禁止创建一个与已有产品、用户界面、内容、广告主题相似的应用,所以作为开发者借鉴可以有,直接照搬使不得。
Gaming, Gambling, and Lotteries(5.3大礼包)
- 如果你的App中有类似抽奖、幸运大转盘等功能,就请注明:“该活动由xxx提供,与设备生产商Apple Inc.无关”。字体再小也要写!
- 不许使用应用内付费购买信用点或者虚拟货币,并把它们与现实中的货币结合使用,也不允许购买彩票、抽奖券,和进行资金转移(个人认为应该是防止洗钱或财产转移)
prefs:root跳转
以前前通过下面方法跳转至对应App蓝牙设置等界面,苹果已不允许使用这类私有API。
//iOS10
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=Bluetooth"] options:@{} completionHandler:nil];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=Bluetooth"]];
网上有很多将字符串转换成16进制,据说用这样的脏套路可以逃过代码审核扫描,在这里告诉大家,不要信!不要信!不要信!重要的话说三遍,已有人尝试并且再次被拒绝。
可以使用下面方法来打开“设置”界面:
if (iOSv8) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
} else {
NSURL *privacyUrl = [NSURL URLWithString:@"ACCOUNT_SETTINGS"];
if ([[UIApplication sharedApplication] canOpenURL:privacyUrl]) {
[[UIApplication sharedApplication] openURL:privacyUrl];
} else {
NSString *message = @"无法跳转到隐私设置页面,请手动前往设置页面,谢谢";
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"对不起" message:message delegate:nil cancelButtonTitle:@"好的" otherButtonTitles: nil];
[alert show];
}
}
App图标和启动页设置
Assets.xcassets内AppIcon和LaunchImage内对应的图标和启动页切图像素尺寸符合对应的规范。
如何设置详见:
AppIcon:https://www.jianshu.com/p/a3dad451f9a4
LaunchImage:https://www.jianshu.com/p/c8c45d80ba4c (iOS 13已废弃)
如果还需要适配iPhone 5这个非Retina设备,则启动页还需要在工程中加入一张320 × 568的png图片,并且在info.plist中加入:
UILaunchImageName
Defult-568
UILaunchImageSize
(320,568)
总结
千万记住一点,如果苹果爸爸拒绝了你的构建版本,千万不要与之相抵抗,必须很虔诚的向其认错:爸爸,我有错!我改!你说哪里不对我就改哪里!(除非你不想上架了)
如果本文对你有所帮助记得点个赞哈