Reputation: 2112
I have two apps in different accounts, rejected under the topic 2.3.1 - Performance
, after upgrading to the React Native 0.59.3. Nothing was changed in this apps, except the RN upgrade.
But, both of apps are not using obfuscated code, selector mangling, or features meant to subvert the App Review process. Both are apps thats change it's contents naturally based on the API data, like many others apps like Facebook, Twitter, Instagram, etc.
Both are simples apps created with react-native init
and published more than 1 year ago for Android and iOS. We are not using codepush, test A/B or others technique to change app behaviour in runtime.
Anyone suffering with the same rejection or have any tips to solve this problem?
Apple rejection message:
Guideline 2.3.1 - Performance
We discovered that your app contains obfuscated code, selector mangling, or features meant to subvert the App Review process by changing this app's concept after approval to the App Store.
The next submission of this app may require a longer review time, and this app will not be eligible for an expedited review until this issue is resolved.
Next Steps
- Review the Performance section of the App Store Review Guidelines.
- Ensure your app is compliant with all sections of the App Store Review Guidelines and the Terms & Conditions of the Apple Developer Program.
- Once your app is fully compliant, resubmit your app for review.
Submitting apps designed to mislead or harm customers or evade the review process may result in the termination of your Apple Developer Program account. Review the Terms & Conditions of the Apple Developer Program to learn more about our policies regarding termination.
If you believe your app is compliant with the App Store Review Guidelines, you may submit an appeal. Alternatively, you may provide additional details about your app by replying directly to this message.
package.json's:
App A:
{
"name": "app A",
"version": "1.0.0",
"private": true,
"scripts": {
"start": "node node_modules/react-native/local-cli/cli.js start",
"test": "jest"
},
"dependencies": {
"@react-native-community/async-storage": "1.2.2",
"@react-native-community/netinfo": "1.4.1",
"@remobile/react-native-action-sheet": "1.0.2",
"eureka-rn-components": "git+file:../gileade-eureka-rn-components#02c50a043070648205def50940c1282d2b749c89",
"functional-masks": "git+https://github.com/ktabriga/functional-masks.git#d5f5f01fe6731fc1c0879b8afb8f239591a2f984",
"lodash": "4.17.2",
"moment": "2.16.0",
"normalizr": "3.1.0",
"numeral": "1.5.3",
"prop-types": "15.6.2",
"ramda": "0.23.0",
"react": "16.8.3",
"react-native": "0.59.3",
"react-native-action-button": "2.6.2",
"react-native-autocomplete-input": "3.6.0",
"react-native-datepicker": "1.6.0",
"react-native-deprecated-custom-components": "0.1.2",
"react-native-device-info": "0.25.1",
"react-native-dropdownalert": "3.9.1",
"react-native-elements": "0.18.0",
"react-native-fcm": "13.3.3",
"react-native-global-props": "1.1.1",
"react-native-image-crop-picker": "0.18.2",
"react-native-infinite-scroll-view": "0.4.5",
"react-native-masked-text": "1.5.2",
"react-native-modal-selector": "1.0.2",
"react-native-permissions": "1.1.1",
"react-native-progress-circle": "2.0.1",
"react-native-side-menu": "1.1.3",
"react-native-simple-modal": "6.0.0",
"react-native-swiper": "1.5.5",
"react-native-vector-icons": "6.2.0",
"react-redux": "4.4.6",
"redux": "3.6.0",
"redux-logger": "2.7.4",
"redux-persist": "4.0.0-beta1",
"redux-promise-middleware": "4.1.0",
"redux-thunk": "2.1.0",
"reselect": "2.5.4",
"string-mask": "0.3.0",
"url-join": "4.0.0"
},
"jest": {
"preset": "jest-react-native"
},
"devDependencies": {
"@babel/core": "7.4.0",
"@babel/runtime": "7.4.2",
"@react-native-community/eslint-config": "0.0.3",
"babel-jest": "24.5.0",
"eslint": "5.16.0",
"jest": "24.5.0",
"metro-react-native-babel-preset": "0.53.1",
"react-test-renderer": "16.8.3"
}
}
App B:
{
"name": "app B",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node node_modules/react-native/local-cli/cli.js start",
"test": "jest",
"lint": "eslint ."
},
"dependencies": {
"@react-native-community/async-storage": "1.3.3",
"axios": "0.18.0",
"bluebird": "3.5.1",
"jwt-decode": "2.2.0",
"moment": "2.21.0",
"prop-types": "15.6.1",
"react": "16.8.3",
"react-native": "0.59.3",
"react-native-charts-wrapper": "0.4.2",
"react-native-datepicker": "1.7.2",
"react-native-device-info": "0.25.1",
"react-native-elements": "0.19.0",
"react-native-exit-app": "1.0.0",
"react-native-fcm": "14.1.0",
"react-native-keyboard-manager": "4.0.13-10",
"react-native-simple-dialogs": "1.1.0",
"react-native-splash-screen": "3.1.1",
"react-native-vector-icons": "6.2.0",
"react-navigation": "1.5.2",
"vanilla-masker": "1.2.0",
"wolfy87-eventemitter": "5.2.5"
},
"devDependencies": {
"@babel/core": "7.4.0",
"@babel/runtime": "7.4.2",
"@react-native-community/eslint-config": "0.0.3",
"babel-jest": "24.5.0",
"babel-plugin-transform-remove-console": "6.9.0",
"eslint": "5.16.0",
"jest": "24.5.0",
"metro-react-native-babel-preset": "0.53.1",
"react-test-renderer": "16.8.3"
},
"jest": {
"preset": "react-native"
}
}
Upvotes: 6
Views: 2385
Reputation: 96
My app also got rejected. However after replying in the resolution centre I have said that I do not use code obfuscating and I have asked for details about the reason for rejection. And just like that, I've got a notification that my app is in review and like 10 seconds later my app was approved and released :-)
To me this seems like either a bug on Apple side, or it was triggered by one of the popular frameworks, like AFNetworking, Realm, etc (where they use NSStringFromSelector, NSStringFromClass etc) but since it was large scale and everyone was explaining the usage in the same way the apps gets approved almost automatically (but you have to reply in the resolution centre in order to trigger the second review process). Hope this helps.
Upvotes: 2