● New: build your backend and app together with AI. Point Claude or Cursor at AppAmbit over MCP.
On mobile?
Email yourself the setup link so you can finish when you're at your computer.
✓ Email sent! Check your inbox.
× Failed to send. Please try again.
⏱ Too many attempts. Please wait a few minutes and try again.
iOS · Swift & Objective-C
One line at launch. Read the crash, not the addresses.
Add the SDK, call AppAmbit.start(appKey:) once, and your app reports sessions, screens and crashes on its own. Upload the dSYM for a build and the wall of memory addresses turns back into your own functions and line numbers.
That is the whole surface. The key that makes those calls report takes a minute to create.
Crashes you can read
An address is not a bug report. Give it the dSYM.
A release build strips the names out. What arrives is a thread backtrace of memory addresses, which tells you nothing on its own. Upload the dSYM archive for that build and AppAmbit resolves your frames back into functions and line numbers.
01
Upload the dSYM for that build
Drop the archive on the crash in your dashboard. It is stored against that version, so every crash from the same build can use it.
02
Symbolicate the crash
AppAmbit pulls the DWARF file out of the archive, checks it belongs to the same binary as the crash, and resolves your addresses. You get a notification when it finishes.
03
Read it, or take it with you
The symbolicated report opens in the dashboard and downloads as text, so it can go straight into an issue.
Handled errors from Crashes.logError arrive readable already. Symbolication is for the native crash reports, where the frames are addresses. More on crash monitoring.
Upload a dSYM once and the next crash arrives with your own function names on it.
Session timeline
Screen changes are recorded without you writing them.
The SDK records screen-change breadcrumbs by itself, and the session timeline stitches them together with app lifecycle, connectivity changes, your own events and any errors. When a crash arrives, the run-up to it is already attached.
The one thing worth doing is naming your screens, so the trail reads like your app instead of like a class list.
Everything on this row is included, on the same App Key and the same free tier.
Build delivery
Your testers get the build the minute CI is green.
Connect the repository once and each pipeline hands its .ipa to AppAmbit with the branch, commit and author attached. Testers install from a link, and the crashes they hit land in the same place as everything else.
Connect the repository, and testers install from a link instead of waiting on a store.
Setup
Three steps, and you are reporting.
Create your app in the dashboard to get an App Key, then touch three files in Xcode. There is no wrapper to write and no build phase to add.
01
Add the SDK
Either package manager, both from the same source. In Xcode it is File > Add Package Dependencies with the repository URL, Up to Next Major Version from 1.2.0. With CocoaPods 1.10 or later it is one line in the Podfile, then pod install.
One call with the App Key from your app's Info page. Sessions, device information, screen breadcrumbs and crash reporting begin from there.
AppDelegate.swiftAppDelegate.m
import AppAmbit// in your App init(), or in didFinishLaunchingWithOptionsAppAmbit.start(appKey: "<YOUR-APPKEY>")
#import"AppAmbitSdk/AppAmbitSdk-Swift.h"// in application:didFinishLaunchingWithOptions:[AppAmbit startWithAppKey:@"<YOUR-APPKEY>"];
Pick one and stay with it: the two package managers are not meant to sit in the same target. On the CocoaPods route, pod install and open the .xcworkspace from there on. The full walkthrough is in the getting started guide.
Step one is a free account. The other two take about five minutes.
Push notifications
One more pod, not another vendor.
Push runs on the same App Key and the same install. You bring the APNs credentials from your Apple Developer account, AppAmbit keeps the device tokens, and you send from the dashboard or from a Cloud Code function.
Add AppAmbitPushNotifications next to the core library, the pod or the package product. Push needs Xcode 16 and Swift 6, a step above the core SDK.
Turn on the Push Notifications capability for the target. Without the aps-environment entitlement no token is ever delivered.
In SwiftUI, adopt AppAmbitAppDelegate with @UIApplicationDelegateAdaptor so the SDK sees the APNs callbacks. UIKit keeps its own delegate.
import AppAmbitimport AppAmbitPushNotifications// in your App init(), or in didFinishLaunchingWithOptionsPushNotifications.start()AppAmbit.start(appKey: "<YOUR-APPKEY>")// ask when the moment makes sense, not at first launchPushNotifications.requestNotificationPermission { granted inif granted { PushNotifications.setNotificationsEnabled(true) }}
Objective-C is the same two calls, from didFinishLaunchingWithOptions.
Your own credentials, the tokens already tied to your App Key, and no second vendor to sign with.
Questions
Answered straight.
Does AppAmbit work with SwiftUI and UIKit?
Yes. The SDK is a plain iOS framework that you start once at launch, so it does not care which framework draws your screens. In SwiftUI you call AppAmbit.start(appKey:) from your App init, in UIKit from application(_:didFinishLaunchingWithOptions:), and the analytics and crash APIs are identical from there on.
How does dSYM symbolication actually work?
A crash arrives as an iOS crash report full of memory addresses. You upload the dSYM archive for that build, then symbolicate the crash from the dashboard. AppAmbit pulls the DWARF file out of the archive, checks it belongs to the same binary as the crash, resolves the addresses of your app into function names and line numbers, and notifies you when it is done. You can read the symbolicated report in the dashboard or download it as text.
Does it integrate with TestFlight?
No, and it is worth being clear about that. AppAmbit distributes builds itself: your pipeline sends the .ipa and your testers install it from a link, with the branch, commit and author attached. Treat it as an alternative for internal builds rather than an integration with TestFlight.
Can I use it from Objective-C?
Yes. Import AppAmbitSdk/AppAmbitSdk-Swift.h and call [AppAmbit startWithAppKey:@"<YOUR-APPKEY>"]. The analytics and crash APIs are available from Objective-C too, and every snippet in the documentation is shown in both languages.
What is the minimum iOS version?
iOS 12.0 and up, built with Xcode 13 or later. You can add the SDK with Swift Package Manager or with CocoaPods 1.10 or later, where the pod is called AppAmbitSdk. The source is on GitHub.
Can I keep my current crash reporter alongside it?
No, and that is true of any pair of crash reporters. Two libraries installing handlers for the same signals will fight over them, and you end up with reports missing from both. Remove the other one before you ship AppAmbit.
What happens when the device has no connection?
Nothing is lost. Sessions, events, logs and crashes are written to local storage while the device is offline, and the SDK sends everything that queued up in batches once connectivity returns. A crash is written to disk and sent on the next launch.
Building for the other platforms too? AppAmbit has an SDK for Android, React Native, Flutter, .NET MAUI, .NET and Avalonia. Each one takes its own App Key and reports into the same dashboard, on the same team and the same bill.
The free tier is enough to point the SDK at a real build and read your own sessions.
Ready when you are
Write the line. Watch the first session land.
Create a free account, paste your App Key into your App init, and run the app. The first session shows up while the simulator is still open, and the next crash comes back with your own file names on it. Swift or Objective-C, iOS 12 and up, no credit card.