React Native is a JavaScript library for building apps on multiple platforms like Android and iOS, by maintaining a single code base.

Castled React Native SDK enables your React Native App to receive push, in-app and inbox notifications originating from the Castled Customer Engagement Platform. It is implemented as a Turbo Native Module with backward compatability. Turbo Native Modules are the next iteration on React Native Modules for apps based on the New Architecture.

If your react app is on legacy architecture, you will still be able to use the Castled SDK as Turbo Native Modules are backward compatible.

Installation

To use the SDK, add the library to your project

  npm install castled-react-native-sdk

Native Setup

  • Android

  • iOS

Step 1. Update build.gradle

Include google-services plugin dependency in top-level gradle file

android/build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        // Add google maven repository
        google()
    }
    ...
    dependencies {
        ...
        classpath("com.google.gms:google-services:<plugin-version>")
    }
}

Apply google-services plugin to app gradle file

android/app/build.gradle
  apply plugin: "com.google.gms.google-services"

Step 2. Required permissions

By default AndroidManifest.xml of the SDK includes the following permission requests. No developer action is required here.

<!-- Castled SDK needs this permission to sync user token and campaign events  -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- Castled SDK will use this permission to decide when to make network calls -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Initialization

Next step is to initialize the SDK. Initialization is typically done in App.js.

  import * as React from 'react';
  // Importing SDK modules required for initialization
  import {
    CastledNotifications,
    CastledConfigs,
    CastledLocation,
  } from 'castled-react-native-sdk';

  export default function App() {

    ...

    React.useEffect(() => {
      // Set config
      const configs = new CastledConfigs();
      configs.appId = '<app-id>';
      configs.location = CastledLocation.US;

      // Initialize SDK
      CastledNotifications.initialize(configs);
    }, []);

    ...

    return (
      <>
        ...
      </>
    );
  }
  • app-id is a unique key associated with your Castled account. It can be found in the Castled dashboard at Settings > Api Keys.
  • location is the region where you have your Castled account.

You can refer to the SDK Configs section for the list of configs available during initialization.

User Identification

To identify the user associated with this app instance, use the following method. This is typically invoked immediately after user completes the sign-in flow of your app. user-id is the id that you use internally within your organisation to identify a user.

// User identification
CastledNotifications.setUserId("<user-id>")

It is recommended to pass an optional user-token as the second parameter to setUserId to mitigate any risk of user impersonation. In the absence of a user-token, no additional verifications will be done to enforce user authenticity. If your user-id is random id such as a UUID, user-token is probably not required. More info on user-token can be found in the next section.

Secure User Identification

user-token is a unique token for each user generated by your app server. This token is usually issued by the app server after the user is verified by the app server after login.

// Secure user identification
CastledNotifications.setUserId("<user-id>", "<user-token>")

user-token is basically a Base64 encoded Hash-based Message Authentication Code (HMAC). Ensure the hash computation happens in your app server so that api-key is not exposed. You can create an api-key in the Setting > API Keys page within your Castled account. Contact Castled support for help with integration.

Find sample server code snippets to generate HMAC for the user-id.

    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    import java.nio.charset.StandardCharsets;
    import java.util.Base64;

    public static String calculateHMAC(String userId, String apiKey) throws Exception {
        // Get an instance of the HMAC using SHA-256 hashing algorithm
        Mac sha256Hmac = Mac.getInstance("HmacSHA256");

        // Create a SecretKeySpec using the provided key
        SecretKeySpec secretKey = new SecretKeySpec(apiKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");

        // Initialize the Mac with the secret key
        sha256Hmac.init(secretKey);

        // Compute the HMAC of the given data
        byte[] rawHmac = sha256Hmac.doFinal(userId.getBytes(StandardCharsets.UTF_8));

        // Convert the HMAC bytes to a Base64 encoded string
        return Base64.getEncoder().encodeToString(rawHmac);
    }

User Logout

To remove the user association with a particular app instance. Typically invoked as part of the user sign-out flow within the app. Once invoked, app won’t be able to receive any messages or notifications sent from Castled until the user sign-in again to the app again.

// User logout
CastledNotifications.logout()

SDK Configs

This section covers the basic configurations available in the CastledConfigs class of the SDK. Use these configs if you want to enable specific messsaging channel or want to override default behavior.

Config NameDescriptionDefault Value
enablePushEnables push notification featurefalse
enablePushBoostEnhances push notification delivery rates on Android devices with the advanced push boost featurefalse
enableInAppEnables In App notification featurefalse
enableAppInboxEnables App Inbox notification featurefalse
enableTrackingEnables tracking of User attributes or App eventsfalse
locationPreferred server locationUS

Push boost feature has to be included in your account plan for enablePushBoost to work as expected. For any inquiries or further assistance, please contact our support team.