随着国家工信部出台了一系列关于个人信息保护、内容管理、数据安全等方面的政策要求,app的上线审核变得越来越严格,为了确保app在中国市场顺利上线并长期运营,开发者应仔细阅读并时刻紧跟工信部的相关政策要求,通过不断优化和改进,确保app及时、顺利通过应用市场审核,高质量服务于广大用户。
近期本人使用React Native 0.72新架构开发的app需要同步上线苹果、小米、华为、应用宝、OPPO、VIVO 6大应用市场,现在各家应用市场都有自动化代码审核引擎对上线app在人工审核之前进行细致的白盒预审,审核内容包括代码安全、SDK使用情况等,试着浅比较下各家审核平台的不同。
小米:属于审核最快的一档,基本从发版到结果反馈控制在8小时以内,经常中午发版,晚上6点就有结果反馈,但是其审核引擎十分严格,小米先后上线两次, 返回三份审核报告、一份excel版SDK调用详情, 使用了4家不同的审核引擎,包括:小米安全、百度史宾格、捷兴信源、智游网安(爱加密)。
华为:6个平台中审核最慢,经常3天以上才有结果反馈,华为似乎知道自己审核很慢, 有别与其他平台,非常贴心的提供了一个【催审】按钮, 但是你点击,会提示你【第一次催审时间间隔为提交审核后36小时,请耐心等待审核结果】。。。
华为的人工审核最为严格, 一共发布了3次每次都有新的反馈,反馈了包含【隐私政策弹窗拒绝选项按钮为“取消”,点击取消应用未退出 】【您的应用明示存在定向推送功能,但未满足在应用内显著标识定推服务/提供定推服务关闭选项的要求,不符合华为应用市场审核标准】【您的应用分类与应用实际功能和用途不相符】等问题。腾讯应用宝:平均2~3天有结果反馈,审核同样严格,特别人工审核细致,反馈了包含【不允许上传的【应用截图】第四张含有“个人信息“】等内容。
vivo、oppo: 平均2天有结果反馈,严格程度不如小米、华为、腾讯应用宝。
苹果:属于审核最快的一档,和小米相差无几。自动化代码审核、以及遵守工信部政策这块,相比另外5家平台,属于最不严格这一档,但是人工审核细致,特别对于app元数据信息、用户体验、app流畅性有更高要求。
另外,除了苹果外,以上所有安卓应用市场均要求上传《电子版权认证证书》和 《计算机软件著作权登记证书》(或《软件著作权认证证书》)三选一。
下面提供一下本人各大应用市场的踩坑记录,以供参考。
1. ICP备案
安卓、苹果所有应用市场均要求有醒目的ICP备案信息展示,且点击备案号可跳转到工信部备案信息查询网站。
2. 账号注销
任何具备账号系统的app, 均需要提供账号注销或账号删除功能,但是这块具体执行起来,可以分为硬删除和软删除两种,前者是直接将用户账号及使用期间产生的业务数据一并删除,后者是将用户标记为删除状态使其不能登录,但并不删除用户使用期间产生的业务数据。二者可斟酌采用。
3.隐私及权限相关
- 【隐私协议】【用户协议】二者缺一不可,所有安卓应用市场都需要有这2个协议在app明显位置展示,有些审核不严格的应用市场,缺少用户协议是给过的,但是审核严格的应用市场是肯定过不了的,所以老老实实提供【隐私协议】【用户协议】且规范协议内容,内容和实际不符,应用市场也是不给过的。
- 所有安卓应用市场均要求,app首次启动要以【隐私政策弹窗】的形式向用户明示收集使用规则,注意必须要弹框。
4.违规权限调用
- 在用户点击同意隐私协议之前,不允许调用ANDROID_ID、IMEI、设备MAC、ip地址、WiFi SSID、位置信息、硬件传感器等权限。针对此项政策,点击同意隐私协议之前尽量不要import相关库,如果必须import,则需要严格判断是否点击了同意隐私协议,未同意状态不要使用相关库及相关方法。
由于项目使用了sentry进行错误监控,但小米提示sentry违规获取设备传感器,结合小米返回的excel发现sentry在调用设备的温度传感器,通过在安卓工程AndroidManifest.xml的<application></application>标签中加入如下代码,禁止sentry违规调用,这个问题就此解决。
<meta-data android:name="io.sentry.breadcrumbs.system-events" android:value="false" />
但是重新提交后,腾讯应用宝返回
于是将Sentry.init()的初始化方法、项目入口文件的导出Sentry.wrap(App)做了判断,如果用户同意了隐私政策及用户协议则初始化Sentry、export default Sentry.wrap(App),反之则不初始化Sentry、只export default App。
后续的提交,问题主要集中在react-native-device-info、@react-native-community/netinfo这两个库
react-native-device-info:
用于调取硬件设备相关信息及app相关信息,包括设备uuid、app版本号等信息@react-native-community/netinfo
用于调取ip地址,wifi连接状态
要严格控制这两个库的方法调用,用户点击同意隐私协议之前尽量不要import相关库,未同意状态不要使用相关库及相关方法。
- APP在申请敏感权限时,应同步说明权限申请的使用目的,包括但不限于申请权限的名称、服务的具体功能、用途;告知方式不限于弹窗、蒙层、浮窗、或者自定义操作系统权限弹框等,且权限申请使用目的说明不应自动消失。
当需要调用位置信息、相机、相册等敏感权限时,需要以弹窗、蒙层、浮窗、或者自定义操作系统权限弹框等方式告知用户权限申请的使用目的。
我们app的相关界面如下:
此功能需要使用react-native官方提供的PermissionsAndroid组件
主要代码如下,以供参考:
async function permissionCameraDiaglog() {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.CAMERA
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
selectFileSheet.current?.show(); //相册、相机选择弹框
}
}
function requestCameraPermission() {
try {
AsyncStorage.getItem(KEY_PERMISSION_CAMERA_IDCARD).then(promise => {
if (!promise) {
dialogref.current?.setDialogInfo({
visible: true,
title: t('common:permissionCameraTitle'),
message: t('common:permissionCameraContent'),
confirmText: t('reimbursement:iUnderstand'),
onConfirm: async () => {
await AsyncStorage.setItem(KEY_PERMISSION_CAMERA_IDCARD, "true");
await permissionCameraDiaglog()
},
showCancelButton: true,
});
} else {
permissionCameraDiaglog()
}
});
} catch (err) {
console.warn(err);
}
}
5.被苹果认定为企业内部应用
We found in our review that your app is intended to be used by a specific business or organization, including partners, clients, or employees, but you've selected public distribution on the App Store in App Store Connect. Since the App Store is intended for apps with a public audience, we recommend reviewing the other distribution options available to you through your Apple Developer Program Account.
以上是苹果的审核拒绝原因,大意就是认为该app是一个企业内部的应用,不应该上线到app store, 推荐采用$699一年的企业级开发者账号发布(苹果也是真黑)。
遇到这种情况一定要在开发者账号中认真回复,说明原因,同时针对苹果发的拒审邮件以公司名义尽可能正式的回复一封原因说明邮件,注意以公司名义发正式邮件非常的重要。邮件正文内容大致如下,仅供参考:
尊敬的苹果团队:
您好,感谢您的耐心审核。
我们的app主要发布于中国及部分海外地区,应用于xxx查看招聘信息、培训信息以及上传下载个人简历使用。
我们开发app的主要目的是为了提高xxx的工作效率,方便他们进行在线制作简历、查看工作、培训信息。
相关人员的账号我们采用验证码登录的方式并填写详细信息后进行创建,另外我们也提供线下的方式为用户提供账号和密码进行使用。
我们的app用户,大多只是普通的苹果用户,在设置中进行描述文件的安装操作将会给他们带来很大的困扰。如果现在定性我们的app为一个内部应用程序的话,不便用户的安装和迭代新的版本。
我们将会持续对app进行优化迭代,上线更多优质模块,服务于广xxx业从业人员,未来我们将会做得更好。
我们将重新打包,到时还请继续审核,谢谢。
请您继续审查我们应用程序, 有任何问题可即时和我取得联系,我都将为您做出解答,谢谢。
xxx公司表示最真挚的问候。