Skip to content

Embed the widget in mobile apps

Collect feedback directly inside your native iOS and Android apps. The mobile SDKs wrap the web widget in a native WebView with a floating trigger button, user identification, and event callbacks — the same experience as the web widget, optimized for mobile.

iOS

Requirements

  • iOS 15+
  • Swift 5.9+

Install with Swift Package Manager

In Xcode, go to File → Add Package Dependencies and enter:

https://github.com/QuackbackIO/quackback-ios

Or add it to your Package.swift:

dependencies: [
    .package(url: "https://github.com/QuackbackIO/quackback-ios", from: "1.0.0"),
],
targets: [
    .target(name: "YourApp", dependencies: ["Quackback"]),
]

Configure and identify

import Quackback
 
// 1. Configure once at app startup
Quackback.configure(QuackbackConfig(
    appId: "your-app-id",
    baseURL: URL(string: "https://feedback.yourapp.com")!,
    locale: "fr"  // optional — omit to auto-detect
))
 
// 2. Identify the current user
Quackback.identify(userId: "user_123", email: "user@example.com", name: "Jane Smith")
 
// 3. Show the floating trigger button
Quackback.showTrigger()

Configuration options

QuackbackConfig(
    appId: String,                              // required
    baseURL: URL,                               // required
    theme: QuackbackTheme = .system,            // .light | .dark | .system
    position: QuackbackPosition = .bottomRight, // .bottomRight | .bottomLeft
    buttonColor: String? = nil,                 // hex e.g. "#6366F1"
    locale: String? = nil                       // "en", "fr", "de", "es", "ar"
)

Open programmatically

Quackback.open()                         // default view
Quackback.open(board: "feature-requests") // specific board

Listen to events

let token = Quackback.on(.vote) { data in
    print("Voted on post:", data["postId"] ?? "")
}
 
// Stop listening
Quackback.off(token)
EventPayload keysDescription
.readyWidget loaded
.votepostId, directionUser voted
.submitpostId, titleUser submitted feedback
.closePanel dismissed

Clean up

Quackback.logout()   // clear identity
Quackback.destroy()  // tear down SDK entirely

Android

Requirements

  • Android API 24+
  • AndroidX

Install with Gradle

Add to your module's build.gradle.kts:

dependencies {
    implementation("com.quackback:sdk:0.1.0")
}

Configure and identify

// In your Application class
class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        Quackback.configure(
            context = this,
            config = QuackbackConfig(
                appId = "your-app-id",
                baseURL = "https://feedback.yourapp.com"
            )
        )
    }
}
 
// After user signs in
Quackback.identify(
    userId = "user_123",
    email = "user@example.com",
    name = "Jane Smith"
)
 
// Show the trigger button in your Activity
Quackback.showTrigger()

Configuration options

PropertyTypeDefaultDescription
appIdStringrequiredYour Quackback app ID
baseURLStringrequiredYour Quackback instance URL
themeQuackbackThemeSYSTEMLIGHT, DARK, or SYSTEM
positionQuackbackPositionBOTTOM_RIGHTBOTTOM_RIGHT or BOTTOM_LEFT
localeString?nullForce a locale ("en", "fr", "de", "es", "ar")

Open programmatically

Quackback.open()
Quackback.open(board = "feature-requests")

Listen to events

val token = Quackback.on(QuackbackEvent.VOTE) { data ->
    Log.d("Quackback", "Voted on: ${data["postId"]}")
}
 
Quackback.off(token)

Clean up

Quackback.logout()   // clear identity
Quackback.destroy()  // tear down SDK

Locale passthrough

Both SDKs pass the locale to the widget via URL parameter and postMessage, so the widget renders in the correct language on the first frame with no flicker. If you omit locale, the widget auto-detects from the device language.

The widget currently supports English, French, German, Spanish, and Arabic. If the device language isn't supported, the widget falls back to English.

Next steps