
隨著國家工信部出臺了一系列關(guān)于個人信息保護、內(nèi)容管理、數(shù)據(jù)安全等方面的政策要求,app的上線審核變得越來越嚴(yán)格,為了確保app在中國市場順利上線并長期運營,開發(fā)者應(yīng)仔細(xì)閱讀并時刻緊跟工信部的相關(guān)政策要求,通過不斷優(yōu)化和改進,確保app及時、順利通過應(yīng)用市場審核,高質(zhì)量服務(wù)于廣大用戶。
近期本人使用React Native 0.72新架構(gòu)開發(fā)的app需要同步上線蘋果、小米、華為、應(yīng)用寶、OPPO、VIVO 6大應(yīng)用市場,現(xiàn)在各家應(yīng)用市場都有自動化代碼審核引擎對上線app在人工審核之前進行細(xì)致的白盒預(yù)審,審核內(nèi)容包括代碼安全、SDK使用情況等,試著淺比較下各家審核平臺的不同。
小米:屬于審核最快的一檔,基本從發(fā)版到結(jié)果反饋控制在8小時以內(nèi),經(jīng)常中午發(fā)版,晚上6點就有結(jié)果反饋,但是其審核引擎十分嚴(yán)格,小米先后上線兩次, 返回三份審核報告、一份excel版SDK調(diào)用詳情, 使用了4家不同的審核引擎,包括:小米安全、百度史賓格、捷興信源、智游網(wǎng)安(愛加密)。
華為:6個平臺中審核最慢,經(jīng)常3天以上才有結(jié)果反饋,華為似乎知道自己審核很慢, 有別與其他平臺,非常貼心的提供了一個【催審】按鈕, 但是你點擊,會提示你【第一次催審時間間隔為提交審核后36小時,請耐心等待審核結(jié)果】。。。
華為的人工審核最為嚴(yán)格, 一共發(fā)布了3次每次都有新的反饋,反饋了包含【隱私政策彈窗拒絕選項按鈕為“取消”,點擊取消應(yīng)用未退出 】【您的應(yīng)用明示存在定向推送功能,但未滿足在應(yīng)用內(nèi)顯著標(biāo)識定推服務(wù)/提供定推服務(wù)關(guān)閉選項的要求,不符合華為應(yīng)用市場審核標(biāo)準(zhǔn)】【您的應(yīng)用分類與應(yīng)用實際功能和用途不相符】等問題。騰訊應(yīng)用寶:平均2~3天有結(jié)果反饋,審核同樣嚴(yán)格,特別人工審核細(xì)致,反饋了包含【不允許上傳的【應(yīng)用截圖】第四張含有“個人信息“】等內(nèi)容。
vivo、oppo: 平均2天有結(jié)果反饋,嚴(yán)格程度不如小米、華為、騰訊應(yīng)用寶。
蘋果:屬于審核最快的一檔,和小米相差無幾。自動化代碼審核、以及遵守工信部政策這塊,相比另外5家平臺,屬于最不嚴(yán)格這一檔,但是人工審核細(xì)致,特別對于app元數(shù)據(jù)信息、用戶體驗、app流暢性有更高要求。
另外,除了蘋果外,以上所有安卓應(yīng)用市場均要求上傳《電子版權(quán)認(rèn)證證書》和 《計算機軟件著作權(quán)登記證書》(或《軟件著作權(quán)認(rèn)證證書》)三選一。
下面提供一下本人各大應(yīng)用市場的踩坑記錄,以供參考。
1. ICP備案
安卓、蘋果所有應(yīng)用市場均要求有醒目的ICP備案信息展示,且點擊備案號可跳轉(zhuǎn)到工信部備案信息查詢網(wǎng)站。
2. 賬號注銷
任何具備賬號系統(tǒng)的app, 均需要提供賬號注銷或賬號刪除功能,但是這塊具體執(zhí)行起來,可以分為硬刪除和軟刪除兩種,前者是直接將用戶賬號及使用期間產(chǎn)生的業(yè)務(wù)數(shù)據(jù)一并刪除,后者是將用戶標(biāo)記為刪除狀態(tài)使其不能登錄,但并不刪除用戶使用期間產(chǎn)生的業(yè)務(wù)數(shù)據(jù)。二者可斟酌采用。
3.隱私及權(quán)限相關(guān)
- 【隱私協(xié)議】【用戶協(xié)議】二者缺一不可,所有安卓應(yīng)用市場都需要有這2個協(xié)議在app明顯位置展示,有些審核不嚴(yán)格的應(yīng)用市場,缺少用戶協(xié)議是給過的,但是審核嚴(yán)格的應(yīng)用市場是肯定過不了的,所以老老實實提供【隱私協(xié)議】【用戶協(xié)議】且規(guī)范協(xié)議內(nèi)容,內(nèi)容和實際不符,應(yīng)用市場也是不給過的。
- 所有安卓應(yīng)用市場均要求,app首次啟動要以【隱私政策彈窗】的形式向用戶明示收集使用規(guī)則,注意必須要彈框。
4.違規(guī)權(quán)限調(diào)用
- 在用戶點擊同意隱私協(xié)議之前,不允許調(diào)用ANDROID_ID、IMEI、設(shè)備MAC、ip地址、WiFi SSID、位置信息、硬件傳感器等權(quán)限。針對此項政策,點擊同意隱私協(xié)議之前盡量不要import相關(guān)庫,如果必須import,則需要嚴(yán)格判斷是否點擊了同意隱私協(xié)議,未同意狀態(tài)不要使用相關(guān)庫及相關(guān)方法。

由于項目使用了sentry進行錯誤監(jiān)控,但小米提示sentry違規(guī)獲取設(shè)備傳感器,結(jié)合小米返回的excel發(fā)現(xiàn)sentry在調(diào)用設(shè)備的溫度傳感器,通過在安卓工程AndroidManifest.xml的<application></application>標(biāo)簽中加入如下代碼,禁止sentry違規(guī)調(diào)用,這個問題就此解決。
<meta-data android:name="io.sentry.breadcrumbs.system-events" android:value="false" />
但是重新提交后,騰訊應(yīng)用寶返回

于是將Sentry.init()的初始化方法、項目入口文件的導(dǎo)出Sentry.wrap(App)做了判斷,如果用戶同意了隱私政策及用戶協(xié)議則初始化Sentry、export default Sentry.wrap(App),反之則不初始化Sentry、只export default App。
后續(xù)的提交,問題主要集中在react-native-device-info、@react-native-community/netinfo這兩個庫
react-native-device-info:
用于調(diào)取硬件設(shè)備相關(guān)信息及app相關(guān)信息,包括設(shè)備uuid、app版本號等信息@react-native-community/netinfo
用于調(diào)取ip地址,wifi連接狀態(tài)
要嚴(yán)格控制這兩個庫的方法調(diào)用,用戶點擊同意隱私協(xié)議之前盡量不要import相關(guān)庫,未同意狀態(tài)不要使用相關(guān)庫及相關(guān)方法。
- APP在申請敏感權(quán)限時,應(yīng)同步說明權(quán)限申請的使用目的,包括但不限于申請權(quán)限的名稱、服務(wù)的具體功能、用途;告知方式不限于彈窗、蒙層、浮窗、或者自定義操作系統(tǒng)權(quán)限彈框等,且權(quán)限申請使用目的說明不應(yīng)自動消失。
當(dāng)需要調(diào)用位置信息、相機、相冊等敏感權(quán)限時,需要以彈窗、蒙層、浮窗、或者自定義操作系統(tǒng)權(quán)限彈框等方式告知用戶權(quán)限申請的使用目的。
我們app的相關(guān)界面如下:

此功能需要使用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.被蘋果認(rèn)定為企業(yè)內(nèi)部應(yīng)用
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.
以上是蘋果的審核拒絕原因,大意就是認(rèn)為該app是一個企業(yè)內(nèi)部的應(yīng)用,不應(yīng)該上線到app store, 推薦采用$699一年的企業(yè)級開發(fā)者賬號發(fā)布(蘋果也是真黑)。
遇到這種情況一定要在開發(fā)者賬號中認(rèn)真回復(fù),說明原因,同時針對蘋果發(fā)的拒審郵件以公司名義盡可能正式的回復(fù)一封原因說明郵件,注意以公司名義發(fā)正式郵件非常的重要。郵件正文內(nèi)容大致如下,僅供參考:
尊敬的蘋果團隊:
您好,感謝您的耐心審核。
我們的app主要發(fā)布于中國及部分海外地區(qū),應(yīng)用于xxx查看招聘信息、培訓(xùn)信息以及上傳下載個人簡歷使用。
我們開發(fā)app的主要目的是為了提高xxx的工作效率,方便他們進行在線制作簡歷、查看工作、培訓(xùn)信息。
相關(guān)人員的賬號我們采用驗證碼登錄的方式并填寫詳細(xì)信息后進行創(chuàng)建,另外我們也提供線下的方式為用戶提供賬號和密碼進行使用。
我們的app用戶,大多只是普通的蘋果用戶,在設(shè)置中進行描述文件的安裝操作將會給他們帶來很大的困擾。如果現(xiàn)在定性我們的app為一個內(nèi)部應(yīng)用程序的話,不便用戶的安裝和迭代新的版本。
我們將會持續(xù)對app進行優(yōu)化迭代,上線更多優(yōu)質(zhì)模塊,服務(wù)于廣xxx業(yè)從業(yè)人員,未來我們將會做得更好。
我們將重新打包,到時還請繼續(xù)審核,謝謝。
請您繼續(xù)審查我們應(yīng)用程序, 有任何問題可即時和我取得聯(lián)系,我都將為您做出解答,謝謝。
xxx公司表示最真摯的問候。