iOS SDK
Feedback tickets and store-then-send crash reporting for iOS (the Hands CocoaPod).
Hands is the iOS SDK for Hands: in-app feedback tickets and crash reporting posted to a Hands server's public feedback endpoint. Objective-C, no dependencies, iOS 14.1+.
Install (CocoaPods, via git)
pod 'Hands', :git => 'https://github.com/botiverse/hands.git', :tag => 'ios-v0.2.1'
Configure & start
All configuration is runtime parameters — the SDK ships nothing app-specific. Get the client key from your app's Settings tab in the Hands console (Sentry-DSN model: it identifies the app and ships in the bundle; rotate it from the console if it leaks).
import Hands
Hands.install(with: HandsConfig(
baseUrl: "https://hands.build",
appSlug: "my-app",
channel: "main", // Hands release-channel routing field
clientKey: "qk_…"
))
install(with:) installs the crash handlers and uploads any pending crash reports a few seconds after launch. Call it as early as possible (app init).
Feedback
Hands.submitFeedback(
"Feed doesn't refresh after login.",
kind: "bug", // "feedback" | "bug" | "crash"
attachmentPaths: [logFilePath], // up to 3 files, 10 MB each
extras: nil
) { ticketId, error in … }
Device metadata (version, model, OS, arch, locale, per-install device id) is attached automatically.
Hands.install(with:) also sends a throttled launch/install metrics ping for active-device and version-distribution analytics. It carries no PII beyond the random per-install Hands device id and build/OS metadata, and should not be treated as a true online heartbeat.
Crash reporting
Hands.install(with:) captures uncaught NSExceptions and fatal signals and uploads them as kind=crash tickets, grouped by signature in the console. Nothing else to wire.
Notes
- The client key (
qk_…) authenticates feedback/crash submissions. It ships inside the app bundle (Sentry-DSN model — app identifier, not a user secret); it is never logged or included in diagnostics exports. - The device id is a random UUID, not a hardware id; it resets on reinstall.