ドキュメント

iOS SDK

Respondo のサポートチャットのための、サードパーティ依存関係ゼロのネイティブ Swift・SwiftUI クライアント。

要件#

  • iOS 15.0+(iOS 16+ ではより細かいシートのディテント、それ以下ではシステムのフォールバック)。
  • Swift 5.9+。
  • サードパーティ依存関係ゼロ——Foundation、Swift Concurrency、SwiftUI、UIKit のみ。

依存するのは RespondoSDK プロダクトで、これがクロスプラットフォームの RespondoCore を再エクスポートします。

インストール#

Swift Package Manager でパッケージを追加します。Xcode では: File → Add Package Dependencies… を開き、 https://github.com/respondo-app/sdk-iosを入力するか、自分の Package.swift に宣言し、 RespondoSDK プロダクトに依存させます。

Package.swiftswift
dependencies: [
    .package(url: "https://github.com/respondo-app/sdk-ios", from: "0.1.0")
],
targets: [
    .target(
        name: "MyApp",
        dependencies: [
            .product(name: "RespondoSDK", package: "sdk-ios")
        ]
    )
]

続いてコードでインポートします:

Swiftswift
import RespondoSDK

初期化#

起動時に一度初期化し、その後はどこでも Respondo.open() を呼び出します。ライフサイクルメソッドは initialize です( init という語は言語によって予約されています)。

MyApp.swiftswift
import SwiftUI
import RespondoSDK

@main
struct MyApp: App {
    init() {
        Respondo.initialize(
            RespondoConfig(
                agentId: "<agent-uuid>",
                channelId: "<channel-uuid>"
                // baseUrl が nil -> https://api.respondo.ai
            )
        )
    }

    var body: some Scene {
        WindowGroup {
            Button("Support") { Respondo.open() }
        }
    }
}

Respondo ファサードはスレッドセーフです。 initialize の直後に行われた呼び出しはキューに入れられ、非同期の初期化が完了すると適用されます。

ユーザーの識別#

デフォルトではすべての訪問者は匿名です。初回起動時に SDK は安定した visitor_id を生成してキーチェーンに保持するため、再訪したユーザーは自分の会話を再び見つけられます。埋め込む API キーはありません——各会話は、バックエンドが発行しメッセージごとに前へスライドさせる会話ごとのセッショントークンで保護されるため、匿名の訪問者が再認証する必要は決してありません。

ユーザーがサインインしたら identify を一度呼び出します。これにより実際の身元が紐づけられ、履歴が複数デバイスや再インストールをまたいで追随し、受信トレイでは匿名の訪問者ではなく名前とメールアドレスが会話の横に表示されます。

userHash はあなたのバックエンドがエージェントの identity_secret から計算する署名です—— HMAC-SHA256(secret, userId) (userId がない場合はメールアドレス)を小文字の hex でエンコードします。シークレットは身元が本物であることを証明するため、あなたのバックエンドにのみ置き、アプリに同梱してはいけません。完全な数式とサーバー側の例については本人確認のページを参照してください。

Swiftswift
// userHash はバックエンドから受け取る(userId に対する HMAC-SHA256)——
// アプリ内で計算しないこと。
Respondo.identify(
    RespondoIdentity(
        userId: session.userId,
        email: session.email,
        name: session.fullName,
        userHash: session.respondoUserHash
    )
)

// ログアウト時:セッションを失効させ、新しい匿名訪問者を開始する。
Respondo.reset()

ハッシュが欠けているか誤っていても、例外は投げられません。バックエンドは黙って訪問者を匿名のまま保ち、チャットは動作し続け、有効なハッシュが供給されるまで単にデバイス間のリンクが失われるだけです。検証はエージェントに identity_secret が設定されている場合にのみ実行されます——開発中は空のままにしておけば userId / メールアドレスはそのまま受け入れられます。

監視可能な値とデリゲート#

状態は同期的なゲッター、リアクティブな AsyncStream、または RespondoDelegate を通じて読み取れます。ストリームとデリゲートのコールバックはメインアクター上に届きます。

Swiftswift
// 未読数のリアクティブなストリーム。
Task {
    for await count in Respondo.unreadCountStream {
        updateBadge(count)
    }
}

// バッジとディープリンクのフォールバック向けのデリゲート。
final class SupportCoordinator: RespondoDelegate {
    init() { Respondo.delegate = self }
    func respondoUnreadChanged(_ count: Int) {
        UIApplication.shared.applicationIconBadgeNumber = count
    }
}

画面のトラッキング#

ナビゲーションのたびに現在の画面を報告すると、プロアクティブなティーザーとページ単位のターゲティングがそれに一致できるようになります(static func setCurrentScreen(_ name: String?))。nil を渡すとクリアされます。変更のたびに、新しい画面に対してプロアクティブティーザーが再評価されます。

Swiftswift
Respondo.setCurrentScreen("pricing")

次のステップ#

プッシュ通知と本人確認を組み込みましょう。UIKit ラッパーの RespondoChatViewController、完全なデリゲートサーフェス、トラブルシューティングは iOS SDK のスタートガイドで扱っています。SDK のソースは GitHubで公開されています。