Zum Hauptinhalt springen
DokumentationiOS
Version 0.2.0iOS 15.1 oder höher

Das DobroDesk iOS-SDK integrieren

Fügen Sie das signierte Swift Package hinzu, erstellen Sie den nativen Client und zeigen Sie das gemeinsame Widget aus einem View Controller an.

Auf dieser Seite

Ihre iOS-App zeigt das native DobroDesk-Widget mit kontogebundenem dauerhaftem Zustand und Systemeinstellungen für Bewegung.

Veröffentlichtes Swift Package hinzufügen

Fügen Sie in Xcode das Paket-Repository https://github.com/comstud-io/dobrodesk-mobile-sdk.git für den Release 0.2.0 hinzu und nehmen Sie DobroDeskSDK und DobroDeskUI in das App-Target auf. Das Binärpaket unterstützt iOS 15.1 und neuer. Der Release enthält nur Artefakte. Der Quellcode der nativen Implementierung ist nicht enthalten.

Swift Package
https://github.com/comstud-io/dobrodesk-mobile-sdk.git

Nativen Client initialisieren und anzeigen

Die App muss über credentialProvider ein kurzlebiges Kundenidentitäts-JWT liefern. Native Authentifizierung erfordert einen signierten Benutzer: Verwenden Sie ein Backend des Hosts und liefern Sie weder Signier-Geheimnis noch Support-API-Token in der App aus.

Bei strikter Swift-6-Konkurrenz deklarieren Sie den Host-Loader als @Sendable () async throws -> String und übergeben diese Closure an credentialProvider.

Swift-Präsentation
import Foundation
import UIKit
import DobroDeskSDK
import DobroDeskUI

let loadDobroDeskToken: @Sendable () async throws -> String = {
  // Replace this placeholder with a request to your host backend.
  "short-lived-token-from-host-backend"
}

let client = try DobroDeskClient(
  configuration: DobroDeskConfiguration(
    apiOrigin: URL(string: "https://dobrodesk.com")!,
    integrationId: "wgt_0123456789abcdef0123456789abcdef",
    accountScope: currentCustomer.id,
    locale: "en",
    credentialProvider: loadDobroDeskToken,
    pollInterval: 1
  )
)

try await DobroDeskWidgetBridgePresenter.shared.present(
  client: client,
  options: ["locale": "en"],
  from: viewController
)

Eigenen Trigger oder Inline-Fläche verwenden

Verwenden Sie für eine Inline-Fläche eine eigene UIView mit Constraints für safeArea top, leading und trailing sowie einer bottom-Verknüpfung mit der keyboardLayoutGuide. Setzen Sie eine anfängliche Höhe von 560 Punkten mit priority .defaultHigh und mounten Sie erst nach der Verbindung mit window. Erstellen Sie pro Mount einen eigenen Presenter, damit ein fehlgeschlagener oder veralteter close nicht eine andere Fläche schließt.

Der eigene Button bleibt per Tastatur erreichbar und erhält aria-controls sowie aria-expanded. Der Host-Wrapper sollte Fehler von embed mit do/catch abfangen und an seinen eigenen typisierten onError-Callback für die Wiederherstellungsanzeige weiterleiten. Verwenden Sie beim erneuten Mounten denselben Client, dieselbe Sitzung und denselben Entwurf.

Die Inline-APIs gehören zu den veröffentlichten Mobile-SDK-0.2.0-Artefakten. Verwenden Sie die Inline-Fläche, wenn der Host die Platzierung steuert, und die modale Darstellung für einen vom Host verwalteten Vollbildablauf.

Inline-Integration
import UIKit
import DobroDeskSDK
import DobroDeskUI

@MainActor
final class SupportPanelHost {
  private let client: DobroDeskClient
  private weak var parent: UIViewController?
  private let onError: (Error) -> Void
  private let supportContainer = UIView()
  private var presenter: DobroDeskWidgetBridgePresenter?
  private var mountTask: Task<Void, Never>?
  private var mountGeneration = 0
  private var isMounted = false

  init(
    client: DobroDeskClient,
    parent: UIViewController,
    onError: @escaping (Error) -> Void
  ) {
    self.client = client
    self.parent = parent
    self.onError = onError
    supportContainer.translatesAutoresizingMaskIntoConstraints = false
    parent.view.addSubview(supportContainer)
    let safeArea = parent.view.safeAreaLayoutGuide
    let keyboardGuide = parent.view.keyboardLayoutGuide
    let height = supportContainer.heightAnchor.constraint(equalToConstant: 560)
    height.priority = .defaultHigh
    NSLayoutConstraint.activate([
      supportContainer.topAnchor.constraint(equalTo: safeArea.topAnchor),
      supportContainer.leadingAnchor.constraint(equalTo: safeArea.leadingAnchor),
      supportContainer.trailingAnchor.constraint(equalTo: safeArea.trailingAnchor),
      supportContainer.bottomAnchor.constraint(equalTo: keyboardGuide.topAnchor),
      height,
    ])
  }

  func mountAfterAppearance() {
    guard mountTask == nil, !isMounted, let parent, supportContainer.window != nil else { return }
    mountGeneration += 1
    let generation = mountGeneration
    let mountPresenter = DobroDeskWidgetBridgePresenter()
    let client = self.client
    let supportContainer = self.supportContainer
    presenter = mountPresenter
    mountTask = Task { @MainActor [weak self] in
      defer {
        if let self, self.mountGeneration == generation {
          self.mountTask = nil
        }
      }
      do {
        try await mountPresenter.embed(
          client: client,
          options: ["locale": "en", "view": "home"],
          in: supportContainer,
          parent: parent
        )
        guard let self, self.mountGeneration == generation else {
          mountPresenter.close()
          return
        }
        isMounted = true
      } catch {
        guard let self, self.mountGeneration == generation else { return }
        mountPresenter.close()
        presenter = nil
        onError(error)
      }
    }
  }

  func setVisible(_ visible: Bool) {
    guard isMounted else { return }
    presenter?.setEmbeddedVisible(visible)
  }

  func close() {
    mountGeneration += 1
    mountTask?.cancel()
    mountTask = nil
    presenter?.close()
    presenter = nil
    isMounted = false
  }
}

Präsentation und Konto-Lebenszyklus ausdrücklich behandeln

Präsentieren Sie aus einem sichtbaren UIViewController und rufen Sie close auf, wenn der Host-Bildschirm verworfen wird. Rufen Sie client.resetSession() auf, wenn die Kundin oder der Kunde die Unterhaltung bewusst verwirft. Der direkte iOS-Client hat kein logout: Setzen Sie ihn zurück, verwerfen Sie ihn und erstellen Sie vor einer Änderung von accountScope einen neuen Client.

Der native Presenter verwendet denselben Widget-Designvertrag wie das Web-Widget. Lassen Sie reduceMotion weg, sofern die Kundin oder der Kunde keine ausdrückliche Einstellung in der App getroffen hat. Die Systemeinstellung für reduzierte Bewegung bleibt maßgeblich.

Laden, Sichtbarkeit und Barrierefreiheit behandeln

Nutzen Sie Loading-Hooks oder typisierte Events für den Ladezustand des Hosts. Die Oberfläche zeigt Nachrichtenladen, Warten und Wiederholungen selbst an, damit kein zweiter Spinner das Eingabefeld überlagert.

Verbergen oder zeigen Sie die Oberfläche bei einer vorübergehenden Navigation und behalten Sie den Client. Das Widget respektiert die Systemoptionen für reduzierte Bewegung. Ein Entfernen oder Schließen verwirft weder Sitzung noch Entwurf.

  1. Verwenden Sie beim erneuten Mounten denselben Client und feste Host-Abmessungen.
  2. Verwenden Sie die Sichtbarkeitsfunktion für vorübergehendes Ausblenden und keine Session-Reset-Funktion.
  3. Beenden Sie die Sitzung erst bei Logout oder einem bewussten Kontowechsel.

iOS-Ablauf prüfen

  1. Öffnen Sie das Widget von einem sichtbaren Bildschirm und prüfen Sie, dass ein doppeltes Tippen auf die Schaltfläche keinen zweiten Controller erzeugt.
  2. Starten Sie eine Unterhaltung, schließen und öffnen Sie das Widget erneut und prüfen Sie, dass Entwurf und ausstehender Versand an dasselbe Konto gebunden bleiben.
  3. Drehen Sie die App oder schicken Sie sie während einer ausstehenden Operation in den Hintergrund und warten Sie auf den ausdrücklichen Wiederverbinden- oder Wiederholungszustand, bevor Sie erneut versuchen.
  4. Setzen Sie den direkten Client vor dem Kontowechsel zurück und verwerfen Sie ihn. Erstellen Sie danach den nächsten Client und prüfen Sie, dass er die vorherige Unterhaltung nicht sehen kann.

Vorschau der nativen SDKs

Sehen Sie denselben Support-Ablauf mit nativen Steuerelementen für iOS und Android.

Nativer iOS-SDK-Chat von DobroDesk mit Supportnachricht, Eingabefeld und unterer Navigation
iOS SDK: Support-Konversation mit nativer Eingabe und Tab-Leiste.