{"componentChunkName":"component---src-templates-documentation-tsx","path":"/app-check/usage","result":{"data":{"mdx":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"App Check\",\n  \"description\": \"Installation and getting started with App Check.\",\n  \"icon\": \"//firebase.google.com/static/images/products/icons/build_app_check.svg\",\n  \"next\": \"/app-distribution/usage\",\n  \"previous\": \"/analytics/screen-tracking\"\n};\nvar makeShortcode = function makeShortcode(name) {\n  return function MDXDefaultShortcode(props) {\n    console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n    return mdx(\"div\", props);\n  };\n};\nvar Youtube = makeShortcode(\"Youtube\");\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"installation\"\n  }, \"Installation\"), mdx(\"p\", null, \"This module requires that the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"@react-native-firebase/app\"), \" module is already setup and installed. To install the \\\"app\\\"\\nmodule, view the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/\"\n  }, \"Getting Started\"), \" documentation.\"), mdx(\"pre\", {\n    \"className\": \"language-bash\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token comment\"\n  }, \"# Install & setup the app module\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token function\"\n  }, \"yarn\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token function\"\n  }, \"add\"), \" @react-native-firebase/app\\n\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token comment\"\n  }, \"# Install the app-check module\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token function\"\n  }, \"yarn\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token function\"\n  }, \"add\"), \" @react-native-firebase/app-check\\n\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token comment\"\n  }, \"# If you're developing your app using iOS, run this command\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token builtin class-name\"\n  }, \"cd\"), \" ios/ \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"&&\"), \" pod \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token function\"\n  }, \"install\"), \"\\n\")), mdx(\"p\", null, \"App Check requires you set the minimum iOS Deployment version in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ios/Podfile\"), \" to \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"11.0\"), \" or greater.\"), mdx(\"p\", null, \"You may have Xcode compiler errors after including the App Check module, specifically referencing linker problems and missing directories.\"), mdx(\"p\", null, \"You may find excluding the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"i386\"), \" architecture via an addition to the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ios/Podfile\"), \" \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"post_install\"), \" hook like the below works:\"), mdx(\"pre\", {\n    \"className\": \"language-ruby\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-ruby\"\n  }, \"    installer\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), \"aggregate_targets\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"each\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"do\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"|\"), \"aggregate_target\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"|\"), \"\\n      aggregate_target\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), \"user_project\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), \"native_targets\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"each\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"do\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"|\"), \"target\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"|\"), \"\\n        target\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), \"build_configurations\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"each\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"do\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"|\"), \"config\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"|\"), \"\\n          config\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), \"build_settings\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"[\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'ONLY_ACTIVE_ARCH'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"]\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"=\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'NO'\"), \"\\n          config\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), \"build_settings\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"[\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'EXCLUDED_ARCHS'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"]\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"=\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'i386'\"), \"\\n        \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"end\"), \"\\n      \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"end\"), \"\\n      aggregate_target\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), \"user_project\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), \"save\\n    \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"end\"), \"\\n\")), mdx(\"h1\", {\n    \"id\": \"what-does-it-do\"\n  }, \"What does it do\"), mdx(\"p\", null, \"App Check works alongside other Firebase services to help protect your backend resources from abuse, such as billing fraud or phishing. With App Check, devices running your app will use an app or device attestation provider that attests to one or both of the following:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Requests originate from your authentic app\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Requests originate from an authentic, untampered device\")), mdx(\"p\", null, \"This attestation is attached to every request your app makes to your Firebase backend resources.\"), mdx(Youtube, {\n    id: \"Fjj4fmr2t04\",\n    mdxType: \"Youtube\"\n  }), mdx(\"p\", null, \"This App Check module has built-in support for using the following services as attestation providers:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"DeviceCheck on iOS\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"App Attest on iOS\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Play Integrity on Android (requires distribution from Play Store to successfully fetch tokens)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"SafetyNet on Android (deprecated)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Debug providers on both platforms\")), mdx(\"p\", null, \"App Check currently works with the following Firebase products:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Realtime Database\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Cloud Firestore\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Cloud Storage\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Cloud Functions (callable functions)\")), mdx(\"p\", null, \"The \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://firebase.google.com/docs/app-check\"\n  }, \"official Firebase App Check documentation\"), \" has more information, including about the iOS AppAttest provider, and testing/ CI integration, it is worth a read.\"), mdx(\"h1\", {\n    \"id\": \"usage\"\n  }, \"Usage\"), mdx(\"h2\", {\n    \"id\": \"register-firebase-apps\"\n  }, \"Register Firebase Apps\"), mdx(\"p\", null, \"Before the App Check package can be used on iOS or Android, the corresponding App must be registered in the firebase console.\"), mdx(\"p\", null, \"For instructions on how to generate required keys and register an app for the desired attestation provider, follow \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Step 1\"), \" in these firebase guides:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://firebase.google.com/docs/app-check/ios/devicecheck-provider#project-setup\"\n  }, \"Get started using App Check with DeviceCheck on Apple platforms\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://firebase.google.com/docs/app-check/ios/app-attest-provider#project-setup\"\n  }, \"Get started using App Check with App Attest on Apple platforms\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://firebase.google.com/docs/app-check/android/play-integrity-provider#project-setup\"\n  }, \"Get started using App Check with Play Integrity on Android\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://firebase.google.com/docs/app-check/android/safetynet-provider#project-setup\"\n  }, \"Get started using App Check with SafetyNet on Android (deprecated)\"))), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"Additionally, You can reference the iOS private key creation and registrations steps outlined in the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/messaging/usage/ios-setup#linking-apns-with-fcm-ios\"\n  }, \"Cloud Messaging iOS Setup\"), \".\")), mdx(\"h2\", {\n    \"id\": \"initialize\"\n  }, \"Initialize\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"If you're using Expo Managed Workflow, you can load the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"@react-native-firebase/app-check\"), \" config plugin to skip the Initialize setup step.\")), mdx(\"p\", null, \"You must call initialize the AppCheck module prior to calling any firebase back-end services for App Check to function.\"), mdx(\"h4\", {\n    \"id\": \"all-react-native--077-with-appdelegateswift\"\n  }, \"All react-native >= 0.77 with AppDelegate.swift\"), mdx(\"p\", null, \"The AppCheck pod does not define a module map for integration, so importing it in the Swift file does not work.\\nYou need to alter the bridging header file that should be in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"<your project name>/ios/<your project-name>-Bridging-Header.h\")), mdx(\"p\", null, \"You will need to add the line indicated in the example below:\"), mdx(\"pre\", {\n    \"className\": \"language-diff\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-diff\"\n  }, \"//\\n// Use this file to import your target's public headers that you would like to expose to Swift.\\n//\\n\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token inserted-sign inserted\"\n  }, \"+ #import \\\"RNFBAppCheckModule.h\\\" // <-- new for AppCheck to work\\n\"))), mdx(\"p\", null, \"After doing that, follow the instructiosn below to add AppCheck initialization to your \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"AppDelegate.swift\"), \" file depending on the react-native version you use.\"), mdx(\"h4\", {\n    \"id\": \"configure-appcheck-with-ios-credentials-react-native-079\"\n  }, \"Configure AppCheck with iOS credentials (react-native 0.79+)\"), mdx(\"p\", null, \"To do that, edit your \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ios/ProjectName/AppDelegate.swift\"), \" and add the following two lines:\"), mdx(\"p\", null, \"At the top of the file, import the FirebaseCore SDK right after \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"import UIKit\"), \":\\nAnd within your existing \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"didFinishLaunchingWithOptions\"), \" method, add the following to the top of the method:\"), mdx(\"pre\", {\n    \"className\": \"language-diff\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-diff\"\n  }, \"import UIKit\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token inserted-sign inserted\"\n  }, \"+ import FirebaseCore  // <-- From App/Core integration, no other Firebase items needed\\n\"), \"import React\\nimport React_RCTAppDelegate\\nimport ReactAppDependencyProvider\\n\\n...\\n\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token unchanged\"\n  }, \"  func application(\\n    _ application: UIApplication,\\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil\\n  ) -> Bool {\\n\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token inserted-sign inserted\"\n  }, \"+   RNFBAppCheckModule.sharedInstance()  // <-- new for AppCheck to work\\n+   FirebaseApp.configure()              // <-- From App/Core integration\\n\"))), mdx(\"h4\", {\n    \"id\": \"configure-appcheck-with-ios-credentials-react-native--077---079\"\n  }, \"Configure AppCheck with iOS credentials (react-native >= 0.77 && < 0.79)\"), mdx(\"p\", null, \"To do that, edit your \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ios/ProjectName/AppDelegate.swift\"), \" and add the following two lines:\"), mdx(\"p\", null, \"At the top of the file, import the FirebaseCore SDK right after \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"import UIKit\"), \":\\nAnd within your existing \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"didFinishLaunchingWithOptions\"), \" method, add the following to the top of the method:\"), mdx(\"pre\", {\n    \"className\": \"language-diff\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-diff\"\n  }, \"import UIKit\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token inserted-sign inserted\"\n  }, \"+ import RNFBAppCheck  // <-- This is the import for AppCheck to work\\n+ import FirebaseCore  // <-- From App/Core integration, no other Firebase items needed\\n\"), \"import React\\nimport React_RCTAppDelegate\\nimport ReactAppDependencyProvider\\n\\n@main\\nclass AppDelegate: RCTAppDelegate {\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token unchanged\"\n  }, \"  override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {\\n\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token inserted-sign inserted\"\n  }, \"+   RNFBAppCheckModule.sharedInstance()  // <-- new for AppCheck to work\\n+   FirebaseApp.configure()              // <-- From App/Core integration\\n\"))), mdx(\"h4\", {\n    \"id\": \"configure-firebase-with-ios-credentials-react-native--077\"\n  }, \"Configure Firebase with iOS credentials (react-native < 0.77)\"), mdx(\"p\", null, \"To do that, edit your \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ios/ProjectName/AppDelegate.mm\"), \" and add the following two lines:\"), mdx(\"pre\", {\n    \"className\": \"language-objectivec\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-objectivec\"\n  }, mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token macro property\"\n  }, \"#\", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"token directive keyword\"\n  }, \"import\"), \" \\\"AppDelegate.h\\\"\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token macro property\"\n  }, \"#\", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"token directive keyword\"\n  }, \"import\"), \" \\\"RNFBAppCheckModule.h\\\" \"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token comment\"\n  }, \"// \\u2B05\\uFE0F ADD THIS LINE\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token macro property\"\n  }, \"#\", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"token directive keyword\"\n  }, \"import\"), \" <Firebase.h>\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), \"\\n\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"-\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), \"BOOL\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), \"application\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), \"UIApplication \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"*\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), \"application didFinishLaunchingWithOptions\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), \"NSDictionary \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"*\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), \"launchOptions\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token comment\"\n  }, \"// Initialize RNFBAppCheckModule, it sets the custom RNFBAppCheckProviderFactory\"), \"\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token comment\"\n  }, \"// which lets us configure any of the available native platform providers,\"), \"\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token comment\"\n  }, \"// and reconfigure if needed, dynamically after `[FIRApp configure]` just like the other platforms.\"), \"\\n\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"[\"), \"RNFBAppCheckModule sharedInstance\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"]\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token comment\"\n  }, \"// \\u2B05\\uFE0F ADD THIS LINE BEFORE [FIRApp configure]\"), \"\\n\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"[\"), \"FIRApp configure\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"]\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \"\\n\\n\")), mdx(\"p\", null, \"There are several differences between the web, Apple, and Android platform SDKs produced by Firebase, which react-native-firebase smooths over to give you a common, firebase-js-sdk compatible API.\"), mdx(\"p\", null, \"How do we do this? We use the standard firebase-js-sdk v9 API \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"initializeAppCheck\"), \", and take advantage of its parameters which allow the use of an \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"AppCheckOptions\"), \" argument that itself allows a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"CustomProvider\"), \".\"), mdx(\"p\", null, \"It is through the use of a react-native-specific \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ReactNativeFirebaseAppCheckProvider\"), \" that we can offer runtime configuration capability at the javascript level, including the ability to switch providers dynamically.\"), mdx(\"p\", null, \"So AppCheck module initialization is done in two steps in react-native-firebase - first you create and configure the custom provider, then you initialize AppCheck using that custom provider.\"), mdx(\"h3\", {\n    \"id\": \"configure-a-custom-provider\"\n  }, \"Configure a Custom Provider\"), mdx(\"p\", null, \"To configure the react-native-firebase custom provider, first obtain one, then configure it according to the providers you want to use on each platform.\"), mdx(\"pre\", {\n    \"className\": \"language-javascript\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-javascript\"\n  }, mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword module\"\n  }, \"import\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token maybe-class-name\"\n  }, \"ReactNativeFirebaseAppCheckProvider\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword module\"\n  }, \"from\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'@react-native-firebase/app-check'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"const\"), \" rnfbProvider \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"=\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"new\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token class-name\"\n  }, \"ReactNativeFirebaseAppCheckProvider\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\nrnfbProvider\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token method function property-access\"\n  }, \"configure\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n  android\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n    provider\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" __DEV__ \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"?\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'debug'\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'playIntegrity'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n    debugToken\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'some token you have configured for your project firebase web console'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n  apple\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n    provider\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" __DEV__ \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"?\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'debug'\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'appAttestWithDeviceCheckFallback'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n    debugToken\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'some token you have configured for your project firebase web console'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n  web\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n    provider\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'reCaptchaV3'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n    siteKey\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'unknown'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\")), mdx(\"h3\", {\n    \"id\": \"install-the-custom-provider\"\n  }, \"Install the Custom Provider\"), mdx(\"p\", null, \"Once you have the custom provider configured, install it in app-check using the firebase-js-sdk compatible API, while saving the returned instance for usage:\"), mdx(\"pre\", {\n    \"className\": \"language-javascript\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-javascript\"\n  }, mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword module\"\n  }, \"import\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \" getApp \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword module\"\n  }, \"from\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'@react-native-firebase/app'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword module\"\n  }, \"import\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \" initializeAppCheck \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword module\"\n  }, \"from\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'@react-native-firebase/app-check'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"const\"), \" appCheck \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"=\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"await\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token function\"\n  }, \"initializeAppCheck\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token function\"\n  }, \"getApp\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n  provider\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" rnfbProvider\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n  isTokenAutoRefreshEnabled\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token boolean\"\n  }, \"true\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\")), mdx(\"h3\", {\n    \"id\": \"verify-appcheck-was-initialized-correctly\"\n  }, \"Verify AppCheck was initialized correctly\"), mdx(\"p\", null, \"After initializing the custom provider, you can verify AppCheck is working by logging a response from the token server:\"), mdx(\"pre\", {\n    \"className\": \"language-javascript\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-javascript\"\n  }, mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword module\"\n  }, \"import\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \" getToken \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword module\"\n  }, \"from\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'@react-native-firebase/app-check'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"try\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token comment\"\n  }, \"// `appCheckInstance` is the saved return value from initializeAppCheck\"), \"\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"const\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \" token \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"=\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"await\"), \" appCheckInstance\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token method function property-access\"\n  }, \"getToken\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token boolean\"\n  }, \"true\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"if\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), \"token\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token property-access\"\n  }, \"length\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \">\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token number\"\n  }, \"0\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n    \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token console class-name\"\n  }, \"console\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token method function property-access\"\n  }, \"log\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'AppCheck verification passed'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"catch\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), \"error\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token console class-name\"\n  }, \"console\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token method function property-access\"\n  }, \"log\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'AppCheck verification failed'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \"\\n\")), mdx(\"h3\", {\n    \"id\": \"listening-for-token-changes\"\n  }, \"Listening for token changes\"), mdx(\"p\", null, \"On Android, you can subscribe to App Check token updates with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"onTokenChanged\"), \". On iOS this listener is not implemented yet \\u2013 subscribing will no-op and log a warning. If you need to react to token changes on iOS, prefer polling \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"getToken\"), \" on demand or rely on automatic refresh.\"), mdx(\"pre\", {\n    \"className\": \"language-javascript\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-javascript\"\n  }, mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword module\"\n  }, \"import\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \" onTokenChanged\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \" getToken \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword module\"\n  }, \"from\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'@react-native-firebase/app-check'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token comment\"\n  }, \"// Android: receives updates. iOS: no-op (native API does not exist on the SDK).\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"const\"), \" unsubscribe \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"=\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token function\"\n  }, \"onTokenChanged\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), \"appCheckInstance\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"async\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token parameter\"\n  }, mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \" token \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"token punctuation\"\n  }, \"}\")), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token arrow operator\"\n  }, \"=>\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token console class-name\"\n  }, \"console\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token method function property-access\"\n  }, \"log\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"'App Check token updated:'\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \" token\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token comment\"\n  }, \"// iOS-friendly approach: request a fresh token when needed\"), \"\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"const\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \" token \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \"=\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token keyword\"\n  }, \"await\"), \" appCheckInstance\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \".\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token method function property-access\"\n  }, \"getToken\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"(\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token boolean\"\n  }, \"true\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \")\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \";\"), \"\\n\")), mdx(\"h2\", {\n    \"id\": \"automatic-data-collection\"\n  }, \"Automatic Data Collection\"), mdx(\"p\", null, \"App Check has an \\\"tokenAutoRefreshEnabled\\\" setting. This may cause App Check to attempt a remote App Check token fetch prior to user consent. In certain scenarios, like those that exist in GDPR-compliant apps running for the first time, this may be unwanted.\"), mdx(\"p\", null, \"You may configure this setting in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"firebase.json\"), \" such that your desired configuration is in place even before you the react-native javascript bundle begins executing and allows for runtime configuration.\"), mdx(\"p\", null, \"If unset, the \\\"tokenAutoRefreshEnabled\\\" setting will defer to the app's \\\"automatic data collection\\\" setting, which may be set in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"firebase.json\"), \", or if you wish directly in the Info.plist or AndroidManifest.xml according to the Firebase native SDK documentation. Unless otherwise configured, it will default to true implying there will be automatic data collection and app check token refresh attempts.\"), mdx(\"h2\", {\n    \"id\": \"using-app-check-tokens-for-non-firebase-services\"\n  }, \"Using App Check tokens for non-firebase services\"), mdx(\"p\", null, \"The \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://firebase.google.com/docs/app-check/web/custom-resource\"\n  }, \"official documentation\"), \" shows how to use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"getToken\"), \" to access the current App Check token and then verify it in external services.\"), mdx(\"h2\", {\n    \"id\": \"manually-setting-up-app-check-debug-token-for-testing-environments--ci\"\n  }, \"Manually Setting Up App Check Debug Token for Testing Environments / CI\"), mdx(\"h3\", {\n    \"id\": \"on-ios\"\n  }, \"on iOS\"), mdx(\"p\", null, \"The react-native-firebase CustomProvider implementation allows for runtime configuration of the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"debug\"), \" provider as well as a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"debugToken\"), \" in the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ios\"), \" CustomProvider options. This allows the easy use of a token pre-configured in the Firebase console, allowing for dynamic configuration and testing of AppCheck in CI environments or iOS Simulators.\"), mdx(\"h3\", {\n    \"id\": \"on-android\"\n  }, \"on Android\"), mdx(\"p\", null, \"The react-native-firebase CustomProvider implementation allows for runtime configuration of the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"debug\"), \" provider as well as a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"debugToken\"), \" in the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"android\"), \" CustomProvider options. This allows the easy use of a token pre-configured in the Firebase console, allowing for dynamic configuration and testing of AppCheck in CI environments or Android Emulators.\"), mdx(\"p\", null, \"There are a variety of other ways to obtain and configure debug tokens for AppCheck testing, a few of which follow:\"), mdx(\"h4\", {\n    \"id\": \"a-when-testing-on-an-actual-android-device-debug-build\"\n  }, \"A) When testing on an actual android device (debug build)\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, \"Start your application on the android device.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"$adb logcat | grep DebugAppCheckProvider\"), \" to grab your temporary secret from the android logs. The output should look lit this:\"), mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"D DebugAppCheckProvider: Enter this debug secret into the allow list in\\nthe Firebase Console for your project: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\\n\"))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, \"In the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://console.firebase.google.com/project/_/settings/appcheck\"\n  }, \"Project Settings > App Check\"), \" section of the Firebase console, choose \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Manage debug tokens\"), \" from your app's overflow menu. Then, register the debug token you logged in the previous step.\"))), mdx(\"h4\", {\n    \"id\": \"b-specifying-a-generated-firebase_app_check_debug_token----building-for-cicd-debug-build\"\n  }, \"B) Specifying a generated \", mdx(\"inlineCode\", {\n    parentName: \"h4\"\n  }, \"FIREBASE_APP_CHECK_DEBUG_TOKEN\"), \" -- building for CI/CD (debug build)\"), mdx(\"p\", null, \"When you want to test using an Android virtual device -or- when you prefer to (re)use a token of your choice -- e.g. when configuring a CI/CD pipeline -- use the following steps:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, \"In the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://console.firebase.google.com/project/_/settings/appcheck\"\n  }, \"Project Settings > App Check\"), \" section of the Firebase console, choose \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Manage debug tokens\"), \" from your app's overflow menu. Then, register a new debug token by clicking the \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Add debug token\"), \" button, then \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Generate token\"), \".\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, \"Pass the token you created in the previous step by supplying a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"FIREBASE_APP_CHECK_DEBUG_TOKEN\"), \" environment variable to the process that build your react-native android app. e.g.:\"), mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"FIREBASE_APP_CHECK_DEBUG_TOKEN=\\\"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\\\" react-native run-android\\n\")))), mdx(\"p\", null, \"Please note that once the android app has successfully passed the app-checks controls on the device, it will keep passing them, whether you rebuild without the secret token or not. To completely reset app-check, you must first uninstall, and then re-build / install.\"), mdx(\"h4\", {\n    \"id\": \"c-when-using-expo-development-client\"\n  }, \"C) When using Expo Development Client\"), mdx(\"p\", null, \"When using expo-dev-client, the process is a little different, especially on an android emulator.\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"In the \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://console.firebase.google.com/project/_/settings/appcheck\"\n  }, \"Project Settings > App Check\"), \" section of the Firebase console, choose \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Manage debug tokens\"), \" from your app's overflow menu. Then, register a new debug token by clicking the \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Add debug token\"), \" button, then \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Generate token\"), \".\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Pass the token you created in the previous step by supplying a \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"FIREBASE_APP_CHECK_DEBUG_TOKEN\"), \" environment variable in your eas.json development profile:\")), mdx(\"pre\", {\n    \"className\": \"language-json\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n  ...\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token property\"\n  }, \"\\\"build\\\"\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n    \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token property\"\n  }, \"\\\"development\\\"\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n      \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token property\"\n  }, \"\\\"developmentClient\\\"\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token boolean\"\n  }, \"true\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n      \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token property\"\n  }, \"\\\"distribution\\\"\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"\\\"internal\\\"\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n      \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token property\"\n  }, \"\\\"env\\\"\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"{\"), \"\\n        ...\\n        \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token property\"\n  }, \"\\\"FIREBASE_APP_CHECK_DEBUG_TOKEN\\\"\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token operator\"\n  }, \":\"), \" \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token string\"\n  }, \"\\\"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\\\"\"), \"\\n      \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \"\\n    \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n    ...\\n  \", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \",\"), \"\\n  ...\\n\", mdx(\"span\", {\n    parentName: \"code\",\n    \"className\": \"token punctuation\"\n  }, \"}\"), \"\\n\")), mdx(\"ol\", {\n    \"start\": 3\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, \"Rebuild your development client:\"), mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"eas build --profile development --platform android\\n\")))));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"App Check","description":"Installation and getting started with App Check.","icon":"//firebase.google.com/static/images/products/icons/build_app_check.svg","noindex":null},"excerpt":"Installation This module requires that the  @react-native-firebase/app  module is already setup and installed. To install the \"app\"\nmodule…","tableOfContents":{"items":[{"url":"#installation","title":"Installation"},{"url":"#what-does-it-do","title":"What does it do"},{"url":"#usage","title":"Usage","items":[{"url":"#register-firebase-apps","title":"Register Firebase Apps"},{"url":"#initialize","title":"Initialize","items":[{"items":[{"url":"#all-react-native--077-with-appdelegateswift","title":"All react-native >= 0.77 with AppDelegate.swift"},{"url":"#configure-appcheck-with-ios-credentials-react-native-079","title":"Configure AppCheck with iOS credentials (react-native 0.79+)"},{"url":"#configure-appcheck-with-ios-credentials-react-native--077---079","title":"Configure AppCheck with iOS credentials (react-native >= 0.77 && < 0.79)"},{"url":"#configure-firebase-with-ios-credentials-react-native--077","title":"Configure Firebase with iOS credentials (react-native < 0.77)"}]},{"url":"#configure-a-custom-provider","title":"Configure a Custom Provider"},{"url":"#install-the-custom-provider","title":"Install the Custom Provider"},{"url":"#verify-appcheck-was-initialized-correctly","title":"Verify AppCheck was initialized correctly"},{"url":"#listening-for-token-changes","title":"Listening for token changes"}]},{"url":"#automatic-data-collection","title":"Automatic Data Collection"},{"url":"#using-app-check-tokens-for-non-firebase-services","title":"Using App Check tokens for non-firebase services"},{"url":"#manually-setting-up-app-check-debug-token-for-testing-environments--ci","title":"Manually Setting Up App Check Debug Token for Testing Environments / CI","items":[{"url":"#on-ios","title":"on iOS"},{"url":"#on-android","title":"on Android","items":[{"url":"#a-when-testing-on-an-actual-android-device-debug-build","title":"A) When testing on an actual android device (debug build)"},{"url":"#b-specifying-a-generated-firebase_app_check_debug_token----building-for-cicd-debug-build","title":"B) Specifying a generated FIREBASE_APP_CHECK_DEBUG_TOKEN -- building for CI/CD (debug build)"},{"url":"#c-when-using-expo-development-client","title":"C) When using Expo Development Client"}]}]}]}]},"headings":[{"depth":1,"value":"Installation"},{"depth":1,"value":"What does it do"},{"depth":1,"value":"Usage"},{"depth":2,"value":"Register Firebase Apps"},{"depth":2,"value":"Initialize"},{"depth":4,"value":"All react-native >= 0.77 with AppDelegate.swift"},{"depth":4,"value":"Configure AppCheck with iOS credentials (react-native 0.79+)"},{"depth":4,"value":"Configure AppCheck with iOS credentials (react-native >= 0.77 && < 0.79)"},{"depth":4,"value":"Configure Firebase with iOS credentials (react-native < 0.77)"},{"depth":3,"value":"Configure a Custom Provider"},{"depth":3,"value":"Install the Custom Provider"},{"depth":3,"value":"Verify AppCheck was initialized correctly"},{"depth":3,"value":"Listening for token changes"},{"depth":2,"value":"Automatic Data Collection"},{"depth":2,"value":"Using App Check tokens for non-firebase services"},{"depth":2,"value":"Manually Setting Up App Check Debug Token for Testing Environments / CI"},{"depth":3,"value":"on iOS"},{"depth":3,"value":"on Android"},{"depth":4,"value":"A) When testing on an actual android device (debug build)"},{"depth":4,"value":"B) Specifying a generated FIREBASE_APP_CHECK_DEBUG_TOKEN -- building for CI/CD (debug build)"},{"depth":4,"value":"C) When using Expo Development Client"}],"parent":{"__typename":"File","relativePath":"app-check/usage/index.md"}},"next":{"frontmatter":{"title":"App Distribution"},"fields":{"slug":"/app-distribution/usage"}},"previous":{"frontmatter":{"title":"Screen Tracking"},"fields":{"slug":"/analytics/screen-tracking"}},"sidebar":{"raw":"[[\"Getting Started\",\"/\"],[\"Migration Guide to v22\",\"/migrating-to-v22\"],[\"Migration Guide to v23\",\"/migrating-to-v23\"],[\"TypeScript\",\"/typescript\"],[\"Platforms\",\"/platforms\"],[\"Release Notes\",\"/releases\"],[\"FAQs and Tips\",\"/faqs-and-tips\"],[\"Feature Requests\",\"https://invertase.canny.io/react-native-firebase\"],[\"Contributing\",\"https://github.com/invertase/react-native-firebase/blob/main/CONTRIBUTING.md\"],[\"AI Logic\",[[\"Usage\",\"/ai/usage\"]],\"//firebase.google.com/static/images/icons/firebase-ai-logic.svg\"],[\"Analytics\",[[\"Usage\",\"/analytics/usage\"],[\"Screen Tracking\",\"/analytics/screen-tracking\"],[\"Building an Analytics Funnel\",\"https://blog.theodo.com/2018/01/building-google-analytics-funnel-firebase-react-native\"]],\"//firebase.google.com/static/images/products/icons/run_analytics.svg\"],[\"App Check\",[[\"Usage\",\"/app-check/usage\"]],\"//firebase.google.com/static/images/products/icons/build_app_check.svg\"],[\"App Distribution\",[[\"Usage\",\"/app-distribution/usage\"]],\"//firebase.google.com/static/images/products/icons/run_app_distribution.svg\"],[\"Authentication\",[[\"Usage\",\"/auth/usage\"],[\"Social Auth\",\"/auth/social-auth\"],[\"Phone Auth\",\"/auth/phone-auth\"],[\"OpenID Connect Auth\",\"/auth/oidc-auth\"],[\"Multi-factor Auth\",\"/auth/multi-factor-auth\"]],\"//firebase.google.com/static/images/products/icons/build_auth.svg\"],[\"Cloud Firestore\",[[\"Usage\",\"/firestore/usage\"],[\"Usage with Emulator\",\"/firestore/emulator\"],[\"Usage with FlatLists\",\"/firestore/usage-with-flatlists\"],[\"Implementing Pagination\",\"/firestore/pagination\"],[\"Building a \\\"TODO\\\" app\",\"https://invertase.io/blog/getting-started-with-cloud-firestore-on-react-native\"]],\"//firebase.google.com/static/images/products/icons/build_firestore.svg\"],[\"Cloud Functions\",[[\"Usage\",\"/functions/usage\"],[\"Writing & Deploying Functions\",\"/functions/writing-deploying-functions\"]],\"//firebase.google.com/static/images/products/icons/build_functions.svg\"],[\"Cloud Messaging\",[[\"Usage\",\"/messaging/usage\"],[\"iOS Project Setup\",\"/messaging/usage/ios-setup\"],[\"iOS Permissions\",\"/messaging/ios-permissions\"],[\"Notifications\",\"/messaging/notifications\"],[\"iOS Notification Images\",\"/messaging/ios-notification-images\"],[\"Server Integration\",\"/messaging/server-integration\"]],\"//firebase.google.com/static/images/products/icons/run_cloud_messaging.svg\"],[\"Cloud Storage\",[[\"Usage\",\"/storage/usage\"]],\"//firebase.google.com/static/images/products/icons/build_storage.svg\"],[\"Core / App\",[[\"Usage\",\"/app/usage\"],[\"JSON Config\",\"/app/json-config\"],[\"Utils\",\"/app/utils\"]],\"//static.invertase.io/assets/social/firebase-logo.png\"],[\"Crashlytics\",[[\"Usage\",\"/crashlytics/usage\"],[\"Viewing crash reports\",\"/crashlytics/crash-reports\"]],\"//firebase.google.com/static/images/products/icons/run_crashlytics.svg\"],[\"Realtime Database\",[[\"Usage\",\"/database/usage\"],[\"Offline Support\",\"/database/offline-support\"],[\"Presence Detection\",\"/database/presence-detection\"]],\"//firebase.google.com/static/images/products/icons/build_realtime_database.svg\"],[\"In-App Messaging\",[[\"Usage\",\"/in-app-messaging/usage\"]],\"//firebase.google.com/static/images/products/icons/run_in_app_messaging.svg\"],[\"Installations\",[[\"Usage\",\"/installations/usage\"]],\"//static.invertase.io/assets/social/firebase-logo.png\"],[\"ML\",[[\"Usage\",\"/ml/usage\"]],\"//firebase.google.com/static/images/products/icons/build_ml.svg\"],[\"Remote Config\",[[\"Usage\",\"/remote-config/usage\"]],\"//firebase.google.com/static/images/products/icons/run_remote_config.svg\"],[\"Performance Monitoring\",[[\"Usage\",\"/perf/usage\"],[\"Axios Integration\",\"/perf/axios-integration\"],[\"KY Integration\",\"/perf/ky-integration\"]],\"//firebase.google.com/static/images/products/icons/run_performance.svg\"],[\"VertexAi\",[[\"Usage\",\"/vertexai/usage\"]],\"//static.invertase.io/assets/social/firebase-logo.png\"],[\"Legacy docs\",[[\"Migrating to v6\",\"/migrating-to-v6\"],[\"Legacy Docs (<= v5)\",\"https://v5.rnfirebase.io/docs/v5.x.x/getting-started\"]],\"//static.invertase.io/assets/social/firebase-logo.png\"]]"}},"pageContext":{"id":"6a1eda0c-dce3-5a5d-adbf-5cc22deadc3c","next":"/app-distribution/usage","previous":"/analytics/screen-tracking"}},"staticQueryHashes":["3688227230"]}