# Braze Documentation Index of all Developer Guide pages and their headings. ## Developer Guide - [Braze Developer Guide](/docs/developer_guide/home/index.md) - [Getting Started](/docs/developer_guide/getting_started/index.md): You can follow along with this guide, or you can check out Braze Learning for guided courses, such as our Marketer and Developer learning paths. - [SDK Overview for Developers](/docs/developer_guide/getting_started/sdk_overview/index.md): Are you a marketer looking for a basic rundown of the SDK? Check out our marketer overview, instead. - # ![Braze Learning course](https://learning.braze.com/path/developer/sdk-integration-basics){: style="float:right;width:120px;border:0;" class="noimgborder"}SDK overview for developers - ## App performance - ## SDK compatibility - ## Default analytics and session handling - ## Data upload and download - ## Blocking data collection - ## What version of the SDK am I on? - [Platform Overview](/docs/developer_guide/getting_started/platform_overview/index.md): Check out our free Developer Learning Path course along with these articles. - # ![Braze Learning course](https://learning.braze.com/path/developer){: style="float:right;width:120px;border:0;" class="noimgborder"}Getting started: Platform overview - ## What is Braze? - ### SDK - ### Dashboard user interface - ### REST API - ## Data analysis and action - ### App analytics - ### User segmentation - ## Multichannel messaging - ### Customizable components - ## Integrating Braze - ## Resources to bookmark - [Integration Overview](/docs/developer_guide/getting_started/integration_overview/index.md): !A venn diagram of four circles - discovery, integrate, quality assurance and maintain - centered around "time to value."{: style="max-width:50%;float:right;margin-left:15px;border:none;"} - # ![Braze Learning course](https://learning.braze.com/sdk-integration-basics){: style="float:right;width:120px;border:0;" class="noimgborder"}Getting started: Integration overview - ## Discovery and planning {#discovery} - ### Campaign planning - ### Creating data requirements - ### Customizations planning - ### Getting dashboard access - ### Workspaces and API keys - ## Integration {#integration} - ### CDP integration partners - ### Braze SDK integration - ### Using the Braze API - ### Setting up product analytics - ### Migrating legacy user data - ### Setting up session tracking - ### Tracking custom events, attributes, and purchase events - ### Other tools - ## Quality assurance {#qa} - ### Passing Braze off to marketers - ### Develop for the future - ## Maintenance {#maintenance} - ## SDK rate limits - ### Monthly Active Users CY 24-25, Universal MAU, Web MAU, and Mobile MAU - ### Finding your rate limits - ### Requesting higher rate limits - ### Changes and support - [Architectural Overview](/docs/developer_guide/getting_started/architecture_overview/index.md): At a high level, Braze is about data. The Braze platform, powered by the SDK, the REST API, and partner integrations, allows you to aggregate and act on your data. - # Getting started: Architectural overview - ## Data ingestion {#ingestion} - ### Data source breakdown - #### MongoDB-powered features - #### Snowflake-powered features - ### Backend data sources through the Braze API - ### Frontend data sources through Braze SDK - ### Partner integrations - ### Direct warehouse connection through Braze Cloud Data Ingestion - ## Classification {#classification} - ## Orchestration {#orchestration} - ### Feature flags - ## Personalization {#personalization} - ## Action {#action} - ### Messaging channels - ## Exporting data - ### Currents - ### Snowflake data sharing - ### Braze export APIs - ### CSVs - ## Putting it all together - [Building with an LLM](/docs/developer_guide/getting_started/build_with_llm/index.md): AI coding assistants can help you write integration code, troubleshoot issues, and explore Braze SDK features—but only if they have the right context. The Braze Docs MCP server provides your AI assistant with direct access to Braze documentation, so it can generate accurate code snippets and answer technical questions based on the latest SDK references. - # Building with an LLM - ## Connecting to the Braze Docs MCP - ### Setting up Context7 - ## Writing prompts for Braze SDK development - ### React Native SDK - #### Initializing the SDK - #### Logging custom events with properties - #### Setting up push notifications - #### Handling in-app messages - ### Web SDK - #### Initializing the SDK - #### Tracking custom events and purchases - #### Registering for web push - #### Managing user attributes - ## Plain text documentation - [Customization Overview](/docs/developer_guide/getting_started/customization_overview/index.md): The Braze SDK is a powerful toolkit, but at a high level it provides two important pieces of functionality: it helps collect and sync user data across platforms to a consolidated user profile, and also handles messaging channels like in-app messages, push notifications, and Content Cards. The articles in the Customization Guide assume you've already gone through the SDK implementation process. - # Customization overview - [Braze SDK Tutorials](/docs/developer_guide/tutorials/index.md) - [Integrate the Braze SDK](/docs/developer_guide/sdk_integration/index.md): After integrating the SDK, you can enable SDK Authentication to add an additional layer of security by preventing unauthorized SDK requests. SDK Authentication is available for Web, Android, Swift, React Native, Flutter, Unity, Cordova, .NET MAUI (Xamarin), and Expo. - # !Braze Logo{: style="float:right;width:120px;border:0;" class="noimgborder"}Integrate the Braze SDK - ## About the Web Braze SDK - ## Integrate the Web SDK - ### Step 1: Install the Braze library - ### Step 2: Initialize the SDK - ### Prerequisites - ### Step 1: Open the tag template gallery - ### Step 2: Add the initialization tag template - ### Step 3: Configure the tag - ### Step 4: Set to Trigger on all pages - ### Step 5: Verify your integration - ## Filtering bot traffic {#bot-filtering} - ### Limitations of SDK-side bot detection - ### Implementing bot filtering - #### Require user interaction - #### Custom bot detection - ### Best practices - ## Optional configurations - ### Logging - #### Basic logging - #### Custom logging - ## Upgrading the SDK - ## Other integration methods - ### Accelerated Mobile Pages (AMP) - #### Step 1: Include AMP web push script - #### Step 2: Add subscription widgets - #### Step 3: Add helper-iframe and permission-dialog - #### Step 4: Create a service worker file - #### Step 5: Configure the AMP web push HTML element - ### Asynchronous Module Definition (AMD) - #### Disable support - #### Module loader - ### Electron {#electron} - ### Jest framework {#jest} - ### SSR frameworks {#ssr} - ### Tealium iQ - ### Vite {#vite} - ### Other tag managers - ## Integrating the Android SDK - ### Step 1: Update your Gradle build configuration - ### Step 2: Configure your braze.xml - ### Step 3: Add permissions to AndroidManifest.xml - ### Step 4: Enable delayed initialization (optional) - #### Step 4.1: Update your braze.xml - #### Step 4.2: Configure push analytics (optional) - ##### Explicitly queue {#explicitly-queue-push-analytics} - ##### Drop {#drop-push-analytics} - #### Step 4.3: Manually initialize the SDK - ### Step 5: Enable user session tracking - ## Testing session tracking - ## Optional configurations - ### Runtime configuration - ### Google Advertising ID - ### Location tracking - ### Logging - #### Enabling logs - #### Verifying verbose logs - #### Suppressing logs - ### Multiple API keys - ### Exclusive in-app message TalkBack - ### R8 and ProGuard - ## Integrating the Swift SDK - ### Prerequisites - ### Step 1: Install the Braze Swift SDK - #### Step 1.1: Import SDK version - #### Step 1.2: Select your packages - ##### About Extension libraries - #### Step 1.1: Install CocoaPods - #### Step 1.2: Constructing the Podfile - ##### About additional libraries - ###### Extension libraries - #### Step 1.3: Install the SDK - #### Updating the SDK using CocoaPods - #### Step 1.1: Download the Braze SDK - #### Step 1.2: Choose your frameworks - #### Step 1.3: Prepare your files - #### Step 1.4: Integrate your frameworks - #### Common errors for Objective-C projects - ### Step 2: Set up delayed initialization (optional) - #### Step 2.1: Prepare for delayed initialization - #### Step 2.2: Configure push analytics behavior (optional) - ##### Explicitly queue - ##### Drop - #### Step 2.3: Customize push automation (optional) - #### Step 2.4: Initialize the SDK - ### Step 3: Update your app delegate - ## Optional configurations - ### Logging - #### Log levels - #### Setting the log level - ## Integrating the Cordova SDK - ### Prerequisites - ### Step 1: Add the SDK to your project - ### Step 2: Configure your project - ## Platform-specific syntax - ### Integers - ### Booleans - ## Optional configurations {#optional} - ## Disabling automatic session tracking (Android only) {#disable-automatic-session-tracking} - ## About the Flutter Braze SDK - ## Integrating the Flutter SDK - ### Prerequisites - ### Step 1: Integrate the Braze library - ### Step 2: Complete native SDK setup - ### Step 3: Set up the plugin - ## Testing the integration - ## About the React Native Braze SDK - ## New Architecture compatibility - ## Integrating the React Native SDK - ### Prerequisites - ### Step 1: Integrate the Braze library - ### Step 2: Choose a setup option - #### Step 2.1: Install the Braze Expo plugin - #### Step 2.2: Add the plugin to your app.json - ##### Configuring Android push notification icons {#android-push-icons} - ###### Icon placement and format - ###### Icon requirements - ###### Configuration in app.json - ###### How it works - #### Step 2.3: Build and run your application - #### Step 2.1: Add our repository - #### Step 2.2: Configure the Braze SDK - #### Step 2.3: Implement user session tracking - #### Step 2.4: Handle intent updates - #### Step 2.1: (Optional) Configure Podfile for dynamic XCFrameworks - #### Step 2.2: Install pods - #### Step 2.3: Configure the Braze SDK - ### Step 3: Import the library - ### Step 4: Test the integration (optional) - ## Next steps - ## Integrating the Roku SDK - ### Step 1: Add files - ### Step 2: Add references - ### Step 3: Configure - ### Step 4: Initialize Braze - ## Optional configurations - ### Logging - ## About the Unity Braze SDK - ## Integrating the Unity SDK - ### Prerequisites - ### Step 1: Choose your Braze Unity package - ### Step 2: Import the package - ### Step 3: Configure the SDK - #### Step 3.1: Configure AndroidManifest.xml - #### Step 3.2: Update AndroidManifest.xml with your package name - #### Step 3.3: Add gradle dependencies - #### Step 3.4: Automate the Unity Android integration - #### Step 3.1: Set your API key - ## Customizing the Unity package - ### Step 1: Clone the repository - ### Step 2: Export package from repository - ### Step 3: Import package into Unity - ## Switch to an automated integration (Swift only) {#automated-integration} - ## Optional configurations - ### Verbose logging - ### Prime 31 compatibility - ### Amazon Device Messaging (ADM) - ### Extending the Braze Unity player (Android only) {#extend-unity-player} - ## Troubleshooting - ### Error: "File could not be read" - ## Integrating the .NET MAUI SDK - ### Prerequisites - ### Step 1: Get the .NET MAUI binding - ### Step 2: Configure your Braze instance - #### Step 2.1: Configure the Braze SDK in Braze.xml - #### Step 2.2: Add required permissions to Android manifest - #### Step 2.3: Track user sessions and registering for in-app messages - ### Step 3: Test the integration - # ChatGPT app integration - ## Setup - ### Step 1: Get the Braze integration file - ### Step 2: Install dependencies - ## Implementation - ### Client-side integration (custom widgets) - #### Configure widget metadata - #### Set up the useBraze hook - #### Display Braze Content Cards - #### Track widget events - ### Server-side integration (MCP server) - #### Set up session information - #### Track user interactions - #### Track purchases and transactions - ## About the Braze Vega SDK - ## Integrating the Braze Vega SDK - ### Step 1: Install the Braze library - ### Step 2: Initialize the SDK - ## Optional configurations - ### Logging - #### Enable logging during initialization - #### Enable logging after initialization - #### Custom logging - ### Configuration options - ## Upgrading the SDK - ## Testing your integration - [Google Tag Manager with the Braze SDK](/docs/developer_guide/sdk_integration/google_tag_manager/index.md): Google Tag Manager (GTM) lets you remotely add, remove, and edit tags on your website without requiring a production code release or engineering resources. Braze offers the following templates for the Web SDK: - # Google Tag Manager with the Braze SDK - ## About Google Tag Manager for Web {#google-tag-manager} - ## Google's EU User Consent Policy - ## Prerequisites - ## Using Google Tag Manager for Android - ### Step 1: Create a trigger for custom events - ### Step 2: Log custom attributes - ### Step 3: Call changeUser() - ### Step 4: Add a custom tag provider {#adding-android-google-tag-provider} - ## Prerequisites - ## Using Google Tag Manager for Swift - ### Step 1: Create a trigger for custom events - ### Step 2: Log custom attributes - ### Step 3: Call changeUser() - ### Step 4: Add a custom tag provider {#adding-ios-google-tag-provider} - [Set up authentication for the Braze SDK](/docs/developer_guide/sdk_integration/authentication/index.md): After you enable this feature in your app, you can configure the Braze dashboard to reject any requests with an invalid or missing JSON Web Token (JWT), which includes: - # Set up SDK authentication - ## How it works - ## Setting up authentication - ### Step 1: Set up your server {#server-side-integration} - #### Step 1.1: Generate a public/private key-pair {#generate-keys} - #### Step 1.2: Create a JSON Web Token for the current user {#create-jwt} - ### Step 2: Configure the SDK {#sdk-integration} - #### Step 2.1: Enable authentication in the Braze SDK. - #### Step 2.2: Set the current user's JWT - #### Step 2.3: Register a callback function for invalid tokens {#sdk-callback} - ### Step 3: Enable authentication in the dashboard {#braze-dashboard} - #### Enforcement options {#enforcement-options} - ## Managing public keys {#key-management} - ### Adding a public key - ### Assign a new primary key - ### Deleting a key - ## Analytics {#analytics} - ## Error codes {#error-codes} - ## Frequently Asked Questions (FAQ) {#faq} - #### Does this feature need to be enabled on all of my apps at the same time? {#faq-app-by-app} - #### What happens to users who are still on older versions of my app? {#faq-sdk-backward-compatibility} - #### What expiration should I use when generating a JWT? {#faq-expiration} - #### What happens if a JWT expires in the middle of a user's session? {#faq-jwt-expiration} - #### What happens if my server-side integration breaks and I can no longer create a JWT? {#faq-server-downtime} - #### Why does this feature use public/private keys instead of shared secrets? {#faq-shared-secrets} - #### How will rejected requests be retried? {#faq-retry-logic} - #### Can you use SDK authentication for anonymous users? {#faq-anonymous-users} - [Debugging the Braze SDK](/docs/developer_guide/sdk_integration/debugging/index.md): For deeper investigation, you can also enable verbose logging to capture detailed SDK output and learn how to read verbose logs for specific channels. - # Debugging the Braze SDK - ## Prerequisites - ## Debugging the Braze SDK - ### Step 1: Close your app - ### Step 2: Create a debugging session - ### Step 3: Select a user - ### Step 4: Relaunch the app - ### Step 5: Complete the reproduction steps - ### Step 6: End your session - ### Step 7: Share or export your session (optional) - [Verbose logging](/docs/developer_guide/sdk_integration/verbose_logging/index.md): When something isn't working as expected—such as a push notification not arriving, an in-app message not displaying, or user data not syncing—verbose logs help you identify the root cause. Instead of guessing, you can see exactly what the SDK is doing at each step. - # Verbose logging - ## When to use verbose logging - ## Enabling verbose logging - ## Collecting logs - ## Reading verbose logs - ## Sharing logs with Braze Support - [Reading verbose logs](/docs/developer_guide/sdk_integration/reading_verbose_logs/index.md): Before you start, make sure you've enabled verbose logging and know how to collect logs on your platform. - # Reading verbose logs - ## Sessions - ### Key log entries - ### What to check - ## Push notifications - ### Token registration - ### What to check - ### Push delivery and click - ### What to check - ## In-app messages - ### Message delivery - ### Message display and impression - ### Click and button events - ### What to check - ## Content Cards - ### Card sync - ### Impressions, clicks, and dismissals - ### What to check - ## Deep links - ### What to check - ## User identification - ## Network requests - ### Request structure - ### What to check - ## Common event abbreviations - [Braze SDK rate limits](/docs/developer_guide/sdk_integration/rate_limits/index.md): Braze SDK rate limiting uses the following features to optimize performance, minimize battery drain, reduce data usage, and ensure reliable data delivery: - # Braze SDK rate limits - ## Understanding SDK rate limits - ### Asynchronous processing - ### Adaptive rate limiting - ### Networking optimizations - ## Best practices - ## Getting help - [Integrate Braze with ChatGPT Apps](/docs/developer_guide/sdk_integration/chatgpt_apps/index.md): !A Content Card integrated into ChatGPT app.{: style="float:right;max-width:30%;border:none;" } - # Integrate Braze with ChatGPT apps - ## Overview - ### Key benefits - ## Prerequisites - # ChatGPT app integration - ## Setup - ### Step 1: Get the Braze integration file - ### Step 2: Install dependencies - ## Implementation - ### Client-side integration (custom widgets) - #### Configure widget metadata - #### Set up the useBraze hook - #### Display Braze Content Cards - #### Track widget events - ### Server-side integration (MCP server) - #### Set up session information - #### Track user interactions - #### Track purchases and transactions - [About version management for the Braze SDK](/docs/developer_guide/sdk_integration/version_management/index.md): All Braze SDKs adhere to the Semantic Versioning Specification (SemVer), so given a version number MAJOR.MINOR.PATCH, we recommend the following: - # About version management - ## Versioning recommendations - ## About known issues - [Android 13 Upgrade Guide](/docs/developer_guide/platforms/android/android_13/index.md): Refer to the Android 13 developer documentation for a full migration guide. - # Upgrading to Android 13 - ## Android 13 Braze SDK - ## Changes in Android 13 - ### Push permission {#push-permission} - #### Permission prompt timing {#push-permission-timing} - ## Preparing for Android 13 {#next-steps} - [Upgrading to iOS 18](/docs/developer_guide/platforms/swift/ios_18/index.md): Apple's WWDC took place June 9th - 11th 2024. Learn more about their announcements in our blog post, or read on to learn how you can leverage iOS 18 with Braze. - # Upgrading to iOS 18 - ## Changes in iOS 18 - ### Live Activities on Apple Watch - ### Apple Vision Pro - ### iPhone notifications on macOS - ### Apple Intelligence - [visionOS support](/docs/developer_guide/platforms/swift/visionos/index.md): Most features available on iOS are also available on visionOS, including: - # visionOS support - ## Fully supported features - ## Partially supported features - ## Unsupported features - [iOS 14 SDK Upgrade Guide](/docs/developer_guide/platforms/swift/_archived_updates/ios_14/index.md): As of iOS 14.5, IDFA collection and certain data sharing will require the new AppTrackingTransparency Framework permission prompt (Learn More). - # iOS 14 SDK upgrade guide - #### Summary of iOS 14 breaking changes - ## Upgrade summary - ## iOS 14 behavior changes - ### Approximate location permission - #### Overview - #### Geofences {#geofences} - #### Location targeting {#location-tracking} - ### IDFA and app tracking transparency {#idfa} - #### Overview - #### Changes to Braze IDFA collection - ### Push authorization {#push-provisional-auth} - ## iOS 14 new features - ### App privacy and data collection overview {#app-privacy} - #### Apple developer portal questionnaire - #### Braze default data collection - #### Optional data collection - [iOS 15 SDK Upgrade Guide](/docs/developer_guide/platforms/swift/_archived_updates/ios_15/index.md): As part of our annual testing of iOS betas, we have identified a change made by Apple which causes certain UI navigation bars to appear transparent instead of opaque. This will be visible on iOS 15 when using the Braze default UI for Content Cards, or when web deep links are opened inside your app instead of in a separate browser app. - # iOS 15 SDK upgrade guide - ## Transparency changes to UI navigations - ## New notification settings {#notification-settings} - ### Focus modes {#focus-mode} - ### Interruption levels {#interruption-levels} - ### Notification summary {#notification-summary} - ## Location buttons {#location-buttons} - ### Using location buttons with Braze - ## Apple mail {#mail} - ## Safari IP address location - [iOS 16 Upgrade Guide](/docs/developer_guide/platforms/swift/_archived_updates/ios_16/index.md): Apple has announced two changes to their Web Push functionality. - # iOS 16 SDK upgrade guide - ## Changes in iOS 16 - ### Safari Web Push {#safari-web-push} - #### Desktop Web Push (MacOS) {#macos-push} - #### Mobile Web Push (iOS and iPadOS) {#ios-push} - ## Preparing for iOS 16 {#next-steps} - [iOS 17 Upgrade Guide](/docs/developer_guide/platforms/swift/_archived_updates/ios_17/index.md): The Braze Swift SDK and Objective-C SDK are both backward compatible with Xcode 14 and Xcode 15, and compatible with iOS 17 devices. - # iOS 17 upgrade guide - ## iOS 17 and Xcode 15 compatibility - ## Changes in iOS 17 - ### Link tracking and UTM parameter stripping - ### App Tracking Transparency - #### Privacy manifests - #### Code signing - ### Braze SDK and privacy - [Browser Extensions Integration for Web](/docs/developer_guide/platforms/web/browser_extensions/index.md): Integrate the Braze Web SDK within your browser extension to collect analytics and display rich messaging to users. This includes both Google Chrome Extensions and Firefox Add-Ons. - # Browser extension - ## What's supported - ## What's not supported - ## Extension types - ## Permissions - ## Getting started - ### Extension popups {#popup} - ### Background script (Manifest v2 only) {#background-script} - ### Options page {#options-page} - ## Initialization - ## Push - [Content Security Policy Headers for Web](/docs/developer_guide/platforms/web/content_security_policy/index.md): This article is intended for developers working on websites that enforce CSP rules and integrate with Braze. It is not intended as advice on how you should approach security. - # Content security policy headers - ## Nonce attributes {#nonce} - ## Directives {#directives} - ### connect-src {#connect-src} - ### script-src {#script-src} - ### img-src {#img-src} - ## Font Awesome {#font-awesome} - [Accessibility](/docs/developer_guide/platforms/web/accessibility/index.md): Braze Web SDK supports the standards provided by the Web Content Accessibility Guidelines (WCAG 2.1). We maintain a 100/100 lighthouse score for content cards and in-app messages on all of our new builds to uphold our accessibility standard. - # Accessibility - ## Prerequisites - ### Notable accessibility fixes - ## Supported accessibility features - ## Accessibility guidelines for SDK integrations - ### Content Cards - #### Setting a maximum height - #### Viewport considerations - ### In-app messages - ### Mobile considerations - #### Responsive design - ### Testing accessibility - #### Manual test checklist - ### Common accessibility issues - [Smart TV support for the Web Braze SDK](/docs/developer_guide/platforms/web/smart_tvs/index.md): For a complete technical reference, check out our JavaScript Documentation or our sample apps to see the Web SDK running on a TV. - # Smart TV support - ## Prerequisites - ## Configuring the Web Braze SDK - ## Analytics - ## In-app messages and Content Cards - [TV and OTT Integrations for Braze](/docs/developer_guide/platforms/tv_and_ott/index.md): The following lists features and messaging channels supported today. - # TV and OTT integrations - ## Platforms and features - ## Integration guides - ### Amazon Fire TV {#fire-tv} - ### Kindle Fire {#kindle-fire} - ### Android TV {#android-tv} - ### LG webOS {#lg-webos} - ### Samsung Tizen {#tizen} - ### Roku {#roku} - ### Apple TV OS {#tvos} - ### Apple Vision Pro {#vision-pro} - ## App targeting {#app-targeting} - ## Headless UI {#custom-ui} - [Integration Overview for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/overview/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - [Carthage Integration for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/installation_methods/carthage_integration/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Carthage integration - ## Import the SDK - ### Previous versions - ## Next steps - ## Core only integration - [CocoaPods Integration for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/installation_methods/cocoapods/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # CocoaPods integration - ## Step 1: Install CocoaPods - ## Step 2: Constructing the Podfile - #### Subspecs - ## Step 3: Installing the Braze SDK - ## Next steps - ## Updating the Braze SDK via CocoaPods - [Swift Package Manager Integration for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/installation_methods/swift_package_manager/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Swift Package Manager integration - ## Step 1: Adding the dependency to your project - ### Import SDK version - ### Select packages - ## Step 2: Configuring your project - ## Step 3: Editing the target's scheme - ## Next steps - [Manual Integration Options for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/installation_methods/manual_integration_options/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Manual integration - ## Step 1: Downloading the Braze SDK - ### Option 1: Dynamic XCFramework - ### Option 2: Static XCFramework for static integration - ## Step 2: Adding required iOS libraries - ### SDWebImage integration - ### Optional location tracking - ## Step 3: Objective-C bridging header - ## Next steps - [Complete the iOS SDK Integration](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/completing_integration/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Complete the integration - ## Step 1: Update your app delegate - ## Step 2: Specify your data cluster - ### Compile-time endpoint configuration (recommended) - ### Runtime endpoint configuration - ## SDK integration complete - ## Customizing Braze on startup - ## Appboy.sharedInstance() and Swift nullability - ## Additional resources - [Other SDK Customizations for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/other_sdk_customizations/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Other SDK customizations - ## Braze log level - ### Log levels - ### Verbose logging - ### Setting log level - ## Optional IDFV collection - Swift - ## Optional IDFA collection - ### iOS 14.5 AppTrackingTransparency - ### Implementing IDFA collection - ##### Step 1: Implement ABKIDFADelegate - ##### Step 2: Set the delegate during Braze initialization - ## Approximate iOS SDK size {#ios-sdk-size} - [Braze SDK Integration Guide for iOS (Optional)](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/ios_sdk_integration/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Braze iOS SDK integration guide - ## Integration overview - ### Create BrazeManager.swift - ##### Create BrazeManager.swift - ### Initialize the SDK - ##### Initialize SDK from BrazeManager.swift - ##### Handle Appboy initialization in the AppDelegate.swift - ### Push notifications - ##### Add push certificate - ##### Register for push notifications - ##### Forward push notification methods - ###### Step 1: Create extension for push notification code - ###### Step 2: Support remote notifications - ###### Step 3: Remote notification handling - ###### Step 4: Forward notification responses - ### Access user variables and methods - ##### Create user variables and methods - ### Log analytics - ##### Create log custom event method - ##### Create log custom attributes method - ##### Create log purchase method - ### In-app messages - ##### Conform to ABKInAppMessageUIDelegate - ##### Add delegate methods - ### Content Cards - ##### Create Content Card variables and methods - ## Next steps - [Push Integration for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/integration/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Push integration - ## Step 1: Upload your APNs token - ## Step 2: Enable push capabilities - ## Step 3: Register for push notifications - ### Using UserNotification framework (iOS 10+) - ### Without UserNotifications framework - ## Step 4: Register push tokens with Braze - ## Step 5: Enable push handling - ### iOS 10+ - ### Pre-iOS 10 - ## Step 6: Deep linking - ## Step 7: Unit tests (optional) - [iOS Push Customization](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/index.md):

- [Push Action Buttons for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/action_buttons/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Action buttons {#push-action-buttons-integration} - ## Step 1: Adding Braze default push categories - ## Step 2: Enable interactive push handling - ## Push category customization - [Custom Push Notification Sounds for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/custom_sounds/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Custom sounds - ## Step 1: Hosting the sound in the app - ## Step 2: Providing the dashboard with a protocol URL for the sound - [Rich Push Notifications for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/rich_notifications/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # iOS 10 rich notifications - ## Creating a service extension - ## Setting up the service extension - ### Configuring the service extension to work with Braze - ### Example code - ## Creating a rich notification in your dashboard - [Push Notification Badge Counts for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/badges/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Badges - [Ignore Braze Internal Push Notifications for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/ignoring_internal_push/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Ignore Braze internal push notifications - ## Checking your app for automatic actions - ## Using Braze internal push utility methods - ## Implementation example {#internal-push-implementation-example} - [Advanced Push Settings](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/advanced_settings/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Advanced settings - ## Extracting data from push key-value pairs - ## Alert options - ## Adding content-available flag - ## Adding mutable-content flag - ## Update app badge count - ## Sounds - ## Collapse ID - ## Expiry - [Silent Push Notifications for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/silent_push_notifications/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Silent push notifications - ## Sending silent push notifications - ## Use silent push notifications to trigger background work - ## iOS silent notifications limitations - [Push Primer for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/push_primer/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Push primer integration - ## Step 1: Add snippet in AppDelegate.m file - ## Step 2: Append custom event checker to AppDelegate.m file - ## Step 3: Set up a deep link handler - [Push Stories for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/push_story/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Push Story setup - ## Step 1: Enable push in your app - ## Step 2: Adding the Notification Content Extension target - ## Step 3: Enable capabilities - ### Adding an App Group - ## Step 4: Adding the Push Story framework to your app - ## Step 5: Updating your notification view controller - ## Step 6: Set the notification content extension storyboard - ## Step 7: Set the notification content extension plist - ## Step 8: Updating the Braze integration in your main app - ##### Option 1: Runtime - ##### Option 2: Info.plist - ## Next steps - [Advanced Push Notification Implementation for iOS (Optional)](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/implementation_guide/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Push notification implementation guide - ## Notification content app extensions - #### Requirements - ### Custom category configuration - ## Use case and implementation walkthrough - ### Interactive push notification - #### Dashboard configuration - #### Other use cases - ##### Ready to log analytics? - ### Personalized push notifications - #### Dashboard configuration - #### Handling key-value pairs - #### Other use cases - ##### Ready to log analytics? - ### Information capture push notification - #### Dashboard configuration - #### Handling button actions - ##### Dismissing pushes - #### Other use cases - ##### Ready to log analytics? - ## Logging analytics - ### Logging with the Braze API (recommended) - ### Logging manually - #### Step 1: Configure App Groups within Xcode - #### Step 2: Integrate code snippets - ##### Saving custom events - ##### Sending custom events to Braze - ##### Saving custom attributes - ##### Sending custom attributes to Braze - ##### Saving user attributes - ##### Sending user attributes to Braze - ##### Helper files - [Push Notification Testing for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/testing/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Testing {#push-testing} - [Push Notification Unit Tests for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/unit_tests/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Unit tests {#unit-tests} - ## Step 1: Creating a unit tests target - ## Step 2: Add the Braze SDK to your unit tests - ## Step 3: Add OCMock to your unit tests - ## Step 4: Finish installing the added libraries - ## Step 5: Adding push tests - ## Step 6: Run test suite - [Push Notification Troubleshooting for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/troubleshooting/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Troubleshooting {#push-troubleshooting} - ## Understanding the Braze/APNs workflow - #### Step 1: Configuring the push certificate and provisioning profile - #### Step 2: Devices register for APNs and provide Braze with push tokens - #### Step 3: Launching a Braze push campaign - #### Step 4: Removing invalid tokens - ## Utilizing the push error logs - ## Push registration issues - #### No push registration prompt - #### No "push registered" users showing in the dashboard - ## Devices not receiving push notifications - #### Users no longer "push registered" after sending a push notification - ##### Dashboard and app certificate mismatch - ##### Uninstalls - ##### Regenerating your provisioning profile - #### Users still "push registered" after sending a push notification - ##### App is foregrounded - ##### Test notification scheduled incorrectly - #### User not "push registered" for the app being tested - ## Push messages not sending - ## Message activity log errors - #### Received unregistered sending to push token {#received-unregistered-sending} - #### Device token not for topic - #### BadDeviceToken sending to push token - ## Issues after push delivery - #### Push clicks not logged {#push-clicks-not-logged} - #### Web links from push clicks not opening - #### Deep links from push clicks not opening - #### Few or no direct opens - [In-App Message Overview for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/overview/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # In-app messages - ## In-app message types - ### Expected behaviors by message types - [iOS In-App Message Customization](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/index.md):

- [Set In-App Message Delegates for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/setting_delegates/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Set delegates - ## In-app message delegate - ## Core in-app message delegate - ## Method declarations - ## Implementation samples - [Customize In-App Message Orientation for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/customizing_orientation/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Customize orientation - ## Setting orientation for all in-app messages - ## Setting orientation per in-app message - ## Method declarations - [Customize In-App Message Display Handling for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/handling_in_app_display/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Custom handling in-app message display - ## Overriding in-app messages before display - ## Disabling Dark Mode - ## Hiding the status bar during display - ## Logging impressions and clicks - ## Method declarations - ## Implementation samples - [Customize In-App Message On-Click Behavior for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/behavior_on_click/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Customize in-app message behavior on click - ## Customizing in-app message body clicks - ## Customizing in-app message button clicks - ## Method declarations - [Customize In-App Message Triggering for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/custom_triggering/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Custom in-app message triggering - ## Step 1: Handle silent push and key-value pairs - ## Step 2: Create a push campaign - ## Step 3: Create an in-app message campaign - [In-App Message in a Custom View Controller for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/custom_view_controller/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Display in-app messages in a custom view controller - ## Method declarations - ## Implementation samples - [In-App Message Modal Dismissal for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/modal_dismissal/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Dismiss modal on outside tap - [In-App Message Key-Value Pairs for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/key_value_pairs/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Key-value pair extras - [In-App Message Delivery for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/in-app_message_delivery/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # In-app message delivery - ## Trigger types - ## Delivery semantics - ## Minimum time interval between triggers - ## Failing to find a matching trigger - ## Local in-app message delivery - ### The in-app message stack - #### Showing in-app messages - #### Adding in-app messages to the stack - #### Returning in-app messages to the stack - #### Discarding in-app messages - #### Manually queue in-app message display - ### Real-time in-app message creation and display - [Custom App Store review prompt](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/custom_app_store_review_prompt/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Custom App Store review prompt - [In-App Message Implementation Guide for iOS (Optional)](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/implementation_guide/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # In-app messaging implementation guide - ## Code considerations - ### ABKInAppMessage subclasses - ## Use cases - ### Custom slide-up in-app message - #### Adding additional behavior to our default UI

- ### Custom modal in-app message - #### Dashboard configuration - ### Custom full in-app message - #### Dashboard configuration - #### Intercepting in-app message touches - [SharePlay In-App Message Implementation Guide](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/implementation_guide/shareplay/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # SharePlay in-app message implementation guide - ## Overview - ## Integration - ### Step 1: Overriding and loading XIB - ### Step 2: Configure AVPlayer for in-app messages - #### Dashboard configuration - ### Step 3: Create group watching activity - #### Prepare to play - ### Step 4: Launch in-app message from SharePlay API - ### Step 5: Leaving a group session on in-app message dismissal - ### Configure SharePlay button visibility - [In-App Messaging Troubleshooting for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/troubleshooting/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Troubleshoot in-app messages - ## Impressions - #### Impression or click analytics aren't being logged - #### Impressions are lower than expected - ## Expected in-app message did not display - ### In-app message delivery {#troubleshooting-in-app-message-delivery} - #### Check if messages are requested and returned - #### Troubleshoot messages not being requested - ### Troubleshoot messages not being returned - ### In-app message display {#troubleshooting-in-app-message-display} - [Content Card View Controller Integration for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/integration/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Content Card integration - ## Content Cards data model - ### Getting the data - ## Content Card model - ### Base Content Card model properties - ABKContentCard - ### Banner Content Card properties - ABKBannerContentCard - ### Captioned image Content Card properties - ABKCaptionedImageCard - ### Classic Content Card properties - ABKClassicContentCard - ## Card methods - ## Content Cards view controller integration - ### Navigation context - ### Modal context - [iOS Content Card Customization](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/index.md):

- [Custom Content Card Styling for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/custom_styling/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Custom Styling - ## Overriding default images - ## Disabling Dark Mode - [Customizing Content Card Feed for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/customizing_feed/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Customize the Content Cards feed - ## Customizing UI - ### Dynamic UI - ### Static UI - ## Providing custom interfaces - ## Overriding populated Content Cards - [Handle Content Card Clicks Manually for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/handling_clicks_manually/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Handle clicks manually - [Content Card Read & Unread Indicators for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/read_unread_indicators/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Read and unread indicators - ## Disabling the unviewed indicator - ## Customizing the unviewed indicator - [Content Card Badges for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/badges/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Badges - ## Requesting unread Content Card counts - ## Displaying the number of unviewed Content Cards on the app badge count - [Content Card Carousel View for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/use_cases/carousel_view/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Use case: Carousel view - ## Implementation - ### Step 1: Create a custom view controller - ### Step 2: Implement analytics - ### Step 3: Create a Content Card observer - ## Considerations - [Refresh the Content Card Feed for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/refreshing_the_feed/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Refresh the feed - ## Refreshing Content Cards - [Use Multiple Content Card Feeds for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/multiple_feeds/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Using multiple Content Card feeds - ## Step 1: Setting key-value pairs on cards - ## Step 2: Set Up a content card listener - [Content Card Implementation Guide for iOS (Optional)](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/implementation_guide/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Content Card implementation guide - ## Code considerations - ### Content Cards as custom objects - ## Use cases - ### Content Cards as supplemental content - #### Dashboard configuration - ##### Ready to log analytics? - ### Content Cards in a message center - #### Dashboard configuration - #### Further explanation - ##### Ready to log analytics? - ### Interactive Content Cards - #### Dashboard configuration - ##### Ready to log analytics? - ## Dark Mode customization - ## Logging impressions, clicks, and dismissals - #### Implementation components

- ## Helper files - [Track Sessions for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/tracking_sessions/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Session tracking for iOS - ## Session lifecycle - ## Customizing session timeout - ## Testing session tracking - [Set User IDs for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/setting_user_ids/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Set user IDs for iOS - ## Suggested user ID naming convention - ## Assigning a user ID - ## User ID integration best practices and notes - ### Automatic preservation of anonymous user history - ### Additional notes and best practices - ## Aliasing users - [Track Custom Events for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/tracking_custom_events/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Track custom events for iOS - ## Adding a custom event - ### Adding properties - ### Reserved keys {#event-reserved-keys} - ## Additional resources - [Set Custom Attributes for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/setting_custom_attributes/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Set custom attributes for iOS - ## Assigning default user attributes - ## Assigning custom user attributes - ### Custom attribute with a string value - ### Custom attribute with an integer value - ### Custom attribute with a double value - ### Custom attribute with a boolean value - ### Custom attribute with a date value - ### Custom attribute with an array value - ### Unsetting a custom attribute - ### Incrementing/decrementing custom attributes - ### Setting a custom attribute via the REST API - ### Custom attribute value limits - #### Additional information - ## Setting up user subscriptions - ### Setting email subscriptions - ### Setting push notification subscriptions - [Log Purchases for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/logging_purchases/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Log purchases for iOS - ## Tracking purchases and revenue - ### Adding properties {#properties-purchases} - ### Adding quantity - ### Log purchases at the order level - ### Reserved keys - ### REST API - [Location Tracking for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/location_tracking/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Location tracking for iOS - ## Enabling automatic location tracking - ### Passing location data to Braze - [Uninstall Tracking for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/uninstall_tracking/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Uninstall tracking for iOS - ## Step 1: Enabling background push - ## Step 2: Checking for Braze background push - ## Step 3: Test from the dashboard - ## Step 4: Enable uninstall tracking - [Disable SDK Tracking for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/disabling_tracking/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Disable data collection for iOS - ## iOS SDK v5.7.0+ - [Deep Linking for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/advanced_use_cases/linking/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Deep linking for iOS - ## Step 1: Register a scheme - ## Step 2: Allowlist the custom scheme (iOS 9+) - ## Step 3: Implement a handler - # Universal links - ## App transport security (ATS) - ### ATS requirements - ### Handling ATS requirements - #### Confirm all links are ATS compliant (recommended) - #### Partially disable ATS - #### Disable ATS entirely - ## URL encoding - ## Customization {#linking-customization} - ### Default WebView customization - ### Linking handling customization - #### Integration example: ABKURLDelegate - ## Frequent use cases - ### Deep linking to app settings - [Fine Network Traffic Control for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/advanced_use_cases/fine_network_traffic_control/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Fine network traffic control - ## Request processing policies - ### Automatic request processing - ### Manual request processing - ## Setting the request processing policy - ### Set request policy on startup - ### Set request policy at runtime - ## Manual shutdown of in-flight server communication - [Localization for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/advanced_use_cases/localization/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Localization - ## Languages supported - [Beacon Integration for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/advanced_use_cases/beacon_integration/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Beacon integration - ## Infillion Beacons - [Location & Geofences for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/advanced_use_cases/locations_and_geofences/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Locations and geofences - ## Step 1: Enable background push - ## Step 2: Enable geofences - ## Step 3: Check for Braze background push - ## Step 4: Add NSLocationAlwaysUsageDescription to your Info.plist - ## Step 5: Request authorization from the user - ## Step 6: Enable geofences on the dashboard - ### Enable geofences from the locations page: - ### Enable geofences from the settings page: - ## Disabling automatic geofence requests - ## Manually requesting geofences - [Google Tag Manager for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/advanced_use_cases/google_tag_manager/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Google Tag Manager for iOS - ## Initializing the SDK {#initializing-ios-google-tag-provider} - ## Configuring your Google Tag Manager {#configuring-ios-google-tag-manager} - ### Custom events - ### Logging custom attributes - ### Calling changeUser - ## Braze SDK custom tag provider {#adding-ios-google-tag-provider} - [Storage for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/storage/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Storage - ## Device properties - [Sample Apps for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/sample_apps/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Sample apps - ## Building test applications - [Changelog for iOS Swift SDK](/docs/developer_guide/platforms/legacy_sdks/ios/changelog/swift_changelog/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # iOS Swift SDK changelog - [Changelog for iOS Objective-C SDK](/docs/developer_guide/platforms/legacy_sdks/ios/changelog/objc_changelog/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # iOS Objective-C SDK changelog - # macOS - [Initial SDK Setup for MacOS](/docs/developer_guide/platforms/legacy_sdks/macOS/initial_sdk_setup/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Initial SDK setup - ## Supported features - [Initial SDK Setup for tvOS](/docs/developer_guide/platforms/legacy_sdks/tvos/initial_sdk_setup/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK. - # Initial SDK setup - ## tvOS SDK CocoaPods integration - ### Step 1: Install CocoaPods - ### Step 2: Constructing the Podfile - ### Step 3: Installing the Braze SDK - ### Step 4: Updating your app delegate - ### Step 5: Specify your custom endpoint or data cluster - #### Compile-time endpoint configuration (recommended) - #### Runtime endpoint configuration - ### SDK integration complete - ### Updating the Braze SDK via CocoaPods - ## Customizing Braze on startup - ## Appboy.sharedInstance() and Swift nullability - ## Manual integration options - ## Identifying users and reporting analytics - [About Banners](/docs/developer_guide/banners/index.md): !An example Banner rendered on a device. - # Banners - ## Prerequisites - ## Why use Banners? - ## Features - ## About Banners {#about-banners} - ### Placement IDs {#placement-id} - ### Banner priority {#priority} - ### Placement requests {#requests} - #### Rate limiting for refresh requests - ### Message delivery - ### Dimensions and sizing - ## Limitations - ## Next steps - [Manage Banner placements for the Braze SDK](/docs/developer_guide/banners/placements/index.md): When you create placements in your app or website, your app sends a request to Braze to fetch Banner messages for each placement. - # Manage Banner placements - ## About placement requests {#requests} - #### Rate limiting for refresh requests - ## Create a placement - ### Prerequisites - ### Step 1: Create placements in Braze - ### Step 2: Refresh placements in your app {#requestBannersRefresh} - ### Step 3: Listen for updates {#subscribeToBannersUpdates} - ### Step 4: Insert using the placement ID {#insertBanner} - ### Step 5: Send a test Banner (optional) {#handling-test-cards} - ## Log impressions - ## Logging clicks - ### Standard Banner content (automatic) - ### Custom Code Blocks - ### Custom UI implementations (headless) - ## Dimensions and sizing - ## Custom properties {#custom-properties} - ### Prerequisites - ### Access custom properties - [Test Banners](/docs/developer_guide/banners/testing/index.md): Before you can test Banner messages in Braze, you'll need to create a Banner campaign in Braze. Additionally, verify that the placement you want to test is already placed in your app or website. - # Test Banners - ## Prerequisites - ## Test a Banner - [Banner analytics](/docs/developer_guide/banners/analytics/index.md): Once you've launched your campaign, you can return to the details page for that campaign to view key metrics. Navigate to the Campaigns page and select your campaign to open the details page. For sent in Canvas, refer to Canvas analytics. - # Banner analytics - ## Viewing analytics - ### Time range - ### Campaign details - #### Changes Since Last Viewed - ### Message Performance - ### Historical performance - ### Conversion event details - ### Conversion correlation - ## Retention report - ## Funnel report - [Migrate from Content Cards to Banners](/docs/developer_guide/banners/migrating_from_content_cards/index.md): Banners offer several advantages over Content Cards for banner-style messaging: - # Migrate from Content Cards to Banners - ## Why migrate to Banners? - ### Accelerated production - ### Better UX - ### Persistence - ## When to migrate - ## When to keep Content Cards - ## Migration guide - ### Prerequisites - ### Subscribe to updates - #### Content Cards approach - #### Banners approach - ### Display content - #### Content Cards approach - #### Banners approach - ### Log analytics (custom implementations) - #### Content Cards approach - #### Banners approach - ### Handling control groups - #### Content Cards approach - #### Banners approach - ## Limitations - ### Migrating triggered messages - ### Feature differences - ### Product limitations - ### SDK limitations - ## Related articles - [Tutorial: Displaying a Banner by Placement ID](/docs/developer_guide/banners/tutorial_displaying_banners/index.md): Before you can start this tutorial, verify that your Braze SDK meets the minimum version requirements: - # Tutorial: Displaying a Banner by Placement ID - ## Prerequisites - ## Displaying banners for the Web SDK - #### 1. Enable debugging (optional) - #### 2. Subscribe to Banner updates - #### 3. Insert the Banner and handle control groups - #### 4. Refresh your Banners - #### 5. Add a container for your Banner - ## Prerequisites - ## Displaying banners for the Android SDK - #### 1. Enable debugging (optional) - #### 2. Subscribe to Banner updates - #### 3. Refresh your placements - #### 4. Define BannerView in your banners.xml - ## Prerequisites - ## Displaying banners for the Swift SDK - #### 1. Enable debugging (optional) - #### 2. Refresh your placements - #### 3. Initialize the Banner and provide a callback - #### 4. Enable Auto Layout constraints - #### 5. Anchor content and set height constraints - #### 1. Enable debugging (optional) - #### 2. Refresh your placements - #### 3. Create a view component - #### 4. Only display available Banners - #### 5. Only show BannerView after it loads - #### 6. Dynamically update Banner height - #### 7. Limit the Banner height - [Banners: Frequently Asked Questions](/docs/developer_guide/banners/faq/index.md): Banners are refreshed with their latest data whenever you call the refresh method—there's no need to resend or update your Banner campaign. - # Banners: Frequently Asked Questions - ## When do Banner updates appear for users? - ## How many placements can I request in a session? - ## How many Banner campaigns can be active simultaneously? - ## For campaigns sharing a placement, which Banner is displayed first? - ## Can I use Banners in my existing Content Card feed? - ## Can I trigger a banner based on user actions? - ## Can users manually dismiss a Banner? - ## Can I export Banners campaign analytics using the Braze API? - ## When are users segmented? - ## How can I compose Banners to ensure the lowest latency? - ## Are all Liquid tags supported? - ## Can I capture click events? - [Content Cards in the Braze SDK](/docs/developer_guide/content_cards/index.md): Using Content Cards for banner-style messages? Try out Banners— perfect for inline, persistent in-app and web messages. - # Content Cards - ## Prerequisites - ## Standard feed UI - ## Card types and properties - ### Base card model - ### Image only - ### Captioned image - ### Classic - ## Control group - ## Card methods - ## Using Google Tag Manager - ### Setting up Content Cards - ### Upgrading templates {#upgrading} - ### Troubleshooting {#troubleshooting} - #### Enable tag debugging {#debugging} - #### Enter debug mode - #### Enable verbose logging - ## Prerequisites - ## Google fragments - ## Card types and properties - ### Base card model {#base-card-for-android} - ### Image only {#banner-image-card-for-android} - ### Captioned image {#captioned-image-card-for-android} - ### Classic {#text-Announcement-card-for-android} - ## Card methods - ## Prerequisites - ## View controller contexts - ### Navigation - ### Modal - ## Base card model - ## Card methods - ## Prerequisites - ## Card Feeds - ## Content Cards - ## About Flutter Content Cards - ## Prerequisites - ## Card methods - ## Receiving Content Card data - ### Step 1: Listen for Content Card data in the Dart layer - ### Step 2: Forward Content Card data from the native layer - #### Replaying the callback for Content Cards - ## About React Native Content Cards - ## Prerequisites - ## Cards methods - ## Card types and properties - ### Base card model - ### Image only - ### Captioned image - ### Classic - ### Control - ## Prerequisites - ## Setting up your tvOS app - ### Step 1: Create a new iOS app - ### Step 2: Get your app's API key - ### Step 3: Integrate BrazeKit - ### Step 4: Create your custom UI - ## Prerequisites - ## Displaying Content Cards natively {#unity-content-cards-native-ui} - ## Receiving Content Card data in Unity - ## Parsing Content Cards - ##### Example Content Cards callback - ## Refreshing Content Cards - ## Analytics - ## About .NET MAUI Content Cards - ## Prerequisites - ## Card types and properties - ### Base card model - ### Banner - ### Captioned image - ### Classic - ## Card methods - [Create Content Cards](/docs/developer_guide/content_cards/creating_cards/index.md): Using Content Cards for banner-style messages? Try out Banners— perfect for inline, persistent in-app and web messages. - # Create content cards - ## Creating a card - ### Step 1: Create a custom UI - ### Step 2: Subscribe to card updates - ### Step 3: Implement analytics - ### Step 4: Test your card (optional) - ## Content Card placements - ### Message inbox - #### Example - ### Carousel - ### Image-only - [Customize cards](/docs/developer_guide/content_cards/customizing_cards/index.md): Using Content Cards for banner-style messages? Try out Banners— perfect for inline, persistent in-app and web messages. - [Customize the style of Content Cards](/docs/developer_guide/content_cards/customizing_cards/style/index.md): The default Content Cards UI is imported from the UI layer of the Braze SDK. From there, you can tweak certain parts of the card's styling, the order in which cards are displayed, and how the feed is shown to your users. - # Customize the style of Content Cards - ## Creating a custom style - ## Customization examples - ### Custom font - ### Custom pinned icons - ### Changing the unread indicator color - ### Disabling unread indicator - [Customize the behavior of Content Cards](/docs/developer_guide/content_cards/customizing_cards/behavior/index.md): Braze enables you to send extra data payloads via Content Cards to user devices using key-value pairs. These can help you track internal metrics, update app content, and customize properties. Add key-value pairs using the dashboard. - # Customize the behavior of Content Cards - ## Key-value pairs - ## Content Cards as supplemental content - ### API-triggered key-value pairs - ## Content Cards as interactive content - ## Content Card badges - ### Displaying the number of unread Content Cards as a badge - [Customize the feed for Content Cards](/docs/developer_guide/content_cards/customizing_cards/feed/index.md): A session refers to the period of time the Braze SDK tracks user activity in your app after it's launched. You can also force a new session by calling the changeUser() method. - # Customize the feed for Content Cards - ## About the session lifecycle - ## Refreshing the feed - ### Automatic refresh - ### Manual refresh - #### Completion handler - #### Async/Await - ### Rate limit - ## Customizing displayed card order - ## Customizing "empty feed" message - ## Implementing multiple feeds - ### Step 1: Set key-value pairs on cards - ### Step 2: Filter Content Cards - #### Step 2.1: Create a custom handler - #### Step 2.2: Add it to a fragment - [Log Analytics](/docs/developer_guide/content_cards/logging_analytics/index.md): When implementing your custom Content Cards, you can parse the Content Card objects and extract their payload data such as title, cardDescription, and imageUrl. Then, you can use the resulting model data to populate your custom UI. - # Log analytics - ## Listening for card updates - ### Step 1: Create a private subscriber variable - ### Step 2: Subscribe to updates - ### Step 3: Unsubscribe - ### Step 1: Create a private subscriber variable - ### Step 2: Subscribe to updates - ### Step 3: Unsubscribe - ### Cancellable - ### AsyncStream - ## Logging events - [Deep Linking in Content Cards](/docs/developer_guide/content_cards/deep_linking/index.md): At this time, Content Card deep links are not supported for the Web Braze SDK. - # Deep Linking in Content Cards - ## Prerequisites - ## Creating a universal delegate - ## Deep linking to app settings - ## Customizing WebView activity {#CustomWebviewActivity} - ## Using Jetpack Compose - ## Prerequisites - ## Handling deep links - ### Step 1: Register a scheme {#register-a-scheme} - ### Step 2: Add a scheme allowlist - ### Step 3: Implement a handler - ## App Transport Security (ATS) - ### Working with ATS - ## Decoding URLs - ## Deep linking to app settings - ## Customization options {#customization-options} - ### Default WebView customization - ### Linking handling customization - #### Universal links {#universal-links} - ## Examples - ### BrazeDelegate - [Embed GIFs in Content Cards](/docs/developer_guide/content_cards/embedding_gifs/index.md): For wrapper SDKs not listed, use the relevant native Android or Swift method instead. Keep in mind, the Android and Swift Braze SDKs don't support animated GIFs natively, so you'll implement Content Card GIFs using third-party tools instead. - # Embed GIFs in Content Cards - ## About GIFs - ## Integrating a custom image library - ### Step 1: Creating the image loader delegate - ### Step 2: Setting the image loader delegate - ## Custom Image Loading with Jetpack Compose - ## Prerequisites - ## Integrating a custom image library - ### Step 1: Integrate SDWebImage - ### Step 2: Create a new Swift file - ### Step 3: Add GIFViewProvider - ### Step 4: Modify your AppDelegate.swift - [Tutorial: Making an Inbox with Content Cards](/docs/developer_guide/content_cards/content_card_inbox/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK. - # Tutorial: Making an Inbox with Content Cards - ## Prerequisites - ## Making an inbox with Content Cards for Android (Compose) - #### 1. Enable debugging (optional) - #### 2. Build a UI view - #### 3. Subscribe to Content Card updates - #### 4. Build a custom inbox UI - #### 5. Track impressions and clicks - ## Making an inbox with Content Cards for Android (RecyclerView) - #### 1. Enable debugging (optional) - #### 2. Build a UI view - #### 3. Subscribe to Content Card updates - #### 4. Build a custom inbox UI - #### 5. Track impressions and clicks - ## Prerequisites - ## Making an inbox with Content Cards for Swift - #### 1. Enable debugging (optional) - #### 2. Build a UI View - #### 3. Subscribe to Content Card updates - #### 4. Build a custom inbox UI - #### 5. Track impressions and clicks - ## Prerequisites - ## Making an inbox with Content Cards for Web - #### 1. Enable debugging (optional) - #### 2. Build the UI - #### 3. Subscribe to Content Card updates - #### 4. Build the inbox elements - #### 5. Track impressions and clicks - [In-app messages for the Braze SDK](/docs/developer_guide/in_app_messages/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. However, no additional setup is required. - # In-app messages - ## Prerequisites - ## Message types - ## Prerequisites - ## Message types - ## Enabling in-app messages - ### Step 1: Register BrazeInAppMessageManager - ### Step 2: Update the manager's blocklist (optional) - ## Prerequisites - ## Message types - ## Enabling in-app messages - ### Step 1: Create an implementation of BrazeInAppMessagePresenter - ### Step 2: Handle no matching triggers - ## Prerequisites - ## About TV and OTT support - ## Prerequisites - ## Message types - ## Prerequisites - ## Message types - ## Enabling in-app messages - ## Prerequisites - ## Message types - ## Data model - ### Messages - ### Buttons - ## Prerequisites - ## Message types - ## Enabling in-app messages - ### Step 1: Add an observer - ### Step 2: Access triggered messages - ## Message fields - ### Handling - ### Styling - ### Buttons - ## Prerequisites - ## Enabling in-app messages - ### Step 1: Create a new iOS app - ### Step 2: Get your app's API key - ### Step 3: Integrate BrazeKit - ### Step 4: Create your custom UI - ## Prerequisites - ## Message types - ## Prerequisites - ## Message types - ## Next steps - [Customize in-app messages for the Braze SDK](/docs/developer_guide/in_app_messages/customization/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. - # Customize in-app messages - ## Prerequisites - ## Custom styles - ### Setting a default style - ### Customizing the z-index - ## Customizing message dismissals - ## Opening links in a new tab - ## Prerequisites - ## Setting custom manager listeners - ### Step 1: Implement the custom manager listener - #### Step 1.1: Implement IInAppMessageManagerListener - #### Step 1.2: Hook into IAM view lifecycle methods (optional) - ### Step 2: Instruct Braze to use the custom manager listener - #### Altering in-app messages before display - ## Setting custom factories - ### Step 1: Implement the factory - ### Step 2: Instruct Braze to use the factory - #### How it works - ## Custom styles - ### Setting a default style - ### Customizing the font - ## Message dismissals - ### Swiping to dismiss slideup messages - ### Disabling back button dismissals - ### Enabling outside tap dismissals - ## Customizing the orientation - ## Disabling dark theme {#android-in-app-message-dark-theme-customization} - ## Customizing the Google Play review prompt - ## Prerequisites - ## Setting up the UI delegate (required) - ### Step 1: Implement the BrazeInAppMessageUIDelegate protocol - ### Step 2: Assign the delegate object - ## On-click behavior - ### Click action types - ### Customizing on-click behavior - ### Handling the custom behavior - ## Swiping to dismiss slideup messages - ## Customizing modal dismissals - ## Customizing message orientation - ## Customizing display timing - ## Hiding the status bar - ## Disabling dark mode - ## Customizing the app store review prompt - ### Step 1: Set the in-app message delegate - ### Step 2: Disable the default App Store review message - ### Step 3: Create a deep link - ### Step 4: Set custom on-click behavior - ## Prerequisites - ## Methods for logging - ## Handling message data - ### Overriding the default UI delegate - ### Overriding the default native UI - ## Customizing the display behavior - ## Setting a custom listener - [Trigger in-app messages through the Braze SDK](/docs/developer_guide/in_app_messages/triggering_messages/index.md): In-app messages are triggered when the SDK logs one of the following custom event types: Session Start, Push Click, Any Purchase, Specific Purchase,and Custom Event (the last two containing robust property filters). - # Trigger in-app messages - ## Message triggers and delivery - ## Key-value pairs - ## Disabling automatic triggers - ## Overriding the default rate limit - ## Manually triggering messages - ### Using a server-side event - #### Step 1: Create a push callback to receive the silent push - #### Step 2: Create a push campaign - #### Step 3: Create an in-app message campaign - #### Step 1: Handle silent push and key-value pairs - #### Step 2: Create a silent push campaign - #### Step 3: Create an in-app message campaign - ### Displaying a pre-defined message - ### Displaying a message in real-time - ## Exit-intent messages for Web - [Adding the Braze JavaScript Interface to WebViews for Swift](/docs/developer_guide/in_app_messages/html_messages/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK. - # HTML in-app messages - ## Prerequisites - ## About HTML messages - ## Adding the interface to a WebView - ## Embedding YouTube content - ## Using deep links - ## Prerequisites - ## About HTML messages - ## Adding the interface to a WebView - ## Example: Logging a custom event - [In-app message deep-linking for the Braze SDK](/docs/developer_guide/in_app_messages/deep_linking/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK. - # In-app message deep-linking - ## Prerequisites - ## Creating a universal delegate - ## Deep linking to app settings - ## Customizing WebView activity {#CustomWebviewActivity} - ## Using Jetpack Compose - ## Prerequisites - ## Handling deep links - ### Step 1: Register a scheme {#register-a-scheme} - ### Step 2: Add a scheme allowlist - ### Step 3: Implement a handler - ## App Transport Security (ATS) - ### Working with ATS - ## Decoding URLs - ## Deep linking to app settings - ## Customization options {#customization-options} - ### Default WebView customization - ### Linking handling customization - #### Universal links {#universal-links} - ## Examples - ### BrazeDelegate - [Embed GIFs into in-app messages for the Braze SDK](/docs/developer_guide/in_app_messages/gifs/index.md): Braze offers the ability to use a custom image library to display animated GIFs. Although the example below uses Glide, any image library that supports GIFs is compatible. - # Embed GIFs into in-app messages - ## About GIFs - ## Integrating a custom image library - ### Step 1: Creating the image loader delegate - ### Step 2: Setting the image loader delegate - ## Custom Image Loading with Jetpack Compose - ## Prerequisites - ## Integrating a custom image library - ### Step 1: Integrate SDWebImage - ### Step 2: Create a new Swift file - ### Step 3: Add GIFViewProvider - ### Step 4: Modify your AppDelegate.swift - [Log in-app message data through the Braze SDK](/docs/developer_guide/in_app_messages/logging_message_data/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. - # Log in-app message data - ## Prerequisites - ## Logging message data - ## Prerequisites - ## Logging message data - ## Accessing message data - ### Step 1: Listen for in-app message data in the Dart layer - ### Step 2: Forward in-app message data from the native layer - ### Step 3: Replaying the callback for in-app messages (optional) - ## Prerequisites - ## Methods for logging - ## Handling message data - ### Overriding the default UI delegate - ### Overriding the default native UI - ## Prerequisites - ## Logging message data - ### Displayed messages - ### Clicked messages - ### Clicked buttons - ### After processing a message - ## Subscribing to in-app messages - ## Parsing messages - ## Logging message data - [Send a test message for the Braze SDK](/docs/developer_guide/in_app_messages/sending_test_messages/index.md): After you set up a test segment, you can use it to test any of your Braze messaging channels. When set up correctly, this only needs to be done a single time. - # Sending test messages - ## Sending a test message - ### Step 1: Create a designated test segment - ### Step 2: Send the message - ## Test limitations - [Tutorials](/docs/developer_guide/in_app_messages/tutorials/index.md) - [Tutorial: Conditionally displaying in-app messages](/docs/developer_guide/in_app_messages/tutorials/conditionally_displaying_messages/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. However, no additional setup is required. - # Tutorial: Conditionally displaying in-app messages - ## Prerequisites - ## Conditionally displaying in-app messages for Web - #### 1. Remove calls to automaticallyShowInAppMessages() - #### 2. Enable debugging (optional) - #### 3. Subscribe to in-app message updates - #### 4. Create conditional logic - #### 5. Display messages with showInAppMessage - ## Prerequisites - ## Conditionally displaying in-app messages for Android - #### 1. Enable debugging (optional) - #### 2. Register activity lifecycle callbacks - #### 3. Set up an in-app message listener - #### 4. Create conditional logic - #### 5. Return or discard the message - ## Prerequisites - ## Conditionally displaying in-app messages for Swift - #### 1. Implement the BrazeInAppMessageUIDelegate - #### 2. Enable debugging (optional) - #### 3. Set up your Braze UI and delegate - #### 4. Override DisplayChoice with conditional logic - [Tutorial: Customizing styling using key-value pairs](/docs/developer_guide/in_app_messages/tutorials/customizing_message_styling/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. However, no additional setup is required. - # Tutorial: Customizing message styling using key-value pairs - ## Prerequisites - ## Customizing message styling using key-value pairs for Web - #### 1. Remove calls to automaticallyShowInAppMessages() - #### 2. Enable debugging (optional) - #### 3. Subscribe to the in-app message callback handler - #### 4. Access the message.extras property - #### 5. Conditionally call showInAppMessage - ## Prerequisites - ## Customizing message styling using key-value pairs for Android - #### 1. Enable debugging (optional) - #### 2. Register activity lifecycle callbacks - #### 3. Create your custom view factory class - #### 4. Delegate to Braze’s default factory - #### 5. Access key-value pairs from inAppMessage.extras - #### 6. Implement a custom IInAppMessageViewFactory - ## Prerequisites - ## Customizing message styling using key-value pairs for Swift - #### 1. Implement BrazeInAppMessageUIDelegate - #### 2. Enable debugging (optional) - #### 3. Prepare messages before they're displayed - #### 4. Access key-value pairs from message.extras - #### 5. Update the message's styling attributes - [Tutorial: Deferring and restoring triggered messages](/docs/developer_guide/in_app_messages/tutorials/deferring_triggered_messages/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. However, no additional setup is required. - # Tutorial: Deferring and restoring triggered messages - ## Prerequisites - ## Deferring and restoring triggered messages for Web - #### 1. Remove calls to automaticallyShowInAppMessages() - #### 2. Enable debugging (optional) - #### 3. Subscribe to the in-app message callback handler - #### 4. Defer the message instance - #### 5. Retrieve a previously deferred message - #### 6. Display the deferred message - #### 7. Display a message immediately - ## Prerequisites - ## Deferring and restoring triggered messages for Android - #### 1. Create a singleton Application instance - #### 2. Enable debugging (optional) - #### 3. Register activity lifecycle callbacks - #### 4. Set up an in-app message listener - #### 5. Create conditional logic - #### 6. Create a method for displaying deferred messages - #### 7. Trigger the method from your UI - ## Prerequisites - ## Deferring and restoring triggered messages for Swift - #### 1. Implement the BrazeInAppMessageUIDelegate - #### 2. Enable debugging (optional) - #### 3. Set up your Braze UI and delegate - #### 4. Override DisplayChoice with conditional logic - #### 5. Create a method to show deferred messages - #### 5. Trigger the method from your UI - [Troubleshoot in-app messages for the Braze SDK](/docs/developer_guide/in_app_messages/troubleshooting/index.md): 1. Was the user in the segment at session start, when the SDK requests new in-app messages? - # Troubleshooting - ## Basic Checks - ### My in-app message wasn't shown for one user - ### My in-app message wasn't shown to all users on this platform - ### My in-app message wasn't shown for all users - ### My in-app message took a lot of time to appear - ## Issues with Impressions and Click Analytics - ### Impressions are lower than expected - ### Impressions are lower than they used to be - ## Advanced Troubleshooting {#troubleshooting-in-app-advanced} - ### Troubleshooting delivery {#troubleshooting-in-app-message-delivery} - #### Check if messages are requested and returned - ##### Troubleshoot messages not being requested - ##### Troubleshoot messages not being returned - ### Troubleshooting display {#troubleshooting-in-app-message-display} - ## Basic Checks - ### My in-app message wasn't shown for one user - ### My in-app message wasn't shown to all users on this platform - ### My in-app message wasn't shown for all users - ### My in-app message took a lot of time to appear - ## Issues with Impressions and Click Analytics - ### Impressions are lower than expected - ### Impressions are lower than they used to be - ## Advanced Troubleshooting {#troubleshooting-in-app-advanced} - ### Troubleshooting delivery {#troubleshooting-in-app-message-delivery} - #### Check if messages are requested and returned - ##### Troubleshoot messages not being requested - ##### Troubleshoot messages not being returned - ### Troubleshooting display {#troubleshooting-in-app-message-display} - ## Basic Checks - ### My in-app message wasn't shown for one user - ### My in-app message wasn't shown to all users on this platform - ### My in-app message wasn't shown for all users - ### My in-app message took a lot of time to appear - ## Issues with Impressions and Click Analytics - ### Impressions are lower than expected - ### Impressions are lower than they used to be - ## Advanced Troubleshooting {#troubleshooting-in-app-advanced} - ### Troubleshooting delivery {#troubleshooting-in-app-message-delivery} - #### Check if messages are requested and returned - ##### Troubleshoot messages not being requested - ##### Troubleshoot messages not being returned - ### Troubleshooting display {#troubleshooting-in-app-message-display} - ### Troubleshooting asset loading (NSURLError code -1008) - #### Domains - #### Examples - ##### Netfox - ##### NetGuard - ##### XNLogger - [Push notifications for the Braze SDK](/docs/developer_guide/push_notifications/index.md): This guide uses code samples from the Braze Web SDK 4.0.0+. To upgrade to the latest Web SDK version, see SDK Upgrade Guide. - # Push notifications - ## Prerequisites - ## Push protocols - ## Setting up push notifications - ### Step 1: Configure your service worker - ### Step 2: Register the browser - ### Step 3: Disable skipWaiting (optional) - ## Unsubscribing a user - ## Alternate domains - ### Use cases - ### Considerations - ### Setting up an alternate push domain - #### Step 1: Initiate prompting flow - #### Step 2: Register for push - #### Step 3: Communicate between domains (optional) - ## Frequently Asked Questions (FAQ) - ### Service workers - #### What if I can't register a service worker in the root directory? - #### Can I create a service worker using a Tag Manager? - ### Site security - #### Is HTTPS required? - #### When is a site considered "secure"? - #### What if a secure site is not available? - ## Prerequisites - ## Built-in features - ## About the push notification lifecycle {#push-notification-lifecycle} - ## Setting up push notifications - ### Rate limits - ### Step 1: Add Firebase to your project - ### Step 2: Add Cloud Messaging to your dependencies - ### Step 3: Enable the Firebase Cloud Messaging API - ### Step 4: Create a service account {#service-account} - ### Step 5: Generate JSON credentials {#json} - ### Step 6: Upload your JSON credentials to Braze - ### Step 7: Set up automatic token registration - ### Step 8: Remove automatic requests in your application class - ## Displaying notifications - ### Step 1: Register Braze Firebase Messaging Service - ### Step 2: Conform small icons to design guidelines - ### Step 3: Configure notification icons {#configure-icons} - #### Specifying icons in braze.xml - #### Specifying icon accent color - ### Step 4: Add deep links - #### Enabling automatic deep link opening - ## Handling foreground notifications - ### How it works - ### Customizing foreground behavior - #### Creating custom deep links - #### Adding deep links - #### Customizing back stack behavior - ### Step 5: Define notification channels - ### Step 6: Test notification display and analytics - #### Testing display - #### Testing analytics - #### Testing from command line - ## Conversation push notifications - ### Usage requirements - ## FCM quota exceeded errors - ### Best practices - #### Request a rate limit increase from FCM - #### Request global rate limiting via Braze - ## Rate limits - ## Setting up push notifications - ### Step 1: Upload your APNs token - ### Step 2: Enable push capabilities - ### Step 3: Set up push handling - #### Step 3.1: Enable automation in the push property - #### Step 3.2: Override individual configurations (optional) - #### Step 3.1: Register for push notifications with APNs - #### Step 3.2: Register push tokens with Braze - #### Step 3.3: Enable push handling - ##### Default push handling - ##### Foreground push handling - ## Testing notifications {#push-testing} - ## Subscribing to push notifications updates - ## Handling foreground notifications - ### How it works - ## Push primers {#push-primers} - ## Dynamic APNs gateway management - ### Prerequisites - ### How it works - ### Frequently asked questions - #### Why was this feature introduced? - #### How does this impact push delivery performance? - #### Can I disable this feature? - ## About push notifications for Android TV - ## Prerequisites - ## Setting up push notifications - ## Testing Android TV push notifications - ## Best practices - ## Prerequisites - ## Enabling push deep linking - ## Disabling basic push notifications (iOS only) - ## Prerequisites - ## Setting up push notifications - ### Step 1: Complete the initial setup - #### Step 1.1: Register for push - #### Step 1.2: Get your Google Sender ID - #### Step 1.3: Update your braze.xml - #### Step 1.1: Upload APNs certificates - #### Step 1.2: Add push notification support to your app - ### Step 2: Listen for push notification events (optional) - ##### Push notification event fields - ### Step 3: Test displaying push notifications - ## Prerequisites - ## Setting up push notifications - ### Step 1: Register for a Huawei developer account - ### Step 2: Create a new Huawei app in the Braze dashboard - ### Step 3: Integrate the Huawei messaging SDK into your app - ### Step 4: Handle foreground notifications - ### Step 5: Test your push notifications (optional) - #### Step 5.1: Create a new push notification campaign - #### Step 5.2: Send a test push - #### Step 5.3: Set up Huawei segmentation (optional) - ## Prerequisites - ## Setting up push notifications {#setting-up-push-notifications} - ### Step 1: Complete the initial setup - #### Prerequisites - #### Step 1.1: Update your app.json file - #### Step 1.2: Add your Google Sender ID - #### Step 1.3: Add the path to your Google Services JSON - #### Step 1.1: Request for push permissions - #### Step 1.2 (Optional): Migrate your push key - ### Step 2: Request push notifications permission - #### Step 2.1: Listen for push notifications (optional) - ##### Push notification event fields - ### Step 3: Enable deep linking (optional) - #### Step 3.1: Store the push notification payload on app launch - #### Step 3.2: Handle deep links from a closed state - #### Step 3.3: Enable Universal Links (optional) - ### Step 4: Handle foreground notifications - ### Step 5: Send a test push notification - ## Using the Expo plugin - ### Forwarding Android push to additional FMS - ### Using app extensions with Expo Application Services {#app-extensions} - ### Troubleshooting - #### Push notifications stopped working {#troubleshooting-stopped-working} - #### Device token won't register with Braze {#troubleshooting-token-registration} - ## Prerequisites - ## Setting up Safari push for mobile - ### Step 1: Create a manifest file {#manifest} - ### Step 2: Link the manifest file {#manifest-link} - ### Step 3: Add a service worker {#service-worker} - ### Step 4: Add to home screen {#add-to-homescreen} - ### Step 5: Show the native push prompt {#push-prompt} - ## Next steps - ## Prerequisites - ## Setting up push notification - ### Step 1: Set up the platform - #### Step 1.1: Enable Firebase - #### Step 1.2: Set your Firebase credentials - #### Step 1.1: Verify integration method - #### Step 1.1: Enable ADM - ### Step 2: Configure push notifications - #### Step 2.1: Configure push settings - #### Step 2.1: Upload your APNs token - #### Step 2.2: Enable automatic push - #### Step 2.3: Enable background push (optional) - #### Step 2.4: Disable automatic registration (optional) - #### Step 2.1: Update AndroidManifest.xml - #### Step 2.2: Store your ADM API key - #### Step 2.3: Add ADM Jar - #### Step 2.4: Add Client Secret and Client ID to your Braze dashboard - ### Step 3: Set push listeners - #### Step 3.1: Enable push received listener - #### Step 3.2: Enable push opened listener - #### Step 3.3: Enable push deleted listener - #### Push listener example - #### Step 3.1: Enable push received listener - #### Step 3.2: Enable push opened listener - #### Push listener example - ## Optional configurations - #### Deep linking to in-app resources - #### Adding Braze push notification icons - #### Push token callback - ## Prerequisites - ## Setting up push notifications - ### Step 1: Update your project - ### Step 2: Create your JSON credentials - ### Step 3: Upload your JSON credentials - ### Step 1: Complete the initial setup - ### Step 2: Request push notifications permission - [Customize push notifications for the Braze SDK](/docs/developer_guide/push_notifications/customization/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK. You'll also need to set up push notifications. - # Customize push notifications - ## Prerequisites - ## Using a callback for push events {#push-callback} - ## Customizing notification display {#customization-display} - ### Step 1: Create your custom notification factory - ### Step 2: Set your custom notification factory - ## Rendering multicolor text - ### Supported HTML tags - ## Rendering inline images - ### How it works - ### Compatibility - ### Sending an inline image push - ## Settings - ### Notification ID {#notification-id} - ### Firebase Messaging Delivery priority {#fcm-priority} - ### Time to live (TTL) {#ttl} - ### Summary text {#summary-text} - ### Custom URIs {#custom-uri} - ### Notification display priority {#notification-priority} - ### Sounds {#sounds} - ## Prerequisites - ## Customizing action buttons {#push-action-buttons-integration} - ### Manually registering action buttons - #### Step 1: Adding Braze default push categories {#registering} - #### Step 2: Enable interactive push handling {#enable-push-handling} - ## Customizing push categories {#customizing-push-categories} - ### Step 1: Register a category - ### Step 2: Select your categories - ### Example: Custom push category {#example-custom-push-category} - ## Customizing badges - ## Customizing sounds - ### Step 1: Host the sound in your app - #### Converting sound files - ### Step 2: Provide a protocol URL for the sound - ## Settings - ### Key-value pairs - ### Alert options - ### Adding content-available flag - ### Adding mutable-content flag - ### Collapse ID - ### Expiry - ## Prerequisites - ## Settings - ### Time to live (TTL) {#ttl} - ### Summary text {#summary-text} - ### Custom URIs {#custom-uri} - ### Notification display priority - ### Sounds {#sounds} - [Deep linking in push notifications for the Braze SDK](/docs/developer_guide/push_notifications/deep_linking/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK. - # Deep linking in push notifications - ## Prerequisites - ## Creating a universal delegate - ## Deep linking to app settings - ## Customizing WebView activity {#CustomWebviewActivity} - ## Using Jetpack Compose - ## Prerequisites - ## Handling deep links - ### Step 1: Register a scheme {#register-a-scheme} - ### Step 2: Add a scheme allowlist - ### Step 3: Implement a handler - ## App Transport Security (ATS) - ### Working with ATS - ## Decoding URLs - ## Deep linking to app settings - ## Customization options {#customization-options} - ### Default WebView customization - ### Linking handling customization - #### Universal links {#universal-links} - ## Examples - ### BrazeDelegate - ## Prerequisites - ## Implementing deep linking - ### Step 1: Set up Flutter's built-in handling - ### Step 2: Forward data to the Dart layer (optional) - #### Example: Deep linking to an alert dialog - ## Prerequisites - ## Enabling push deep linking - [iOS deep linking guide](/docs/developer_guide/push_notifications/ios_deep_linking_guide/index.md): For implementation details, see Deep linking. For troubleshooting, see Deep linking troubleshooting. - # iOS deep linking guide - ## Choosing a link type - ### Custom scheme deep links - ### Universal links - ### "Open Web URL Inside App" - ## What you need for each link type - ### Custom scheme deep links - ### Universal links - ### "Open Web URL Inside App" - ## When you need an AASA file {#when-aasa} - ## When you need app code to handle links {#when-app-code} - ## Using Branch with Braze {#branch} - [Deep linking troubleshooting](/docs/developer_guide/push_notifications/deep_linking_troubleshooting/index.md): If a custom scheme deep link (for example, myapp://products/123) opens your app but doesn't navigate to the intended screen: - # Deep linking troubleshooting - ## Custom scheme deep link doesn't open the correct view - ## Universal link opens in Safari instead of the app - ### Verify the Associated Domains entitlement - ### Validate the AASA file - ### Check the AppDelegate - ### Verify Braze SDK configuration - ### Check for the long-press issue - ## Deep link from email doesn't open the app - ### Verify click-tracking domain AASA - ### Check the redirect chain - ## Deep link works from push but not from in-app messages (or vice versa) - ### Check the BrazeDelegate - ### Enable verbose logging - ### Check for custom display delegates - ## "Open Web URL Inside App" shows a blank or broken page - ## Troubleshooting Branch with Braze {#branch} - ### Verify the BrazeDelegate routes to Branch - ### Check Branch link domain - ### Enable both SDKs' logging - ### Check Branch dashboard configuration - ### Test Branch links independently - ## General debugging tips - ### Use verbose logging - ### Test links in isolation - ### Test on a physical device - [Set up silent push notifications for the Braze SDK](/docs/developer_guide/push_notifications/silent/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK. You'll also need to set up push notifications. - # Silent push notifications - ## Prerequisites - ## Setting up silent push notifications - ## Prerequisites - ## iOS limitations - ## Setting up silent push notifications - ## Sending silent push notifications - ## Ignoring internal push notifications - ### Step 1: Check your app for automatic actions - ### Step 2: Use the internal push utility method - ## Prerequisites - ## Setting up silent push notifications - [Set up rich push notifications for the Braze SDK](/docs/developer_guide/push_notifications/rich/index.md): Before you can use this feature, you'll need to integrate the Swift Braze SDK. You'll also need to set up push notifications. - # Rich push notifications - ## Prerequisites - ## Setting up rich push notifications - ### Step 1: Creating a service extension - ### Step 2: Setting up the notification service extension - ### Step 3: Integrating rich push notifications - #### Adding the rich push framework to your app - #### Using your own UNNotificationServiceExtension - ### Step 4: Creating a rich notification in your dashboard - ## Prerequisites - ## Setting up rich push notifications - ### Step 1: Create a notification service extension - ### Step 2: Add a new target - ### Step 3: Reinstall your CocoaPods dependencies - ## Prerequisites - ## Using Expo to enable rich push notifications - [Set up push stories for the Braze SDK](/docs/developer_guide/push_notifications/push_stories/index.md): Before you can use this feature, you'll need to integrate the Swift Braze SDK. You'll also need to set up push notifications, which includes implementing the UNNotification framework. - # Push stories - ## Prerequisites - ## Setting up Push Stories - ### Step 1: Adding the Notification Content Extension target {#notification-content-extension} - ### Step 2: Enable capabilities {#enable-capabilities} - #### Adding an App Group - ### Step 3: Adding the Push Story framework to your app {#enable-capabilities} - ### Step 4: Updating your notification view controller {#enable-capabilities} - #### Custom handling push story events - ### Step 5: Setting the Notification Content Extension plist {#notification-content-extension} - ### Step 6: Updating the Braze integration in your main app {#update-braze} - ## Prerequisites - ## Setting up push stories - ### Step 1: Create a notification content extension - ### Step 2: Configure your push app group - ### Step 3: Add a new target - ### Step 4: Reinstall your CocoaPods dependencies - ## Prerequisites - ## Enabling push stories - [Set up soft push prompts for the Braze SDK](/docs/developer_guide/push_notifications/soft_push_prompts/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. You'll also need to set up push notifications. - # Soft push prompts for Web - ## Prerequisites - ## About soft push prompts - ## Setting up soft push prompts - ### Step 1: Create a push primer campaign - ### Step 2: Remove calls - ### Step 3: Update integration - [Log push notification data through the Braze SDK](/docs/developer_guide/push_notifications/logging_message_data/index.md): You can log analytics in real-time by making calls to the /users/track endpoint. To log analytics, send the braze_id value from the Braze dashboard to identify which user profile to update. - # Log push notification data - ## Logging data with the Braze API (recommended) - ## Manually logging data - ## Logging data with the Braze API (recommended) - ## Logging data manually - ### Step 1: Configure app groups within Xcode - ### Step 2: Integrate code snippets - #### Saving custom events - #### Sending custom events to Braze - #### Saving custom attributes - #### Sending custom attributes to Braze - #### Saving user attributes - #### Sending user attributes to Braze - #### Helper files - [Send Test Messages](/docs/developer_guide/push_notifications/sending_test_messages/index.md): After you set up a test segment, you can use it to test any of your Braze messaging channels. When set up correctly, this only needs to be done a single time. - # Sending test messages - ## Sending a test message - ### Step 1: Create a designated test segment - ### Step 2: Send the message - ## Test limitations - [Advanced push notification examples for the Braze SDK](/docs/developer_guide/push_notifications/examples/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK. You'll also need to set up push notifications. - # Advanced push notification examples - ## Prerequisites - ## Custom notification layout - ### Step 1: Add a custom layout - ### Step 2: Create a custom notification factory - ### Step 3: Map custom data - ### Step 4: Set the custom notification factory - ### Step 5: Send the activity - #### Example curl command - #### Request parameters - ### Step 6: Update the activity - ## Personalized push notifications - ## Prerequisites - ## Notification content app extensions - ### Requirements - ## Interactive push notification - ### Dashboard configuration - ## Personalized push notifications - ### Dashboard configuration - ### Handling key-value pairs - #### Parsing Key-Value Pairs from Push Notifications - ## Information capture push notification - ### Dashboard configuration - ### Handling button actions - ### Dismissing pushes - [Troubleshoot push notifications for the Braze SDK](/docs/developer_guide/push_notifications/troubleshooting/index.md): If you're experiencing issues after setting up push notifications, consider the following: - # Troubleshoot push notifications - ## Troubleshooting - ## Understanding the Braze push workflow - ### Step 1: Configuring your Google Cloud API key - ### Step 2: Devices register for FCM and provide Braze with push tokens - ### Step 3: Launching a Braze push campaign - ### Step 4: Removing invalid tokens - ## Utilizing the push error logs - ## Troubleshooting scenarios - ### Push isn't sending - ### No "push registered" users showing in the Braze dashboard (prior to sending messages) - #### Incorrect sender ID - #### Braze registration not occurring - #### Google Play Services not present - #### Device not connected to the internet - ### Tapping push notification doesn't open the app - ### Push notifications bounced - #### Error: MismatchSenderID - #### Error: InvalidRegistration - #### Error: NotRegistered - ### Push notifications sent but not displayed on users' devices - #### Application was force quit - #### BrazeFirebaseMessagingService not registered - #### Firewall is blocking push - #### Custom notification factory returning null - ### "Push registered" users no longer enabled after sending messages - #### Application was uninstalled - #### Invalid Firebase Cloud Messaging server key - ### Push clicks not logged - ### Deep links not working - #### Verify deep link configuration - #### Verify custom handling logic - #### Disable back stack behavior - ## Understanding the Braze/APNs workflow - ### Step 1: Configuring the push certificate and provisioning profile - ### Step 2: Devices register for APNs and provide Braze with push tokens - #### Considerations for push token generation - ### Step 3: Launching a Braze push campaign - ### Step 4: Removing invalid tokens - ## Using the push error logs - ### Message Activity Log errors - #### Received unregistered sending to push token {#received-unregistered-sending} - #### Device token not for topic - #### BadDeviceToken sending to push token - ## Push registration issues - ### No push registration prompt - ### No "push registered" users showing in the dashboard (prior to sending messages) - ## Push notifications sent but not displayed on users’ devices - ### "Push registered" users no longer enabled after sending messages - #### Dashboard and app certificate mismatch - #### Application was uninstalled - #### Regenerating your provisioning profile - ### Messages not delivered to "push registered" users - #### App is foregrounded - #### Test notification scheduled incorrectly - ### User not "push registered" for the app being tested - ## Push clicks not logged {#push-clicks-not-logged} - ## Deep links not working - ### Web links from push clicks not opening - ### Deep links from push clicks not opening - ## Understanding the Braze push workflow - ### Step 1: Configuring your Google Cloud API key - ### Step 2: Devices register for FCM and provide Braze with push tokens - ### Step 3: Launching a Braze push campaign - ### Step 4: Removing invalid tokens - ## Utilizing the push error logs - ## Troubleshooting scenarios - ### Push isn't sending - ### No "push registered" users showing in the Braze dashboard (prior to sending messages) - #### Incorrect sender ID - #### Braze registration not occurring - #### Google Play Services not present - #### Device not connected to the internet - ### Tapping push notification doesn't open the app - ### Push notifications bounced - #### Error: MismatchSenderID - #### Error: InvalidRegistration - #### Error: NotRegistered - ### Push notifications sent but not displayed on users' devices - #### Application was force quit - #### BrazeFirebaseMessagingService not registered - #### Firewall is blocking push - #### Custom notification factory returning null - ### "Push registered" users no longer enabled after sending messages - #### Application was uninstalled - #### Invalid Firebase Cloud Messaging server key - ### Push clicks not logged - ### Deep links not working - #### Verify deep link configuration - #### Verify custom handling logic - #### Disable back stack behavior - ## Troubleshooting - ### Push doesn't appear after app is closed from task switcher - ### Custom notification factory not being set correctly - [Live Activities for the Braze SDK](/docs/developer_guide/live_notifications/index.md) - [Live Updates for the Android Braze SDK](/docs/developer_guide/live_notifications/live_updates/index.md): You can use the IBrazeNotificationFactory interface to customize how Braze push notifications are displayed. By extending BrazeNotificationFactory, Braze will call your factory's createNotification() method before the notification is displayed to the user. It will then pass a payload containing custom key-value pairs sent through the Braze dashboard or REST API. - # Live Updates for Android - ## How it works - ## Displaying a Live Update - ### Prerequisites - ### Step 1: Create a custom notification factory - ### Step 2: Map custom data - ### Step 3: Set the custom notification factory - ### Step 4: Send the activity - #### Example curl command - #### Request parameters - ### Step 5: Update the activity - [Live Activities for the Swift Braze SDK](/docs/developer_guide/live_notifications/live_activities/index.md): !A delivery tracker live activity on an iPhone lockscreen. A status bar with a car is almost half-way filled up. Text reads "2 min until pickup"{: style="max-width:40%;float:right;margin-left:15px;"} - # Live Activities for Swift - ## How it works - ## Sequence Diagram {#sequence-diagram} - ## Implementing a Live Activity - ### Prerequisites - ### Step 1: Create an activity {#create-an-activity} - #### Example - ### Step 2: Start the activity {#start-the-activity} - #### Step 2.1: Add BrazeKit to your widget extension - #### Step 2.2: Add the BrazeLiveActivityAttributes protocol {#brazeActivityAttributes} - #### Step 2.3: Register for push-to-start - ###### Example - #### Step 2.4: Send a push-to-start notification - #### Example - ### Step 3: Resume activity tracking {#resume-activity-tracking} - ###### Example - ### Step 4: Update the activity {#update-the-activity} - ### Step 5: End the activity {#end-the-activity} - ## Tracking Live Activities - ## Frequently Asked Questions (FAQ) {#faq} - ### Functionality and support - #### What platforms support Live Activities? - #### Do React Native apps support Live Activities? - #### Does Braze support Live Activities as a campaign or Canvas step? - ### Push notifications and Live Activities - #### What happens if a push notification is sent while a Live Activity is active? - #### If Live Activities leverage push message functionality, do push notifications need to be enabled to receive Live Activities? - #### Do Live Activities require push primers? - ### Technical topics and troubleshooting - #### How do I know if Live Activities has errors? - #### After sending a push-to-start notification, why haven't I received my Live Activity? - #### After starting my Live Activity with push-to-start, why isn't it receiving new updates? - #### I am receiving an Access Denied response when I try to use the live_activity/update endpoint. Why? - #### Does the messages/send endpoint share rate limits with the messages/live_activity/update endpoint? - [Feature flags for the Braze SDK](/docs/developer_guide/feature_flags/index.md): When you're ready to create your own feature flags, check out Creating feature flags. - # Feature flags - ## Prerequisites - ## Use cases - ### Gradual rollouts - ### Remotely control app variables - ### Message coordination - ### Feature experimentation - ### Segmentation - ## Plan limitations - [Creating Feature Flags](/docs/developer_guide/feature_flags/create/index.md): To use feature flags, ensure your SDKs are up to date with at least these minimum versions: - # Creating feature flags - ## Prerequisites - ### SDK version - ### Braze permissions - ## Creating a feature flag - ### Step 1: Create a new feature flag - ### Step 2: Fill out the details - ### Step 2a: Create custom properties - ### Step 4: Choose segments to target - ### Step 5: Set the rollout traffic {#rollout} - ## Multi-rule feature flag rollouts - ### Evaluation order - ### User qualification - ### "Everyone Else" rule - ### Re-ordering rules - ### Multi-rule feature flag use cases - #### Gradually release a checkout page - #### Reach internal testers first - ## Using the "enabled" field for your feature flags {#enabled} - ### Logging a feature flag impression {#impressions} - ### Accessing properties {#accessing-properties} - ### Getting a list of all feature flags {#get-list-of-flags} - ### Refreshing feature flags {#refreshing} - ### Listening for changes {#updates} - ## Checking user eligibility - ## Viewing the changelog - ## Segmenting with feature flags {#segmentation} - ## Best practices - ### Don't combine rollouts with Canvases or experiments - ### Naming conventions - ### Planning ahead - ### Be descriptive - ### Clean up old feature flags - [Feature flags in Canvas](/docs/developer_guide/feature_flags/canvas/index.md) - [Feature Flag Experiments](/docs/developer_guide/feature_flags/experiments/index.md): Before you can track user data in the experiment, your app needs to record when a user interacts with a feature flag. This is called a feature flag impression. Make sure to log a feature flag impression whenever a user sees or could have seen the feature you're testing, even if they're in the control group. - # Feature flag experiments - ## Prerequisites - ## Creating a feature flag experiment - ### Step 1: Create an experiment - ### Step 2: Add experiment variants - ### Step 3: Overwrite properties (optional) - ### Step 4: Choose users to target - ### Step 5: Distribute variants - ### Step 6: Assign conversions - ### Step 7: Review and launch - ## Reviewing the results - ### Campaign analytics - ### Feature flag experiment performance - [Frequently Asked Questions](/docs/developer_guide/feature_flags/faq/index.md): Braze supports feature flags on iOS, Android, and Web platforms with the following SDK version requirements: - # Frequently asked questions - ## Functionality and support - ### What platforms are Braze feature flags supported on? {#platforms} - ### What is the level of effort involved when implementing a feature flag? {#level-of-effort} - ### How can feature flags benefit Marketing teams? {#marketing-teams} - ### How can feature flags benefit Product teams? {#product-teams} - ### How can feature flags benefit engineering teams? {#engineering-teams} - ## Feature rollouts and targeting - ### Can a feature flag be rolled out to only a select group of users? {#target-users} - ### How does adjusting the rollout percentage affect users who were previously bucketed into the enabled group? {#random-buckets} - ## Technical topics - ### Can feature flags be used to control when the Braze SDK is initialized? {#initialization} - ### How frequently does the SDK refresh feature flags? {#refresh-frequency} - ### Are feature flags available while a user is offline? {#offline} - ### What happens if feature flags are refreshed mid-session? {#listen-for-updates} - ### Why aren't users in my Global Control Group receiving feature flags experiments? - ## Additional questions? - [About Analytics for the Braze SDK](/docs/developer_guide/analytics/index.md): During your Braze implementation, be sure to discuss marketing goals with your team, so you can best decided the data you want to track and how you want to track it with Braze. For an example, see our Taxi/Ride-Sharing App case study at the end of this guide. - # Analytics - ## Automatically collected data - ## Custom events - ### Custom event storage - ### Custom event properties - ## Custom attributes - ### Custom attribute storage - ### Custom attribute data types - #### Strings (alphanumeric characters) - #### Arrays - #### Dates - #### Numbers {#integers} - #### Booleans (true/false) - ## Purchase events / revenue tracking - ## Taxi/ride-sharing app use case {#example-case} - ## Best practices - ### General best practices - #### Use event properties - ### Development best practices - #### Set user IDs for every user - #### Give custom events and attributes readable names - #### Only log attributes when they change - #### Avoid programmatically generating event names - ### Technical limitations and constraints - #### Length constraints - #### Content constraints - #### Reserved keys - #### Value definitions - ### Parsing a generic name field - [Set user IDs through the Braze SDK](/docs/developer_guide/analytics/setting_user_ids/index.md): For wrapper SDKs not listed, use the relevant native Android or Swift method instead. - # Set user IDs - ## About anonymous users - ## Setting a user ID - ## User aliases - ### How they work - ### Setting a user alias - ## ID Naming best practices {#naming-best-practices} - [Set user attributes through the Braze SDK](/docs/developer_guide/analytics/setting_user_attributes/index.md): For wrapper SDKs not listed, use the relevant native Android or Swift method instead. - # Set user attributes - ## Prerequisites - ## Default user attributes - ### Predefined methods - ### Setting default attributes - ### Unsetting default attributes - ## Custom user attributes - ### Setting custom attributes - ### Unsetting custom attributes - ### Nesting custom attributes - ### Using the REST API - ## Setting user subscriptions - ### Unsubscribing a user from email - ### Unsubscribing a user from push - ## Prerequisites - ## Default user attributes - ### Predefined methods - ### Setting default attributes - ### Unsetting default attributes - ## Custom user attributes - ### Setting custom attributes - ### Unsetting custom attributes - ### Nesting custom attributes - ### Using the REST API - ## Setting user subscriptions - ### Setting email subscriptions - ### Setting push notification subscription - ## Prerequisites - ## Default user attributes - ### Supported attributes - ### Setting default attributes - ### Unsetting default attributes - ## Custom user attributes - ### Setting custom attributes - ### Incrementing or decrementing custom attributes - ### Unsetting custom attributes - ### Nesting custom attributes - ### Using the REST API - ## Setting user subscriptions - ### Setting email subscriptions - ### Setting push notification subscriptions - ## Prerequisites - ## Default user attributes - ### Supported attributes - ### Setting default attributes - ## Custom user attributes - ### Setting custom attributes - ### Unsetting custom attributes - ## Prerequisites - ## Default user attributes - ### Predefined methods - ### Setting default attributes - ## Custom user attributes - ### Settings custom attributes - ### Incrementing and decrementing custom attributes - ### Unsetting custom attributes - ### Using the REST API - ## Setting email subscriptions - ## Prerequisites - ## Default user attributes - ### Predefined methods - ### Setting default attributes - ### Unsetting default attributes - ## Custom user attributes - ### Setting custom attributes - ### Unsetting custom attributes - ### Using the REST API - ## Setting user subscriptions - ### Setting email subscriptions - ### Setting push notification subscriptions - ## Prerequisites - ## Logging custom attributes - ### Default user attributes - ### Custom user attributes - #### Unsetting custom attributes - #### Custom Attribute Arrays - [Log custom events through the Braze SDK](/docs/developer_guide/analytics/logging_events/index.md): For wrapper SDKs not listed, use the relevant native Android or Swift method instead. - # Log custom events - ## Logging a custom event - ## Adding metadata properties - ## Best practices - ### Verify events - ### Verify log - ### Verify values - [Log purchases through the Braze SDK](/docs/developer_guide/analytics/logging_purchases/index.md): For wrapper SDKs not listed, use the relevant native Android or Swift method instead. - # Log purchases - ## Logging purchases and revenue - ### Adding properties - ### Adding quantity - ### Using the REST API - ## Logging orders - ## Reserved keys - ## Supported currencies - [Log Content Card data through the Braze SDK](/docs/developer_guide/analytics/logging_channel_data/content_cards/index.md): When implementing your custom Content Cards, you can parse the Content Card objects and extract their payload data such as title, cardDescription, and imageUrl. Then, you can use the resulting model data to populate your custom UI. - # Log Content Card data - ## Listening for card updates - ### Step 1: Create a private subscriber variable - ### Step 2: Subscribe to updates - ### Step 3: Unsubscribe - ### Step 1: Create a private subscriber variable - ### Step 2: Subscribe to updates - ### Step 3: Unsubscribe - ### Cancellable - ### AsyncStream - ## Logging events - [Log in-app message data through the Braze SDK](/docs/developer_guide/analytics/logging_channel_data/in_app_messages/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. - # Log in-app message data - ## Prerequisites - ## Logging message data - ## Prerequisites - ## Logging message data - ## Accessing message data - ### Step 1: Listen for in-app message data in the Dart layer - ### Step 2: Forward in-app message data from the native layer - ### Step 3: Replaying the callback for in-app messages (optional) - ## Prerequisites - ## Methods for logging - ## Handling message data - ### Overriding the default UI delegate - ### Overriding the default native UI - ## Prerequisites - ## Logging message data - ### Displayed messages - ### Clicked messages - ### Clicked buttons - ### After processing a message - ## Subscribing to in-app messages - ## Parsing messages - ## Logging message data - [Log push notification data through the Braze SDK](/docs/developer_guide/analytics/logging_channel_data/push_notifications/index.md): You can log analytics in real-time by making calls to the /users/track endpoint. To log analytics, send the braze_id value from the Braze dashboard to identify which user profile to update. - # Log push notification data - ## Logging data with the Braze API (recommended) - ## Manually logging data - ## Logging data with the Braze API (recommended) - ## Logging data manually - ### Step 1: Configure app groups within Xcode - ### Step 2: Integrate code snippets - #### Saving custom events - #### Sending custom events to Braze - #### Saving custom attributes - #### Sending custom attributes to Braze - #### Saving user attributes - #### Sending user attributes to Braze - #### Helper files - [Track sessions through the Braze SDK](/docs/developer_guide/analytics/tracking_sessions/index.md): For wrapper SDKs not listed, use the relevant native Android or Swift method instead. - # Track sessions - ## About the session lifecycle - ## Defining inactivity - ### How inactivity is measured - ### Session timeout configuration - ### Example: Understanding inactivity scenarios - ### Tracking custom inactivity - ## Subscribing to session updates - ### Step 1: Subscribe to updates - ### Step 2: Test session tracking (optional) - ## Changing the default session timeout {#change-session-timeout} - [Track location through the Braze SDK](/docs/developer_guide/analytics/tracking_location/index.md): To get a user's current location, use the geolocation API's getCurrentPosition() method. This will immediately prompt the user to allow or disallow tracking (unless they've already done so). - # Track location - ## Logging the current location - ## Continuously tracking the location - ## Logging the current location - ## Continuously tracking the location - ## Disabling continuous tracking - ## Logging the current location - ### Step 1: Configure your project - ### Step 2: Log the user's location - ## Prerequisites - ## Setting the last known location - ## Setting a custom location attribute - ## Requesting location initialization on Android - ## Requesting geofences on Android - [Track uninstalls through the Braze SDK](/docs/developer_guide/analytics/tracking_uninstalls/index.md): The Android Braze SDK uses Firebase Cloud Messaging (FCM) to send silent push notifications, which are used to collect uninstall tracking analytics. If you haven't already, set up or migrate to the Firebase Cloud Messaging API for push notifications. - # Track uninstalls - ## Setting up uninstall tracking - ### Step 1: Set up FCM - ### Step 2: Manually detect uninstall tracking (optional) - ### Step 3: Remove automatic server pings - ### Step 4: Enable uninstall tracking - ## Setting up uninstall tracking - ### Step 1: Enable background push - ### Step 2: Ignore internal push notifications - ### Step 3: Send a test push (optional) - ### Step 3: Enable uninstall tracking - [Manage Data Collection for the Braze SDK](/docs/developer_guide/analytics/managing_data_collection/index.md): This guide uses code samples from the Braze Web SDK 4.0.0+. To upgrade to the latest Web SDK version, see SDK Upgrade Guide. - # Manage data collection - ## Disabling data tracking - ### Best practices - ## Resuming data tracking - ## Google Play privacy questionnaire {#privacy-questionnaire} - ### Questions - ### Data collection - ## Disabling data tracking - ## Wiping previously-stored data - ## Resuming data tracking - ## Apple's privacy manifest {#privacy-manifest} - ### What is tracking data? - ### What is a privacy manifest? - ### API tracking-data domains - ## Declaring Braze tracking data - ### Prerequisites - ### Step 1: Review your current policies - ### Step 2: Create a privacy manifest - ### Step 3: Add your endpoint to the privacy manifest - ### Step 4: Declare your tracking data - ### Step 5: Prevent infinite retry loops - ## Disabling data tracking - ## Wiping previously-stored data - ## Resuming data tracking - ## IDFV collection - ### Considerations - #### SDK Version - #### Downstream - ### Frequently asked questions - #### Will this change impact my existing users in Braze? - #### Can I turn this feature off after turning it on? - #### Can I still capture the IDFV value via Braze elsewhere? - ## Prerequisites - ## Disabling data tracking - ## Resuming data tracking - ## Wiping data - ## Flushing data - ## Setting ad-tracking enabled - ## Updating the tracking property allow list (iOS only) - [About the Braze MCP server](/docs/developer_guide/mcp_server/index.md): Braze MCP Server is in beta. If you want to help us make it better, send us feedback at mcp-product@braze.com. - # The Braze MCP server - ## What is Model Context Protocol (MCP)? - ## About the Braze MCP server - ## Usage example - ## Frequently Asked Questions (FAQ) {#faq} - ### Which MCP clients are supported? - ### What Braze data can my MCP client access? - ### Can my MCP client manipulate Braze data? - ### Can I use a third-party MCP server for Braze? - ### Why doesn’t the Braze MCP server offer PII or write access? - ### Can I reuse my API keys? - ### Is the Braze MCP server hosted locally or remotely? - ### Why is Cursor only listing functions? - ### What do I do when the agent returns an answer that looks incorrect? - ## Disclaimer - [Set up the Braze MCP server](/docs/developer_guide/mcp_server/setup/index.md): Braze MCP Server is in beta. If you want to help us make it better, send us feedback at mcp-product@braze.com. - # Setting up the Braze MCP server - ## Prerequisites - ## Setting up the Braze MCP server - ### Step 1: Install uv - ### Step 2: Create an API key {#create-api-key} - #### Campaigns - #### Canvas - #### Catalogs - #### Cloud Data Ingestion - #### Content Blocks - #### Custom Attributes - #### Events - #### KPIs - #### Messages - #### Preference Center - #### Purchases - #### Segments - #### Sends - #### Sessions - #### SDK Authentication Keys - #### Subscription - #### Templates - ### Step 3: Get your identifier and endpoint - ### Step 4: Configure your MCP client {#configure-client} - ### Step 5: Send a test prompt - ## Troubleshooting - ### Terminal errors - #### uvx command not found - #### spawn uvx ENOENT error - #### Package installation fails - ### Client configuration - #### MCP client can't find the Braze server - #### Authentication errors - #### Connection timeouts or network errors - ## Disclaimer - [Use the Braze MCP server](/docs/developer_guide/mcp_server/usage/index.md): Braze MCP Server is in beta. If you want to help us make it better, send us feedback at mcp-product@braze.com. - # Using the Braze MCP server - ## Prerequisites - ## Best practices - ## Usage examples - ### What are my available Braze functions? - ### Get details about a Canvas ID - ### Show me my recent Canvases - ## Disclaimer - [Available API functions in the Braze MCP server](/docs/developer_guide/mcp_server/available_api_functions/index.md): Braze MCP Server is in beta. If you want to help us make it better, send us feedback at mcp-product@braze.com. - # Braze MCP server functions - ## Prerequisites - ## Available Braze API Functions - ### General functions - ### Campaigns - ### Canvases - ### Catalogs - ### Cloud Data Ingestion - ### Content Blocks - ### Custom Attributes - ### Events - ### KPIs - ### Messages - ### Preference Centers - ### Purchases - ### Segments - ### Sends - ### Sessions - ### SDK Authentication Keys - ### Subscription - ### Templates - ## Disclaimer - [Getting started with BrazeAI Decisioning Studio™](/docs/developer_guide/decisioning_studio/index.md): BrazeAI Decisioning Studio™ replaces A/B testing with decisioning agents that personalize everything, and maximize any metric: drive dollars, not clicks—with Decisioning Studio, you can optimize any business metric. - # BrazeAI Decisioning Studio™ - ## What is BrazeAI Decisioning Studio™? - ## Key features - ## About Decisioning Studio - ### How it works - ### Decisioning Agents vs. BrazeAI Agents - ## Decisioning Studio Go vs. Decisioning Studio Pro - ### Decisioning Studio Go - ### Decisioning Studio Pro - ### About this guide - ## Next steps - [Integrate BrazeAI Decisioning Studio™](/docs/developer_guide/decisioning_studio/integration/index.md): While BrazeAI Decisioning Studio™ works best with Braze, a variety of other platforms are already supported. We'll continue updating our documentation so you'll have everything you need—even if you're not using Braze. - # Integrating BrazeAI Decisioning Studio™ - ## Prerequisites - ## Integrating decision studio - ### Step 1: Get your endpoint URL - ### Step 2: Create an API key - ### Step 3: Contact your BrazeAI Decisioning Studio™ customer success manager - [Building Agents for BrazeAI Decisioning Studio™](/docs/developer_guide/decisioning_studio/building_agents/index.md): While BrazeAI Decisioning Studio™ works best with Braze, a variety of other platforms are already supported. We'll continue updating our documentation so you'll have everything you need—even if you're not using Braze. - # Building AI decisioning agents - ## About agents - ## Sample agents - ## Building an agent - ### Prerequisites - ### Step 1: Contact AI Expert Services - ### Step 2: Design your agent - ### Step 3: Set up your delivery platform - ### Step 4: Launch and monitor - [Sending SMS messages using the REST API](/docs/developer_guide/rest_api/sending_sms_messages/index.md): This can be especially useful for high-volume, transactional messaging where the content is defined in your backend systems. For example, you can notify consumers when they receive a message from another user, inviting them to visit your website and check their inbox. - # Sending SMS messages using the REST API - ## Prerequisites - ## Step 1: Create an API campaign - ## Step 2: Send an SMS message using the API - ### Example request - ## Step 3: Verify your integration - ## Considerations - [Localization for Braze Swift SDK](/docs/developer_guide/localization/index.md): In addition to English, Braze supports several languages for SDK messages displayed in your app. - # Localization - ## About localization - ## Supported language codes - [Geofences for the Braze Swift SDK](/docs/developer_guide/geofences/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK. Additionally, you'll need to set up silent push notifications. - # Geofences - ## Prerequisites - ## Setting up geofences {#setting-up-geofences} - ### Step 1: Enable in Braze - ### Step 2: Update build.gradle - ### Step 3: Update the manifest - ### Step 4: Enable Braze location collection - ### Step 5: Obtain location permissions from the end user - ### Step 6: Manually request geofence updates (optional) - #### Step 6.1: Disable automatic geofence requests - #### Step 6.2: Manually request Braze geofence with GPS coordinate - ### Enabling push-to-sync - ## Prerequisites - ## Setting up geofences {#setting-up-geofences} - ### Step 1: Enable in Braze - ### Step 2: Enable your app's location services - #### Step 2.1: Add the BrazeLocation module - #### Step 2.2: Update your Info.plist - ### Step 3: Enable geofences in your code - #### Step 3.1: Enable background reporting (optional) - ### Step 4: Request authorization {#request-authorization} - ### Step 5: Verify background push - ## Manually request geofences {#manually-request-geofences} - ### Step 1: Set automaticGeofenceRequests to false - ### Step 2: Call requestGeofences manually - ## Frequently Asked Questions (FAQ) {#faq} - #### Why am I not receiving geofences on my device? - ##### iOS operating system limitations - ##### Rate limiting - #### How does it work if I am using both Braze and non-Braze geofence features? - #### Can the Geofences feature be used while a device is offline? - #### Why are geofences not monitored when my app is backgrounded/terminated? - ## Prerequisites - ## Prerequisites - ## Setting up geofences {#setting-up-geofences} - ### Step 1: Enable in Braze - ### Step 2: Add dependencies - ### Step 3: Update your AndroidManifest.xml - ### Step 4: Configure Braze location collection - ### Step 5: Request location permissions at runtime - ### Step 6: Manually request geofence updates (optional) - ### Step 2: Add dependencies - ### Step 3: Configure location usage in Info.plist - ### Step 4: Enable geofences in your Braze configuration - ### Step 5: Enable background location updates (optional) - ### Step 6: Request location authorization - [Storage for iOS](/docs/developer_guide/storage/index.md): By default, Braze will collect the following device-level properties to allow device, language, and time zone-based message personalization: - # Storage - ## Device properties - ## Storing cookies (web only) {#cookies} - ### Disabling cookies {#disable-cookies} - [Network Settings for the Braze SDK](/docs/developer_guide/network/index.md): Network offline mode is an optional feature that pauses or resumes outbound network requests from the Braze SDK at any point during runtime. Events are not lost during the offline state. This reference article covers how to integrate this mode. - # Network settings - ## Network offline mode - ## Network traffic control - ### Requesting processing policies - ### Manually flushing user data - ### Setting the request processing policy - [Braze SDK references, repositories, and sample apps](/docs/developer_guide/references/index.md): Currently, some SDKs do not have dedicated reference documentation—but we're actively working on it. - # References, repositories, and sample apps - ## List of resources - ## Building a sample app - ### Building "Droidboy" - ### Building "Hello Braze" - ### Building Swift test apps - [Changelogs](/docs/developer_guide/changelogs/index.md): You can also find a copy of the Web Braze SDK changelog on GitHub. - # Braze SDK changelogs - [Disclosures and Qualifications](/docs/developer_guide/disclosures/index.md) - [Security Vulnerability Disclosure](/docs/developer_guide/disclosures/security_and_vulnerability_disclosure/index.md):