Just got this message from Apple this morning:
We noticed that your Kids Category app includes analytics, advertising and collects, transmits, or has the ability to share personal information or device information with third parties. Specifically:
- Your app implements the App Tracking Transparency framework, which is used when apps collect data about users and share it with third-parties for tracking purposes. Since Kids Category apps are not allowed to collect, transmit or share identifiable information with third-parties, you should not implement App Tracking Transparency in your app.
However, having done some rigorous searching in all node_modules and pods, I cannot find any reference to the AppTrackingTransparency framework. How can I figure out where it’s included and remove it?
Most likely, either Firebase Analytics or Onesignal is including the framework. I just can’t see any reference to it anywhere.
package.json
{
"name": "Einee",
"version": "1.8.45",
"private": true,
"husky": {
"hooks": {
"post-merge": "if git-branch-is beta -q || git-branch-is master -q; then yarn version --patch; fi"
}
},
"scripts": {
"start": "react-native start",
"ios": "react-native run-ios --device",
"run:ios:8": "react-native run-ios --simulator="iPhone 8"",
"run:ios:iPad": "react-native run-ios --simulator="iPad Pro (12.9-inch) (3rd generation)"",
"lint:fix": "eslint --fix --ext .js,.jsx,.ts,.tsx ./",
"postversion": "react-native-version --reset-build",
"patch-version": "yarn version --patch"
},
"jest": {
"preset": "react-native"
},
"dependencies": {
"@react-native-async-storage/async-storage": "^1.13.2",
"@react-native-community/async-storage": "^1.7.1",
"@react-native-community/blur": "^3.4.1",
"@react-native-community/masked-view": "^0.1.6",
"@react-native-community/picker": "^1.8.1",
"@react-native-firebase/analytics": "10.5.1",
"@react-native-firebase/app": "10.5.0",
"@react-native-firebase/crashlytics": "10.5.1",
"@terrysahaidak/react-native-devmenu": "^3.0.0",
"add": "^2.0.6",
"amplitude-js": "^7.3.0",
"lodash": "^4.17.4",
"moment": "^2.22.2",
"react": "16.13.1",
"react-native": "0.63.4",
"react-native-config": "^1.3.3",
"react-native-dev-menu": "^4.0.0",
"react-native-device-info": "^8.0.1",
"react-native-emoji": "^1.8.0",
"react-native-fast-image": "^8.3.2",
"react-native-fs": "^2.16.6",
"react-native-gesture-handler": "^1.5.6",
"react-native-haptic-feedback": "^1.9.0",
"react-native-iap": "5.2.3",
"react-native-loading-spinner-overlay": "^2.0.0",
"react-native-mail": "^6.0.0",
"react-native-media-queries": "^0.3.0",
"react-native-onesignal": "^4.0.3",
"react-native-picker-select": "^8.0.2",
"react-native-rate": "^1.1.10",
"react-native-reanimated": "^1.7.0",
"react-native-restart": "^0.0.20",
"react-native-safe-area-context": "^3.1.8",
"react-native-screens": "^2.0.0-alpha.33",
"react-native-share": "^5.1.0",
"react-native-sound": "^0.11.0",
"react-native-swiper": "^1.6.0",
"react-native-tts": "^3.2.0",
"react-native-vector-icons": "^8.0.0",
"react-navigation": "^4.1.0",
"react-navigation-stack": "^2.1.0",
"react-redux": "^7.1.3",
"redux": "^4.0.5",
"redux-action-listeners": "^1.0.2",
"redux-thunk": "^2.2.0",
"rn-fetch-blob": "^0.12.0",
"styled-components": "^5.1.1"
},
"devDependencies": {
"@babel/core": "^7.8.4",
"@babel/runtime": "^7.8.4",
"@react-native-community/eslint-config": "^2.0.0",
"@types/lodash": "^4.14.165",
"@types/react": "^17.0.0",
"@types/react-native": "^0.63.37",
"@types/react-navigation": "^3.4.0",
"@types/react-redux": "^7.1.11",
"@typescript-eslint/eslint-plugin": "^4.14.1",
"@typescript-eslint/parser": "^4.14.1",
"babel-jest": "^26.6.3",
"babel-plugin-module-resolver": "^4.0.0",
"enzyme": "^3.10.0",
"enzyme-adapter-react-16": "^1.14.0",
"enzyme-to-json": "^3.3.5",
"eslint": "^7.18.0",
"eslint-config-airbnb-typescript": "^12.0.0",
"eslint-config-prettier": "^7.2.0",
"eslint-import-resolver-typescript": "^2.3.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-prettier": "^3.3.1",
"eslint-plugin-react": "^7.22.0",
"git-branch-is": "^4.0.0",
"husky": "4.3.8",
"jest": "^26.6.3",
"jest-environment-enzyme": "^7.0.2",
"jest-enzyme": "^7.0.2",
"metro-react-native-babel-preset": "^0.64.0",
"pre-push": "^0.1.1",
"prettier": "^2.2.1",
"react-dom": "^17.0.1",
"react-native-debugger-open": "^0.3.25",
"react-native-version": "^4.0.0",
"react-test-renderer": "17.0.1",
"redux-mock-store": "^1.5.3",
"typescript": "4.0.5"
}
}
Podfile
require_relative '../node_modules/react-native/scripts/react_native_pods'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
platform :ios, '10.0'
target 'Einee' do
config = use_native_modules!
use_react_native!(:path => config["reactNativePath"])
target 'EineeTests' do
inherit! :complete
# Pods for testing
end
# Enables Flipper.
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
# you should disable these next few lines.
use_flipper!
post_install do |installer|
flipper_post_install(installer)
end
end
target 'OneSignalNotificationServiceExtension' do
pod 'OneSignal', '>= 3.0', '< 4.0'
end
target 'Einee-tvOS' do
# Pods for Einee-tvOS
target 'Einee-tvOSTests' do
inherit! :search_paths
# Pods for testing
end
end
3
Answers
Apparently the problem is with the Firebase Analytics SDK, it's not yet optimised to be approved by Apple for kids apps. So I just removed it and no problems.
You should double-check your Info.plist, You might have included something like this Privacy – Tracking Usage Description
This is the reference to how App Tracking Transparency works.
https://developer.apple.com/documentation/apptrackingtransparency
Taking a look at step 2 and 3 in above link, I think you will find usage of
requestTrackingAuthorization
function ortrackingAuthorizationStatus
fromATTrackingManager
somwhere in your code which is triggering the rejection.Even though you do not have it, I would still like to add for reference that you should
also check your
Info.plist
forNSUserTrackingUsageDescription
which translates to Privacy – Tracking Usage Description and remove it.