in-app-ui について
in-app-uiは、Knockのアプリ内フィードとガイドを構築するためのスキルです。Reactのガイドを中心に、製品選択、プロバイダー設定、型付きコンテンツの表示、問題調査を支援します。
主な機能
- 01フィードとガイドの選択
- 02Reactガイドプロバイダーの設定
- 03Reactフックによるガイド表示
- 04コンテンツの型定義と反応追跡
- 05ガイド表示の問題調査
活用シーン
- 01画面にフィードとガイドのどちらを使うか判断
- 02Reactアプリへのガイド導入
- 03実際のスキーマに基づくガイドコンポーネント作成
- 04ガイドが表示されない原因の調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ knocklabs/ skills --skill in-app-uiインストール後、Claude Code で/in-app-uiを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
rules/debugging-guides.mdfeeds-vs-guides.mdrendering-guides-react.mdsetup-guide-providers-react.md詳細
Knock アプリ内 UI スキル
このスキルは、Knock を使ったアプリ内 UI の構築に役立ちます。2 つのアプリ内プロダクトであるフィードとガイドを大まかに取り上げた後、ガイドについて、プロバイダーのセットアップ、フックを使ったレンダリング、デバッグまで詳しく説明します。
参考:https://docs.knock.app/in-app-ui/overview
概要
このスキルは、目的別にまとめた 4 つのルールファイルで構成されています。クライアントフレームワークに関するガイダンスは、-<framework> サフィックスを付けてフレームワークごとに定義します(現在は React のみ)。フレームワーク共通の概念は、サフィックスのないファイルに記載されています。
- フィードとガイドの比較(フレームワーク非依存)— 用途に応じてどちらのプロダクトを選ぶべきか、その理由
- React でのガイドプロバイダーのセットアップ —
KnockProviderとKnockGuideProviderの props、それぞれの値の取得元、設定する順序 - React でのガイドのレンダリング —
useGuide/useGuides、型付きコンテンツ、エンゲージメントの追跡を使ったガイドコンポーネントの構築 - ガイドのデバッグ(フレームワーク非依存)— ガイドのツールバー、トリアージ用チェックリスト、テストのワークフロー
フレームワークの範囲: 現在、このスキルが対象としているのは React(
@knocklabs/react)のみです。ユーザーが Vue、Svelte、プレーンな JS、React Native、iOS、Android を使って構築している場合は、いったん作業を止め、どのように進めたいかを尋ねてください。React のルールを別のクライアント SDK に独自に適用しないでください。
このスキルの使い方
構築するものを決めるとき
まず rules/feeds-vs-guides.md を確認してください。
- 構築しているサーフェスが、フィードではなく本当にガイドであることを確認します
- 方針を決める前に、選択表を確認します
- 答えが「両方」の場合は、アプリを一度だけ
KnockProviderでラップし、各プロダクトのプロバイダーを必要な場所でレンダリングします
React アプリに初めてガイドを追加する場合
rules/setup-guide-providers-react.mdを読みます- CLI コマンドを実行する前に、CLI が認証済みであることと、このセットアップで使用する Knock 環境を確認します。 まず
knock whoamiを実行します。「not authenticated」や「no user session」のようなエラーが表示された場合は、knock loginを実行し、続行する前にユーザーにブラウザでの認証フローを完了してもらいます(CLI はセッションを保持するため、マシンごとに必要なのは一度だけです)。knock whoamiが成功してから、knock environment listを実行し、ユーザーに環境を選んでもらいます(CLI のデフォルトはdevelopmentですが、実際の統合の多くはproductionを対象にします)。そのスラッグを<env-slug>として記憶し、以降の環境スコープ付きknockコマンドすべてに--environment <env-slug>を渡します。 - チャンネルについてユーザーに尋ねる前に、Knock CLI を使って
channelIdを調べます。knock channel list --json | jq -r '.[] | select(.key == "knock-guide") | .id'を実行します。チャンネルはアカウント単位のため、このコマンドに--environmentは不要です。UUID が出力されたらそれを使います。ユーザーに確認したり、再度貼り付けてもらったりしないでください。CLI が何も返さない、またはエラーになった場合に限り、ユーザーに尋ねます。代替手段の優先順位については、ルールファイルの「channelIdの取得方法」を参照してください。 - 自動で調べられない値のみをユーザーに尋ねます。主に、選択した環境の公開
apiKeyを尋ねます(また、user.idがアプリの認証コンテキストから取得されることを確認します)。apiKeyとchannelIdをまとめて尋ねないでください。 - ツリーの最上位に
KnockProviderとKnockGuideProviderを配置します。 - ターゲティングが依存する非同期データがある場合は、そのデータを取得してから
readyToTargetを有効にします。 - 終了する前に、実際にガイドをレンダリングできることを確認します。
knock guide list --environment <env-slug> --jsonを実行し、選択肢(key、name、各ステップのschema_key)をユーザーに示して、実在するガイドの実際の値を使って最初のコンポーネントを作成します。"changelog-card"のようなプレースホルダー文字列でスキャフォールドしないでください。コンテンツに型を付けるため、knock message-type get <schema_key> --environment <env-slug> --jsonでメッセージタイプのスキーマを取得します。環境にガイドがない場合は、Knock CLI を使ってテスト用のガイドを作成することを提案します(knock guide new→ JSON を編集 →knock guide push --environment <env-slug>)。組み込みのメッセージタイプ(card、banner、modal)を使い、明らかなプレースホルダーコンテンツを設定します。ダッシュボードで手動設定されるのを待って作業を止めないでください。空の環境の場合の手順を含む詳細は、rules/rendering-guides-react.md→「最初のガイド:コードを書く前に CLI で実際のガイドを調べる」を参照してください。 - ユーザー側で対応が必要な項目(
pk_キーの貼り付け、ダッシュボードでガイドを有効にする操作、開発サーバーの再起動など)は、明確に伝えます。何も言わずに、ユーザーが気づくのを待たないでください。
React で新しいガイドコンポーネントを作成する場合
rules/rendering-guides-react.mdのワークフローに従います- 値を選ぶ前に、Knock CLI を使って対象のガイド(またはメッセージタイプ)を調べます。 ガイドの
keyとステップのschema_keyはknock guide list --environment <env-slug> --jsonで、コンテンツスキーマはknock message-type get <schema_key> --environment <env-slug> --jsonで確認します。プレースホルダー文字列は避けてください。 - 単一のガイドを表示する場合は
useGuideを、一覧の場合はuseGuidesを選びます - 取得したメッセージタイプのスキーマに対応する TypeScript 型を定義します
markAsSeen、markAsInteracted、markAsArchivedを組み込みます。カスタムコンポーネントでは、これらを自分で実装する必要があります
ガイドがレンダリングされない場合
rules/debugging-guides.mdを開き、トリアージチェックリストを上から順に確認します- まずガイドツールバー(
?knock_guide_toolbar=true)を有効にします。ほとんどの疑問は数秒で解決します - 詳しく調べる前に、サーバー側(ターゲティング/適格性)の問題とクライアント側(プロバイダー/コンポーネント)の問題を切り分けます
ルールファイルのリファレンス
rules/feeds-vs-guides.md— フィードとガイドのどちらを選ぶか(フレームワークに依存しません)rules/setup-guide-providers-react.md— ガイド用のKnockProviderとKnockGuideProviderの設定(React)rules/rendering-guides-react.md—useGuide、useGuides、型付きコンテンツ、エンゲージメントのトラッキング(React)rules/debugging-guides.md— ツールバー、切り分けチェックリスト、テストのワークフロー(フレームワークに依存しません)
クイックリファレンス
以下の例は React 用です。その他のクライアント SDK については、先に進む前に Overview の冒頭にある注記をご覧ください。
プロバイダー(最小限の実用的なセットアップ — React)
<KnockProvider
apiKey={process.env.NEXT_PUBLIC_KNOCK_API_KEY}
user={{ id: currentUser.id }}
>
<KnockGuideProvider
channelId={process.env.NEXT_PUBLIC_KNOCK_GUIDE_CHANNEL_ID}
readyToTarget
listenForUpdates
>
{children}
</KnockGuideProvider>
</KnockProvider>
各値の取得元
-
まず認証し、次に環境を確認します — Knock は環境ごとにスコープが分かれています。CLI コマンドを実行する前に、
knock whoamiで CLI が認証済みであることを確認します。エラーが発生した場合は、knock loginを実行し、ユーザーがブラウザーのフローを完了するまで待ちます。次にknock environment listを実行し、対象のスラッグ(production、development、…)をユーザーに確認します。それ以降の環境スコープのknockコマンドには、すべて--environment <env-slug>を指定します。CLI のデフォルトであるdevelopmentに頼らないでください。 -
apiKey— Knock ダッシュボード → Platform → API keys → 選択した環境のタブにある公開pk_...キー(先にダッシュボードの環境セレクターで環境を切り替えます。正しい環境のキーをコピーするようユーザーに伝えてください) -
user.id— 認証コンテキストの値です。バックエンドからユーザーを識別するときに使用する ID と一致している必要があります -
channelId— ガイドチャンネルのキーではなく、その UUID です。チャンネルはアカウントのスコープに属するため、knock channel listに--environmentは不要です。ユーザーに尋ねる前に、必ず CLI での検索を試してください:knock channel list --json | jq -r '.[] | select(.key == "knock-guide") | .id'UUID が出力された場合は、そのまま使用してください。確認を求める必要はありません。デフォルトのガイドチャンネルキーは
knock-guide(タイプはin_app_guide)です。CLI が何も返さないかエラーになった場合に限り、ダッシュボード(Settings → Integrations → Channels)を確認してください。手順の詳細はrules/setup-guide-providers-react.mdをご覧ください。
フックの概要
useGuide({ type })— メッセージタイプで指定したガイドを1つ取得しますuseGuide({ key })— キーで指定した特定のガイドを1つ取得しますuseGuides({ type })— メッセージタイプで指定したガイドの配列を取得しますuseGuideContext()— 低レベルのクライアントアクセスを提供します
エンゲージメントメソッド
step.markAsSeen()— インプレッション(stepをキーにしたuseEffectから呼び出します)step.markAsInteracted()— 主要なアクションstep.markAsArchived()— 却下。以降、このユーザーにはガイドが表示されなくなります
問題が発生したときの最初の確認事項
任意の URL に ?knock_guide_toolbar=true を追加してください。ツールバーには、すべてのガイド、アクティブなガイド、対象ユーザーが利用できるガイド、その他のガイドが除外された理由が表示されます。
ベストプラクティスのまとめ
- 適切なプロダクトを選びます。 時系列のリストにはフィード、対象を絞った UI にはガイドを使用します。
- プロバイダーはツリーの高い位置に一度だけマウントします。 認証の境界内で、ガイドを表示するルートより上に配置します。
- プレースホルダーのユーザーは決して渡さないでください。
KnockProviderをマウントする前に、認証が完了するまで待ちます。 - ターゲティングルールが依存する非同期データに合わせて
readyToTargetを制御します。 - コンテンツに型を付けます。
useGuide<T>は Knock のメッセージタイプのスキーマに対応させます。 - エンゲージメントを必ず処理します。 カスタムコンポーネントでは、
markAsSeen、markAsInteracted、markAsArchivedをそれぞれ呼び出す必要があります。 - まずツールバーを使います。 「ガイドが表示されない」という問題の多くは、数秒で原因がわかります。