コンテンツにスキップ

Web SDK リポジトリガイド

Braze Web SDKについて

Braze Web SDKを使用すると、BrazeのカスタマーエンゲージメントプラットフォームをWebアプリケーションに直接統合できます。TypeScriptで構築され、モダンなWeb開発向けに設計されたこのSDKは、ユーザー管理、メッセージング、分析、フィーチャーフラグのための包括的なツールを提供します。

できること

  • ユーザー管理: Webアプリケーション全体でユーザーのID、属性、行動を追跡・管理します
  • アプリ内メッセージ: ユーザーがサイトをアクティブに使用している間に、ターゲットを絞ったメッセージや通知を表示します
  • Content Cards: リアルタイムで更新されるパーソナライズされたコンテンツフィードやプロモーションカードを表示します
  • バナー: サイト内の特定のプレースメントにバナーメッセージを表示します
  • プッシュ通知: ユーザーがサイトにアクセスしていないときでも、Webプッシュ通知を送信してエンゲージメントを促進します
  • フィーチャーフラグ: サーバーサイドのフィーチャーフラグ管理で、機能のロールアウトやABテストをコントロールします
  • 分析: カスタムイベント、ユーザーインタラクション、コンバージョン指標を追跡します
  • セッション管理: ユーザーセッションとエンゲージメントパターンを監視します

シングルページアプリケーション、ECサイト、コンテンツプラットフォームのいずれを構築する場合でも、Braze Web SDKは、成長とリテンションを促進するパーソナライズされた魅力的なユーザーエクスペリエンスを作成するために必要なツールを提供します。

前提条件

Braze Web SDKを統合する前に、以下が必要です。

  • Brazeアカウント: APIアクセスが可能なBrazeアカウント
  • APIキー: Brazeダッシュボードから取得したアプリのAPIキー
  • SDKエンドポイント: BrazeのSDKエンドポイントURL(例:sdk.iad-01.braze.com)

認証情報の取得

  1. APIキー: Brazeダッシュボードの設定 > APIキーで確認できます
  2. SDKエンドポイント: 設定 > SDK認証 > エンドポイントで確認できます
  3. サービスワーカー: プッシュ通知に必要です(プッシュ通知セクションを参照してください)

インストール

npm install --save @braze/web-sdk
# or, using yarn:
# yarn add @braze/web-sdk

クイックスタート

以下のスニペットは、Braze Web SDKを初期化するために必要な最小限の設定を示しています。

import * as braze from "@braze/web-sdk";

// Initialize the SDK
braze.initialize('YOUR-API-KEY-HERE', {
    baseUrl: "YOUR-SDK-ENDPOINT-HERE",
});

braze.changeUser('Jane Doe');

設定リファレンス

初期化オプション

initialize関数は、以下のプロパティを持つオプションオブジェクトを受け取ります。

オプション 型 デフォルト 説明
baseUrl string 必須 このオプションは、Braze Web SDKを適切なエンドポイントに接続するために必要です。例:braze.initialize('YOUR-API-KEY-HERE', { baseUrl: 'sdk.iad-03.braze.com' })
enableLogging boolean false trueに設定すると、デフォルトでログ記録が有効になります。これにより、Brazeがすべてのユーザーに表示されるJavaScriptコンソールにログを出力するようになります。本番環境にページをリリースする前に、この設定を削除するか、setLoggerで別のロガーを指定することをお勧めします。
allowUserSuppliedJavascript boolean false デフォルトでは、Braze Web SDKはユーザー提供のJavaScriptクリックアクションを許可せず、HTMLアプリ内メッセージやBannersも有効にしません。これらを有効にすると、Brazeダッシュボードのユーザーがサイト上でJavaScriptを実行できるようになるためです。Brazeダッシュボードのユーザーが悪意のないJavaScriptクリックアクションを記述することを信頼できる場合は、このプロパティをtrueに設定してください。
doNotLoadFontAwesome boolean false Brazeはアプリ内メッセージのアイコンにFont Awesomeを使用します。デフォルトでは、BrazeはFontAwesome CDNからFontAwesome 4.7.0を自動的に読み込みます。この動作を無効にするには(例:サイトでカスタマイズされたバージョンのFontAwesomeを使用している場合)、このオプションをtrueに設定してください。この場合、サイトでFontAwesomeが読み込まれていることを確認する責任はお客様にあります。そうしないと、アプリ内メッセージが正しくレンダリングされない場合があります。
inAppMessageZIndex number 999999 デフォルトでは、Braze SDKはIn-App Messagesをz-index 999999で表示します。このオプションに値を指定すると、デフォルトを上書きできます。
sessionTimeoutInSeconds number 30 デフォルトでは、セッションは30秒間操作がないとタイムアウトします。このオプションに値を指定すると、デフォルトを上書きできます。
deviceId string 自動生成 デフォルトでは、BrazeはデバイスIDとしてランダムなGUIDを割り当てます。この設定オプションに値を指定すると、デフォルトを独自の値で上書きできます。
appVersion string undefined このオプションに値を指定すると、Brazeに送信されるユーザーイベントが指定されたバージョンに関連付けられ、ユーザーセグメンテーションに使用できます。
appVersionNumber string undefined ユーザーセグメンテーションに使用できる数値のアプリバージョン値です。この値は「1.2.3.4」のように4つのフィールドで送信する必要があります。そうしないと無視されます。注意:appVersionも設定する必要があります。同じ値か、このバージョンの一意の名前を指定してください。
contentSecurityNonce string undefined このオプションに値を指定すると、Braze SDKはSDKが作成するすべての<script>要素と<style>要素にnonceを追加します。これにより、Braze SDKをWebサイトのContent Security Policyと連携させることができます。このnonceの設定に加えて、FontAwesomeの読み込みを許可する必要がある場合もあります。その場合、Content Security Policyの許可リストにuse.fontawesome.comを追加するか、doNotLoadFontAwesomeオプションを使用して手動で読み込みます。
noCookies boolean false デフォルトでは、Braze Web SDKはCookieを使用します。Cookieの使用を無効にするには、このオプションをtrueに設定してください。Cookieを無効にすると、セッション間でユーザーのIDを記憶するSDKの機能に影響する場合があります。
allowCrawlerActivity boolean false デフォルトでは、Braze Web SDKはユーザーエージェント文字列に基づいて、Googleなどの既知のスパイダーやWebクローラーからのアクティビティを無視します。これにより、データポイントを節約し、分析の精度が向上し、ページランクが改善される可能性があります。ただし、Brazeでこれらのクローラーのアクティビティを記録する場合は、このオプションをtrueに設定できます。
disablePushTokenMaintenance boolean false デフォルトでは、すでにWebプッシュ許可を付与しているユーザー(例:requestPushPermissionや以前のプッシュプロバイダーを通じて)は、配信到達性を確保するため、新しいセッションでプッシュトークンをBrazeバックエンドと自動的に同期します。この動作を無効にするには、このオプションをtrueに設定してください。
enableSdkAuthentication boolean false SDK認証機能を有効にするには、trueに設定してください。SDK認証の詳細については、製品ドキュメントを参照してください。
manageServiceWorkerExternally boolean false デフォルトでは、Braze Web SDKはプッシュ通知用の独自のサービスワーカーを管理します。アプリケーションで既にサービスワーカーを管理しており、Brazeサービスワーカーの機能をそこに組み込みたい場合は、このオプションをtrueに設定し、Brazeサービスワーカーのコードをサービスワーカーファイルに含めてください。
minimumIntervalBetweenTriggerActionsInSeconds number 30 デフォルトでは、トリガーアクション(例:アプリ内メッセージの表示)はユーザーごとに30秒に1回のみ実行できます。このオプションに値を指定すると、デフォルトを上書きできます。
serviceWorkerLocation string undefined デフォルトでは、Braze Web SDKはドメインのルートでサービスワーカーファイルを探します。このオプションに値を指定すると、デフォルトを上書きしてサービスワーカーファイルのカスタムロケーションを指定できます。
safariWebsitePushId string undefined Safariプッシュ通知に必要です。この値はApple Developerアカウントで確認できます。Safariプッシュ通知の設定の詳細については、製品ドキュメントを参照してください。
localization string undefined このオプションに値を指定すると、Braze SDKはアプリ内メッセージとContent Cardsをそのロケールで表示しようとします。
openInAppMessagesInNewTab boolean false デフォルトでは、アプリ内メッセージ内のリンクは同じタブで開きます。このオプションをtrueに設定すると、新しいタブで開くようになります。
openCardsInNewTab boolean false デフォルトでは、Content Cards内のリンクは同じタブで開きます。このオプションをtrueに設定すると、新しいタブで開くようになります。
requireExplicitInAppMessageDismissal boolean false デフォルトでは、アプリ内メッセージはメッセージの外側をクリックするかEscapeキーを押すことで閉じることができます。このオプションをtrueに設定すると、ユーザーは閉じるボタンまたはアクションボタンを明示的にクリックしてメッセージを閉じる必要があります。
devicePropertyAllowlist string[] undefined デフォルトでは、Braze SDKはDevicePropertiesのすべてのデバイスプロパティを自動的に検出し収集します。この動作を上書きするには、DevicePropertiesの配列を指定してください。Brazeサーバーへのすべてのプロパティの送信を無効にするには、空の配列を指定してください。一部のプロパティがないと、すべての機能が正常に動作しない場合があります。例えば、タイムゾーンがないとローカルタイムゾーン配信は機能しません。
serviceWorkerScope string undefined デフォルトでは、Braze Web SDKはサービスワーカーをデフォルトのスコープ(サービスワーカーのディレクトリ)で登録します。このオプションに値を指定すると、デフォルトを上書きしてサービスワーカーのカスタムスコープを指定できます。

コア機能

初期化とセットアップ

基本的な初期化

import * as braze from "@braze/web-sdk";

// Initialize the SDK
braze.initialize('YOUR-API-KEY-HERE', {
    baseUrl: 'YOUR-SDK-ENDPOINT-HERE',
    enableLogging: true // Remove in production
});

// Start a session
braze.openSession();

高度な初期化オプション

import * as braze from "@braze/web-sdk";

braze.initialize('YOUR-API-KEY-HERE', {
    baseUrl: 'YOUR-SDK-ENDPOINT-HERE',
    enableLogging: true,
    allowUserSuppliedJavascript: true,
    doNotLoadFontAwesome: false,
    inAppMessageZIndex: 999999,
    sessionTimeoutInSeconds: 30,
    deviceId: 'custom-device-id',
    appVersion: '1.0.0',
    contentSecurityNonce: 'your-nonce-here'
});

ユーザー管理

ユーザーの変更

import { changeUser } from "@braze/web-sdk";

// Change to a new user
changeUser('user-123');

ユーザー属性の設定

import { getUser } from "@braze/web-sdk";

const user = getUser();
if (user) {
    user.setEmail('[email protected]');
    user.setFirstName('John');
    user.setLastName('Doe');
    user.setCustomUserAttribute('subscription_tier', 'premium');
    user.setCustomUserAttribute('last_login', new Date());
}

ユーザーの位置情報の設定

import { getUser } from "@braze/web-sdk";

const user = getUser();
if (user) {
    user.setCountry('US');
    user.setHomeCity('San Francisco');
    user.setLanguage('en');
    user.setCustomLocationAttribute('latitude', 37.7749);
    user.setCustomLocationAttribute('longitude', -122.4194);
}

ユーザーエイリアスと購読グループ

import { getUser } from "@braze/web-sdk";

const user = getUser();
if (user) {
    // Add alias
    user.addAlias('external_id', '12345');

    // Add to subscription group
    user.addToSubscriptionGroup('newsletter_subscribers');

    // Remove from subscription group
    user.removeFromSubscriptionGroup('old_subscribers');
}

ユーザーのログアウト

import { wipeData } from "@braze/web-sdk";

// There is no explicit method to logout. To "forget" the current users entirely, use wipeData().
// This is a complete data wipe (use with caution, this wipes things such as device ID)
wipeData();

アプリ内メッセージ

自動表示

import { automaticallyShowInAppMessages } from "@braze/web-sdk";

// Automatically show in-app messages
automaticallyShowInAppMessages();

手動表示

import { subscribeToInAppMessage, showInAppMessage } from "@braze/web-sdk";

// Subscribe to in-app messages
subscribeToInAppMessage((inAppMessage) => {
    // Show the message
    showInAppMessage(inAppMessage);
});

カスタムアプリ内メッセージ処理

import { subscribeToInAppMessage, showInAppMessage } from "@braze/web-sdk";

subscribeToInAppMessage((inAppMessage) => {
    // Custom logic before showing
    if (inAppMessage.getExtras()['priority'] === 'high') {
        showInAppMessage(inAppMessage);
    }
});

アプリ内メッセージのインタラクションを記録する

import {
    logInAppMessageClick,
    logInAppMessageImpression,
    logInAppMessageButtonClick
} from "@braze/web-sdk";

// Log when user sees the message
logInAppMessageImpression(inAppMessage);

// Log when user clicks the message
logInAppMessageClick(inAppMessage);

// Log when user clicks a button in the message
logInAppMessageButtonClick(inAppMessage, button);

カスタム HTML アプリ内メッセージ

import { subscribeToInAppMessage, logInAppMessageImpression, logInAppMessageClick } from "@braze/web-sdk";

// Don't call automaticallyShowInAppMessages() when using custom rendering
// braze.automaticallyShowInAppMessages(); // Comment this out

subscribeToInAppMessage((inAppMessage) => {
    // Extract message data
    const messageData = {
        title: inAppMessage.getMessage(),
        body: inAppMessage.getBody(),
        imageUrl: inAppMessage.getImageUrl(),
        buttons: inAppMessage.getButtons(),
        deepLink: inAppMessage.getExtras()['deep_link_url']
    };

    // Define your own HTML structure, using messageData
    const customHTML = ` <!-- Add your custom styling and structure -->`;

    /* Render the In-App Message here */

    // Here we naively log an impression once the message is rendered.
    // Be precise about exactly when you want to log an impression (ie. only the first time it enters the view port).
    logInAppMessageImpression(inAppMessage);
});

// Handle button clicks and deep linking
const handleButtonClick = (button, inAppMessage) => {
    logInAppMessageClick(inAppMessage);
    // Handle additional click actions (ie. deep linking)
};

Content Cards

Content Cardsの表示

import { showContentCards } from "@braze/web-sdk";

// Show content cards in default location
showContentCards();

// Show in specific container
const container = document.getElementById('content-cards-container');
showContentCards(container);

Content Cardsの更新を購読する

import { subscribeToContentCardsUpdates } from "@braze/web-sdk";

subscribeToContentCardsUpdates((cards) => {
    console.log('Content cards updated:', cards);
    // Display cards or update UI
});

Content Cardsのインタラクションを記録する

import {
    logContentCardClick,
    logContentCardImpressions,
    logCardDismissal
} from "@braze/web-sdk";

// Log card impressions
logContentCardImpressions(cards);

// Log card clicks
logContentCardClick(card);

// Log card dismissals
logCardDismissal(card);

Content Cardsのフィルタリング

import { showContentCards } from "@braze/web-sdk";

// Show only pinned cards
// You can also provide a parent element instead of null
showContentCards(null, (cards) => {
    return cards.filter(card => card.getIsPinned());
});

Content Cardsの更新をリクエストする

import { requestContentCardsRefresh } from "@braze/web-sdk";

requestContentCardsRefresh(
    () => console.log('Content cards refreshed'),
    () => console.log('Failed to refresh content cards')
);

カスタム Content Cards

import { subscribeToContentCardsUpdates, logContentCardClick, logContentCardImpressions, requestContentCardsRefresh } from "@braze/web-sdk";

// State for impression de-duping
const loggedImpressions = new Set();
const idToCard = new Map();

subscribeToContentCardsUpdates((cards) => {
    // Build cards one by one
    cards.getCards().forEach(card => {
        // Skip control cards
        if (card.getIsControl()) return;

        // Extract card data
        const cardData = {
            id: card.getId(),
            title: card.getTitle(),
            description: card.getDescription(),
            imageUrl: card.getImageUrl(),
            url: card.getUrl(),
            extras: card.getExtras()
        };

        // Define your own HTML structure, using cardData
        const customHTML = ` <!-- Add your custom styling and structure -->`;

        /* Render each card here */

        // Basic observer for impression logging.
        // Be precise about exactly when you want to log an impression (ie. only the first time it enters the view port).
        const observer = new IntersectionObserver((entries) => {
            entries.forEach(entry => {
                if (entry.isIntersecting) {
                    logContentCardImpressions([card]);
                }
            });
        });

        // Observe card element when rendered
        // observer.observe(cardElement);
    });
});

// Handle card clicks
const handleCardClick = (card) => {
    logContentCardClick(card);
    // Handle additional click actions (ie. navigation)
};

プッシュ通知

プッシュの許可をリクエストする

import { requestPushPermission } from "@braze/web-sdk";

requestPushPermission(
    () => console.log('Push permission granted'),
    () => console.log('Push permission denied')
);

プッシュのサポートを確認する

import { isPushSupported, isPushPermissionGranted } from "@braze/web-sdk";

if (isPushSupported()) {
    if (isPushPermissionGranted()) {
        console.log('Push notifications are enabled');
    } else {
        console.log('Push permission not granted');
    }
}

プッシュの登録を解除する

import { unregisterPush } from "@braze/web-sdk";

unregisterPush(
    () => console.log('Successfully unregistered'),
    () => console.log('Failed to unregister')
);

フィーチャーフラグ

フィーチャーフラグを取得する

import { getFeatureFlag } from "@braze/web-sdk";

const featureFlag = getFeatureFlag('new_checkout_flow');
if (featureFlag) {
    const isEnabled = featureFlag.getBooleanProperty('enabled', false);
    const rolloutPercentage = featureFlag.getNumberProperty('rollout_percentage', 0);

    if (isEnabled) {
        // Enable new checkout flow
    }
}

フィーチャーフラグの更新を購読する

import { subscribeToFeatureFlagsUpdates } from "@braze/web-sdk";

subscribeToFeatureFlagsUpdates((featureFlags) => {
    featureFlags.forEach(flag => {
        console.log(`Feature flag ${flag.getId()}: ${flag.getBooleanProperty('enabled')}`);
    });
});

フィーチャーフラグのインプレッションを記録する

import { logFeatureFlagImpression } from "@braze/web-sdk";

const featureFlag = getFeatureFlag('new_feature');
if (featureFlag) {
    logFeatureFlagImpression(featureFlag);
}

フィーチャーフラグの更新をリクエストする

import { refreshFeatureFlags } from "@braze/web-sdk";

refreshFeatureFlags(
    () => console.log('Feature flags refreshed'),
    () => console.log('Failed to refresh feature flags')
);

バナー

バナーの取得と表示

import { getBanner, insertBanner } from "@braze/web-sdk";

const banner = getBanner('homepage_banner');
if (banner) {
    // Insert banner into specific element
    const container = document.getElementById('banner-container');
    insertBanner(banner, container);
}

バナーの更新を購読する

サブスクライバーはSDKのメモリ内バナーキャッシュを受け取ります。1回の更新には、最新の requestBannersRefresh 呼び出しのプレースメント ID だけでなく、以前のリフレッシュのプレースメントも含まれる場合があります。

import { insertBanner, subscribeToBannersUpdates } from "@braze/web-sdk";

subscribeToBannersUpdates((banners) => {
    Object.entries(banners).forEach(([placementId, banner]) => {
        if (banner) {
            console.log(`Banner for ${placementId}:`, banner);

            // Insert banner into specific element
            const container = document.getElementById(`banner-container-${placementId}`);
            insertBanner(banner, container);
        }
    });
});

カスタム UI でバナーを非表示にする

import { dismissBanner, getBanner, subscribeToBannersUpdates } from "@braze/web-sdk";

subscribeToBannersUpdates((banners) => {
    const banner = getBanner("homepage_banner");
    const container = document.getElementById("custom-banner-container");
    if (!container) {
        return;
    }

    if (!banner) {
        container.replaceChildren();
        return;
    }

    banner.subscribeToDismissedEvent(() => {
        console.log("Dismissed banner:", banner);
    });

    const closeButton = document.createElement("button");
    closeButton.textContent = "Close";
    closeButton.addEventListener("click", () => {
        dismissBanner(banner);
    });

    // Render your custom UI here and include the close button.
});

dismissBanner(banner) を呼び出すと、SDKはバナーの非表示ステータスを処理し、アクティブなバナー更新からバナーを削除し、バナーの非表示イベントサブスクライバーに通知し、非表示状態をBrazeに同期します。カスタム UIでは、dismissBanner をローカル UI の変更のみ、または分析記録メソッドのみとして扱うのではなく、subscribeToBannersUpdates を使用して非表示されたバナーの削除に対応する必要があります。

バナーの更新をリクエストする

requestBannersRefresh() は既存のバナーキャッシュにマージされます。リクエストしたプレースメント ID のみが追加、更新、または削除されます。他のプレースメントのキャッシュされたバナーはキャッシュに残り、元の有効期限で期限切れになります。サーバーがリクエストされたプレースメントに対してバナーを返さない場合、そのプレースメントはキャッシュから削除されます。

import { requestBannersRefresh } from "@braze/web-sdk";

requestBannersRefresh(
    ["placement_1", "placement_2"],
    () => console.log('Banners refreshed'),
    () => console.log('Failed to refresh banners')
);

分析とイベント

カスタムイベントを記録する

import { logCustomEvent } from "@braze/web-sdk";

// Simple event
logCustomEvent('button_clicked');

// Event with properties
logCustomEvent('purchase', {
    product_id: '123',
    price: 29.99,
    currency: 'USD'
});

購入を記録する

import { logPurchase } from "@braze/web-sdk";

logPurchase('product-123', 29.99, 'USD', 1, {
    category: 'electronics',
    brand: 'Apple'
});

データフラッシュをリクエストする

import { requestImmediateDataFlush } from "@braze/web-sdk";

// Force immediate data send
requestImmediateDataFlush();

セッション管理

セッションを開始する

import { openSession } from "@braze/web-sdk";

// Start a new session
openSession();

SDKのステータスを確認する

import { isInitialized, isDisabled } from "@braze/web-sdk";

if (isInitialized()) {
    console.log('SDK is initialized');

    if (isDisabled()) {
        console.log('SDK is disabled');
    }
}

SDKの有効化/無効化

import { enableSDK, disableSDK } from "@braze/web-sdk";

// Disable SDK
disableSDK();

// Re-enable SDK
enableSDK();

データ管理

データのワイプ

import { wipeData } from "@braze/web-sdk";

// Remove all locally stored data
wipeData();

SDKの破棄

import { destroy } from "@braze/web-sdk";

// Clean up SDK resources
destroy();

デバイス ID を取得する

import { getDeviceId } from "@braze/web-sdk";

const deviceId = getDeviceId();
console.log('Device ID:', deviceId);

SDK認証

import { setSdkAuthenticationSignature } from "@braze/web-sdk";

// Set authentication signature
setSdkAuthenticationSignature('your-signature-here');

認証失敗を購読する

import { subscribeToSdkAuthenticationFailures } from "@braze/web-sdk";

subscribeToSdkAuthenticationFailures((error) => {
    console.log('Authentication failed:', error);
    // Provide new signature
    setSdkAuthenticationSignature('new-signature');
});

統合パターン

SSRフレームワーク

Next.jsなどのサーバーサイドレンダリング(SSR)フレームワークを使用している場合、SDKはブラウザ環境で実行されることを前提としているため、エラーが発生することがあります。SDKを動的にインポートすることで、これらの問題を解決できます。

必要なSDKの部分を別ファイルにエクスポートし、そのファイルをコンポーネントに動的にインポートすることで、ツリーシェイキングのメリットを維持できます。

// MyComponent/braze-exports.js
// export the parts of the SDK you need here
export { initialize, openSession } from "@braze/web-sdk";

// MyComponent/MyComponent.js
// import the functions you need from the braze exports file
useEffect(() => {
    import("./braze-exports.js").then(({ initialize, openSession }) => {
        initialize("YOUR-API-KEY-HERE", {
            baseUrl: "YOUR-SDK-ENDPOINT",
            enableLogging: true,
        });
        openSession();
    });
}, []);

また、webpackを使用してアプリをバンドルしている場合は、マジックコメントを活用して、必要なSDKの部分のみを動的にインポートできます。

// MyComponent.js
useEffect(() => {
    import(
        /* webpackExports: ["initialize", "openSession"] */
        "@braze/web-sdk"
    ).then(({ initialize, openSession }) => {
        initialize("YOUR-API-KEY-HERE", {
            baseUrl: "YOUR-SDK-ENDPOINT",
            enableLogging: true,
        });
        openSession();
    });
}, []);

Vite

Viteを使用していて、循環依存関係に関する警告やUncaught TypeError: Class extends value undefined is not a constructor or nullが表示される場合、Braze SDKを依存関係の検出から除外する必要があるかもしれません。

export default {
    optimizeDeps: {
        exclude: ['@braze/web-sdk']
    }
}

Jestフレームワーク

Jestを使用している場合、SyntaxError: Unexpected token 'export'のようなエラーが表示されることがあります。これを修正するには、package.jsonの設定を調整してBraze SDKを無視するようにします。

{
  "jest": {
    "transformIgnorePatterns": [
      "/node_modules/(?!@braze)"
    ]
  }
}

非同期モジュール定義(AMD)

AMDサポートの無効化

サイトでRequireJSやその他のAMDモジュールローダーを使用しているが、Braze Web SDKはCDN経由で読み込みたい場合、AMDサポートを含まないバージョンのライブラリを読み込むことができます。このバージョンのライブラリは、次のCDNロケーションから読み込めます:https://js.appboycdn.com/web-sdk/6.3/braze.no-amd.min.js

モジュールローダー

RequireJSやその他のAMDモジュールローダーを使用している場合は、ライブラリのコピーをセルフホストし、他のリソースと同様に参照することを推奨します。

require(['path/to/braze.min.js'], function(braze) {
  braze.initialize('YOUR-API-KEY-HERE', { baseUrl: 'YOUR-SDK-ENDPOINT' });
  braze.automaticallyShowInAppMessages();
  braze.openSession();
});

Accelerated Mobile Pages(AMP)

AMP統合には、以下のステップが必要です。

  1. AMP Webプッシュスクリプトを含める:headに非同期スクリプトタグを追加します
  2. 購読ウィジェットを追加する:ユーザーが購読/購読解除できるウィジェットを追加します
  3. ヘルパーファイルを追加する:helper-iframe.htmlとpermission-dialog.htmlを含めます
  4. サービスワーカーを作成する:Brazeサービスワーカーファイルを追加します
  5. AMP Webプッシュ要素を設定する:APIキーとベースURLをクエリパラメーターとして指定したamp-web-push要素を追加します

AMP統合の詳細な手順については、Braze開発者ガイドを参照してください。

Electron

ElectronはWebプッシュ通知を公式にサポートしていません(こちらのGitHubイシューを参照)。Brazeではテストされていませんが、試すことができる他のオープンソースの回避策があります。

CDN統合

  • スクリプトの読み込み:スクリプトタグの後に初期化コードを配置するか、スクリプトタグのonloadイベントハンドラーを使用して、スクリプトタグの読み込み後に初期化します
  • グローバルアクセス:CDN経由で読み込まれた場合、SDKはwindow.brazeとして利用できます

サービスワーカー(プッシュ通知)

  • 必須:プッシュ通知が機能するには、Brazeサービスワーカーを含める必要があります
  • デフォルト登録:デフォルトでは、Braze Web SDKはrequestPushPermission()が呼び出されたときや、すでにプッシュ許可を付与しているユーザーの新しいセッション開始時に、サービスワーカーを自動的に登録・管理します。ただし、Brazeサービスワーカーコードを含むサービスワーカーファイルを所定の場所にホストする必要があります。
  • 独自のサービスワーカーの管理:アプリケーションで既にサービスワーカーを管理している場合は、初期化オプションmanageServiceWorkerExternallyをtrueに設定し、Brazeサービスワーカーコードを自分のサービスワーカーファイルに追加して、navigator.serviceWorker.register()を使用して自分で登録します
  • プッシュ許可:ユーザーの操作(ボタンクリックなど)に応じてbraze.requestPushPermission()を呼び出します。ブラウザの許可をリクエストする前に、ソフトプッシュプロンプト(カスタムUI)を使用してください

タグマネージャー

Tealium iQ

Tealium iQは、すぐに使用できる基本的なBraze統合を提供しています。統合を設定するには、Tealiumタグ管理インターフェイスでBrazeを検索し、ダッシュボードからWeb SDK APIキーを入力します。詳細やTealiumの設定サポートについては、統合ドキュメントを確認するか、Tealiumのアカウントマネージャーにお問い合わせください。

Google Tag Manager

Web SDKは、Google Tag ManagerコンテナのカスタムHTMLタグから初期化および呼び出しができます。GTM経由でBrazeにイベントを送信する例については、Google Tag Managerのサンプルアプリを参照するか、詳細については統合ドキュメントをご覧ください。

その他のタグマネージャー

Brazeは、カスタムHTMLタグ内で統合手順に従うことで、他のタグ管理ソリューションとも互換性がある場合があります。これらのソリューションの評価にサポートが必要な場合は、Brazeの担当者にお問い合わせください。


ライブラリ

以下の表では、利用可能なBraze Web SDKのディストリビューションについて説明します。

名前 説明 npm CDN URL
Full UIを含む完全なSDK。npm版を使用する場合、JavaScriptバンドラーがUIコードを含む未使用のコードを除去します。 @braze/web-sdk https://js.appboycdn.com/web-sdk/7.0/braze.min.js
Core UIを含まないSDK。このバージョンのSDKを使用する場合、In-App MessagesおよびContent Cardsのための独自のUIを実装してください。ほとんどの統合にはFullライブラリを使用してください。CSSを通じてカスタマイズ可能なUI要素が提供されます。 N/A https://js.appboycdn.com/web-sdk/7.0/braze.core.min.js
No-AMD AMDサポートを含まない完全なSDK。サイトでRequireJSや他のAMDモジュールローダーを使用しているが、CDN経由でSDKを読み込みたい場合に便利です。 N/A https://js.appboycdn.com/web-sdk/7.0/braze.no-amd.min.js

サポートされているブラウザ

  • 最新のChromiumベースのブラウザ(Chrome、Edge、Opera)
  • Firefox
  • Safari

デバッグとトラブルシューティング

initialize関数にオプションenableLogging: trueを渡すと(braze.initialize('YOUR-API-KEY-HERE', { baseUrl: 'YOUR-SDK-ENDPOINT', enableLogging: true });)、BrazeがJavaScriptコンソールにログを出力するようになります。これは開発時に役立ちますが、すべてのユーザーに表示されるため、本番環境にページをリリースする前に、このオプションを削除するか、代替のロガーを指定してください。

Font Awesome

Brazeはアプリ内メッセージのアイコンにFont Awesome 4.7.0を使用しています。Font Awesomeの読み込みを無効にするには、doNotLoadFontAwesome初期化オプションを使用してください。利用可能なアイコンを確認するには、チートシートをご覧ください。

その他のリソース

お問い合わせ

ご質問がございましたら、Brazeテクニカルサポートまでお問い合わせください。

リポジトリの詳細やサンプルプロジェクトについては、https://github.com/braze-inc/braze-web-sdkをご覧ください。

New Stuff!