Skip to content

Apple rejection in kids app: Firebase/Analytics #8778

@yogeshkaushal

Description

@yogeshkaushal

Issue

Hi Everyone,

I am trying to publish a Kids app where I have added Firebase Analytics to track Screen Views and Button Clicks. Apart from this, I am using brightcove data collection API to moniter video views and engagement etc which does not seems to be the problem for rejection. This is what the rejection says from apple side:

Guideline 1.3 - Safety - Kids Category

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 includes third-party analytics or third-party advertising with the ability to collect, transmit or share identifiable information, including, for example, Device Name and IDFA.

Next Steps
To resolve this issue, please remove this functionality or revise your app so that no personally identifiable information or device information is sent to third parties.

Image Image Image

Project Files

new

Javascript

Click To Expand

package.json:

{
  "name": "abc",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "android": "react-native run-android",
    "ios": "react-native run-ios",
    "lint": "eslint .",
    "start": "react-native start",
    "test": "jest"
  },
  "dependencies": {
    "@apollo/client": "^3.13.8",
    "@gorhom/bottom-sheet": "5.1.5",
    "@react-native-async-storage/async-storage": "^2.2.0",
    "@react-native-community/hooks": "^100.1.0",
    "@react-native-community/netinfo": "^11.3.3",
    "@react-native-community/slider": "4.5.6",
    "@react-native-firebase/analytics": "21.0.0",
    "@react-native-firebase/app": "21.0.0",
    "@react-native-masked-view/masked-view": "^0.3.0",
    "@react-navigation/bottom-tabs": "^6.4.0",
    "@react-navigation/material-top-tabs": "^6.2.4",
    "@react-navigation/native": "^6.0.8",
    "@react-navigation/native-stack": "^6.9.0",
    "@reduxjs/toolkit": "^1.8.5",
    "graphql": "^16.11.0",
    "lottie-react-native": "^7.3.4",
    "minisearch": "^7.2.0",
    "moti": "0.27.5",
    "patch-package": "^8.0.0",
    "postinstall-postinstall": "^2.1.0",
    "react": "18.3.1",
    "react-native": "0.76.0",
    "react-native-bootsplash": "^6.3.11",
    "react-native-device-info": "^14.0.4",
    "react-native-dotenv": "^3.4.11",
    "react-native-gesture-handler": "2.25.0",
    "react-native-google-cast": "4.8.3",
    "react-native-linear-gradient": "2.6.2",
    "react-native-orientation-locker": "^1.7.0",
    "react-native-pager-view": "^6.8.1",
    "react-native-paper": "^5.14.5",
    "react-native-permissions": "^5.4.4",
    "react-native-reanimated": "3.16.1",
    "react-native-safe-area-context": "^4.12.0",
    "react-native-screens": "^3.34.0",
    "react-native-svg": "15.8.0",
    "react-native-svg-transformer": "1.3.0",
    "react-native-system-navigation-bar": "^2.6.4",
    "react-native-tab-view": "3.2.1",
    "react-native-toast-message": "2.1.5",
    "react-native-uuid": "^2.0.3",
    "react-native-vector-icons": "^10.2.0",
    "react-native-video": "^6.16.1",
    "react-native-webview": "13.12.2",
    "react-redux": "8.0.4",
    "redux-persist": "6.0.0"
  },
  "devDependencies": {
    "@babel/core": "^7.25.2",
    "@babel/preset-env": "^7.25.3",
    "@babel/runtime": "^7.25.0",
    "@react-native-community/cli": "15.0.0-alpha.2",
    "@react-native-community/cli-platform-android": "15.0.0-alpha.2",
    "@react-native-community/cli-platform-ios": "15.0.0-alpha.2",
    "@react-native/babel-preset": "0.76.0",
    "@react-native/eslint-config": "0.76.0",
    "@react-native/metro-config": "0.76.0",
    "@react-native/typescript-config": "0.76.0",
    "@types/react": "^18.2.6",
    "@types/react-native-vector-icons": "^6.4.18",
    "@types/react-test-renderer": "^18.0.0",
    "babel-jest": "^29.6.3",
    "eslint": "^8.19.0",
    "jest": "^29.6.3",
    "prettier": "2.8.8",
    "react-test-renderer": "18.3.1",
    "typescript": "5.0.4"
  },
  "engines": {
    "node": ">=18"
  },
  "packageManager": "[email protected]+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}

firebase.json for react-native-firebase v6:

# N/A

iOS

Click To Expand

ios/Podfile:

  • I'm not using Pods
  • I'm using Pods and my Podfile looks like:
$RNFirebaseAnalyticsWithoutAdIdSupport = true
# Resolve react_native_pods.rb with node to allow for hoisting
require Pod::Executable.execute_command('node', ['-p',
  'require.resolve(
    "react-native/scripts/react_native_pods.rb",
    {paths: [process.argv[1]]},
  )', __dir__]).strip

platform :ios, '15.6'
prepare_react_native_project!

target 'abc' do
  config = use_native_modules!
  use_frameworks! :linkage => :static
  $RNFirebaseAsStaticFramework = true

  use_react_native!(
    :path => config[:reactNativePath],
    # An absolute path to your application root.
    :app_path => "#{Pod::Config.instance.installation_root}/.."
  )

  # ✅ Add react-native-permissions handlers here
  permissions_path = '../node_modules/react-native-permissions/ios'

  # Bluetooth permission handler for Chromecast
  # pod 'Permission-BluetoothPeripheral', :path => "#{permissions_path}/BluetoothPeripheral"

  # (Optional) Add other permissions if needed:
  # pod 'Permission-Camera', :path => "#{permissions_path}/Camera"
  # pod 'Permission-LocationWhenInUse', :path => "#{permissions_path}/LocationWhenInUse"

  target 'abcTests' do
    inherit! :complete
    # Pods for testing
  end

  post_install do |installer|
    react_native_post_install(
      installer,
      config[:reactNativePath],
      :mac_catalyst_enabled => false
    )
  end
end

AppDelegate.m:

#import "AppDelegate.h"
#import "RNBootSplash.h"
#import <GoogleCast/GoogleCast.h>
#import "Orientation.h"
#import <Firebase.h>

#import <React/RCTBundleURLProvider.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  self.moduleName = @"abc";
  // You can add your custom initial props in the dictionary below.
  // They will be passed down to the ViewController used by React Native.
  self.initialProps = @{};
  [FIRApp configure];
  
  NSString *receiverAppID = kGCKDefaultMediaReceiverApplicationID;
  GCKDiscoveryCriteria *criteria = [[GCKDiscoveryCriteria alloc] initWithApplicationID:receiverAppID];
  GCKCastOptions* options = [[GCKCastOptions alloc] initWithDiscoveryCriteria:criteria];
  [GCKCastContext setSharedInstanceWithOptions:options];

  return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
  return [self bundleURL];
}

- (NSURL *)bundleURL
{
#if DEBUG
  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
#else
  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}


- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
	return [Orientation getOrientation];
}

- (void)customizeRootView:(RCTRootView *)rootView {
  [super customizeRootView:rootView];
  [RNBootSplash initWithStoryboard:@"BootSplash" rootView:rootView]; // ⬅️ initialize the splash screen
}


@end


Android

Click To Expand

Have you converted to AndroidX?

  • my application is an AndroidX application?
  • I am using android/gradle.settings jetifier=true for Android compatibility?
  • I am using the NPM package jetifier for react-native compatibility?

android/build.gradle:

// N/A

android/app/build.gradle:

// N/A

android/settings.gradle:

// N/A

MainApplication.java:

// N/A

AndroidManifest.xml:

<!-- N/A -->


Environment

Click To Expand

react-native info output:

 OUTPUT GOES HERE
  • Platform that you're experiencing the issue on:
    • iOS
    • Android
    • iOS but have not tested behavior on Android
    • Android but have not tested behavior on iOS
    • Both
  • react-native-firebase version you're using that has this issue:
    • 21.0.0
  • Firebase module(s) you're using that has the issue:
    • e.g. Instance ID
  • Are you using TypeScript?
    • Y/N & VERSION


Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions